2

emacs lisp には、式の結果を評価し、結果を直接バッファに貼り付けることができる非常に便利な機能があります。

追加作業を確認したいとします。次に、次のように入力します。

(* 3 2)

キーボード マクロを定義します。

(setq last-kbd-macro
   [down ?\( ?i ?s ?= ?  ?\C-\M-f ?  ?\C-u ?\C-x ?\C-e ?\) home])

次に、式の上にポイントを置き、F4 キーを押してマクロを実行すると、式は次のようになります。

(is= (* 3 2) 6)

これは素晴らしい回帰テストになります。

残念ながら、clojure/nrepl バッファーで同じキーボード マクロを実行すると、次のようになります。

(* 8 9)(is=  )

およびシンボルを解決できないという clojure からのエラーis=

そのため、物事の順序付けに何か奇妙なことが起こっていると思います。マクロは間違ったものを評価しようとしています。

誰でもこれをclojureで動作させることができますか? (実際、一般的な問題を解決して、任意のキーボード マクロC-u C-x C-eが emacs lisp と同じように正常に動作するようにします)


人々は誤解しているように見えるので編集してください:

手動でキーを押すと、elisp または clojure バッファーのいずれかで問題なく動作します。1 つの Cu Cx Ce evals では emacs lisp を使用し、他の evals では外部の clojure プロセスを使用します。

この問題は、Cu Cx Ce を含むキーボード マクロ (clojure バッファーに記録されている) を実行しようとしたときに発生します。

clojure バッファーでマクロを実行すると、どういうわけか順序が変更されます。eval-paste がまだ完了していなくても、マクロは実行を続けているようです。

キーボード マクロ (または対応する関数) を手動で実行するのと同じ順序で強制的に実行する方法があるかどうか疑問に思っていました。

必要に応じて、キーボード マクロを適切な elisp 関数に変更できることを非常にうれしく思います。

4

2 に答える 2

1

キーボード マクロは、特定の一連のアクションを繰り返す手っ取り早い方法です。それらは、呼び出された関数ではなく、押されたキーを覚えているため、非常に壊れやすく、呼び出されたバッファ、現在のコマンド履歴、ウィンドウ構成などに応じて、非常に異なる結果を生成する可能性があります。

あなたの場合、マクロのキーの 1 つが、マクロをテストしたバッファーとは異なるコマンドを clojure/nrepl バッファーで呼び出す可能性があります。マクロを使用するバッファにマクロを定義する必要があります。

マクロを再利用する場合は、マクロをいじる代わりに、必要なことを実行する emacs lisp 関数を作成することをお勧めします。

の出力が(format-kbd-macro nil t)役立つ場合がありますが、関数のようなコマンドを使用しないでください。現在のバッファーに挿入する代わりに、評価結果を返すeval-last-sexp下位レベルの関数を使用してください。

于 2013-02-19T14:49:43.560 に答える
1

まだ直面していないが、すぐに直面する問題への対処: 式の評価結果の前に文字を挿入することを忘れないでください: し'たい(= (cons 1 nil) '(1))ではなく(= (cons 1 nil) (1)).

于 2013-02-19T21:41:41.860 に答える