我想在函数中调用global-set-key,为其创建参数,以创建全局集密钥。
(defun global-setter (arg1 arg2)
(global-set-key arg1 '(concat "example" arg1 arg2))
)
(global-setter "*" "^")
这应该创建绑定,当按*
时,应该调用函数example-*^
。
我无法弄清楚如何将字符串作为函数/命令名传递。我究竟做错了什么?
到目前为止,我尝试过`',@
,(intern)
,(eval)
,(function)
的组合,但我不知道自己应该做些什么。
答案 0 :(得分:2)
您的代码不起作用的一个原因是因为您引用了(concat ..)表达式,因此它永远不会被评估。而global-set-key需要一个lambda或一个符号。
您可以使用实习生构建符号,然后将符号提供给set-key:
(defun my-test () (interactive) (message "ok"))
(global-set-key "\C-c!" (intern (concat "my" "-" "test")))
请注意,通过global-set-key和variants调用的任何函数都必须交互式。
答案 1 :(得分:0)
使用lexical-let
定义closure,这是一个匿名函数,它引用定义它的环境中的值:
(defun global-setter (arg1 arg2)
(lexical-let ((arg1 arg1) (arg2 arg2))
(global-set-key arg1 (lambda ()
(interactive)
(concat "example" arg1 arg2)))))
Emacs 24 natively supports词法绑定和闭包,因此不再需要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: