7

私はemacsを初めて使用しますが、実際に何ができるか、そしてどれだけの時間を節約できるかにショックを受けました(Macrosは多くの時間を節約します)。しかし、ユーザーに入力を求め、それに基づいてコードを実行するステップベースのスクリプトを作成できるのではないかと思っていました。たとえば、次のようなプロンプトが表示されるようにSQLクエリを作成したい場合があります。

>table name?
myTable
>type of query (select, insert, update, delete)
select
>fields to get
name, id
>Result query is "select (name, id) from myTable"

これはアイデアの概要に過ぎませんが、このようなものがあれば便利なのでと思いました。誰かがAWKスクリプトについて言及しましたが、それが樹皮を剥ぐのに適切なツリーであるかどうかはわかりませんでした。私はWindowsを使用していますが、それはそれほど重要ではないと思います。

私は間違いなくこれに関する情報に感謝します、ありがとう

4

6 に答える 6

7

emacswikiのこの小さなハックを参照してください:キーボードマクロ実行中のプロンプトC-x qそれ以外の場合は、いつでもマクロを一時停止して、定義中に指定したポイントにテキスト実行を挿入できます。バリエーションを使用したマクロの実行を参照してください。最後に、関数を定義し、インタラクティブを使用して必要なパラメーターを取得できます。

(defun my-build-query (table type field)
  (interactive "sTable name: \nsType of query: \nsFields to get: ")
  (message "%s (%s) from %s" type fields table)
)

この関数をに入れて、~/.emacsで実行できますM-x: my-build-query

これがあなたに始めるためのいくつかの指針を与えることを願っています!

PS:ああ、そしてもう1つのアイデア。この種のもののおそらくより簡単なアプローチは、YASnippetを使用することです(ページのスクリーンキャストを見てください)。

于 2010-02-10T10:47:30.137 に答える
2

Emacs Lisp、別名elispを使用して、read-from-minibufferを使用できます。

于 2010-02-10T10:21:44.203 に答える
2

たとえば、awkで。

BEGIN{
while (1){
    printf "Enter table name: "
    getline tablename
    printf "Enter type of query: (s)elect, (i)nsert, (u)pdate, (d)elete, (q)uit: "
    getline querytype
    if ( querytype ~ /^q|Q$/) { exit}
    printf "Enter fields to get (field1,..): "
    getline fields
    sql=querytype" ("fields") from " tablename
    print "Result query is " sql
    printf "Do you want to execute query??: (yY)es, (nN)o"
    getline choice
    if ( choice ~ /^y|Y$/) {
    # use sql cmd here
    }
 }
}

myscript.awkとしてコマンドラインに保存

 c:\test> gawk -f myscript.awk
于 2010-02-10T10:25:15.867 に答える
1

正しいことは、バッファ内でプロンプトとユーザー入力を可能にするreadlineのような関数を作成することだと思います。

これは、実装するのは簡単ですが、本当に楽しい方法で実行するのは難しいことの1つです。これを行うための再利用可能なelispコードはおそらくそこにありますが、私にはわかりません。

于 2010-02-10T13:02:53.533 に答える
1

開始するための基本的な実装は次のとおりです。

(defun prompt-for-sql-statement (table type fields)
  (interactive
   (list
    (read-from-minibuffer "Table name? ")
    (completing-read "Type of statement? " '("select" "insert" "update" "delete"))
    (let (field fields (index 1))
      (while (not (string= "" (setq field (read-from-minibuffer (format "Field #%d: " index)))))
        (setq fields (cons field fields) index (1+ index)))
      (mapconcat 'identity (nreverse fields) ", "))))
  (insert type " (" fields ") from " table))

入力M-x prompt-for-sql-statementする(またはコマンドをバインドしたキーシーケンスを入力する)と、一連のプロンプトが表示されます。

Table name? myTable
Type of statement? select
Field #1: foo
Field #2: bar
Field #3: baz
Field #4:

ステートメントタイプでタブ補完を行うことができ、空のフィールドはリストを終了します。次に、関数は、コマンドを呼び出したときのポイントがどこにあっても、構築されたSQLステートメントを挿入します。

記述されたコマンドは、すべてSELECTのように見えるSQLステートメントを生成します(「select ... from table」、「insert ... fromtable」など)。よりスマートな実装は、SQLステートメントのタイプごとに正しい構文を生成する方法を知っています。

于 2010-02-10T15:57:24.320 に答える
1

別の可能性は、おそらく略語と組み合わされたスケルトンまたは他のemacsテンプレート(おそらくテンポ?)である可能性があります

于 2010-02-10T16:19:03.243 に答える