1

関数内でglobal-set-keyを呼び出し、引数を指定して、global-set-keysを作成したいと思います。

(defun global-setter (arg1 arg2)
 (global-set-key arg1 '(concat "example" arg1 arg2))
)

(global-setter "*" "^")

これにより、を押す*と関数example-*^が呼び出されるバインディングが作成されます。

文字列を関数/コマンド名として渡す方法がわかりません。私は何が間違っているのですか?

これまで、、、の組み合わせを試しましたが`',@、どうすればよいかわかりません。(intern)(eval)(function)

4

2 に答える 2

2

コードが機能しない理由の 1 つは、 (concat ..) 式を引用して評価されないためです。また、global-set-key にはラムダまたはシンボルが必要です。

intern を使用してシンボルを構築し、そのシンボルを set-key に提供できます。

(defun my-test () (interactive) (message "ok"))
(global-set-key "\C-c!" (intern (concat "my" "-" "test")))

global-set-key および variants を介して呼び出される関数はすべてinteractiveでなければならないことに注意してください。

于 2013-02-19T09:35:34.147 に答える
0

定義された環境から値を参照する無名関数であるクロージャーlexical-letを定義するために使用します。

(defun global-setter (arg1 arg2)
  (lexical-let ((arg1 arg1) (arg2 arg2))
    (global-set-key arg1 (lambda ()
                           (interactive)
                           (concat "example" arg1 arg2)))))

Emacs 24はレキシカル バインディングとクロージャをネイティブにサポートするlexical-letため、不要になりました。

(defun global-setter (arg1 arg2)
  (global-set-key arg1 (lambda ()
                         (interactive)
                         (concat "example" arg1 arg2))))

これを機能させるには、必ず に設定lexical-bindingし、これをファイルの最後に追加して、バイトコンパイルに字句バインディングが使用されるようにtしてください。.emacs

;; Local Variables:
;; lexical-binding: t
;; End:
于 2013-02-19T09:35:02.097 に答える