我想调用函数中的全局集键,并为其提供参数,以创建全局集键。
(defun global-setter (arg1 arg2)
(global-set-key arg1 '(concat "example" arg1 arg2))
)
(global-setter "*" "^")
这应该创建一个绑定,当按下*
时,应该调用函数example-*^
。
我不知道如何将字符串作为函数/命令名传递。我做错了什么?
到目前为止,我尝试了`',@
、(intern)
、(eval)
、(function)
的组合,但我不知道我应该做什么。
代码不起作用的一个原因是引用了(concat..)表达式,因此永远不会对其求值。全局集合键需要lambda或符号。
您可以使用intern构建一个符号,然后提供该符号以设置密钥:
(defun my-test () (interactive) (message "ok"))
(global-set-key "C-c!" (intern (concat "my" "-" "test")))
请注意,通过全局集合键和变量调用的任何函数都必须是交互式。
使用lexical-let
定义闭包,这是一个匿名函数,引用定义它的环境中的值:
(defun global-setter (arg1 arg2)
(lexical-let ((arg1 arg1) (arg2 arg2))
(global-set-key arg1 (lambda ()
(interactive)
(concat "example" arg1 arg2)))))
Emacs24本机支持词法绑定和闭包,因此不再需要lexical-let
:
(defun global-setter (arg1 arg2)
(global-set-key arg1 (lambda ()
(interactive)
(concat "example" arg1 arg2))))
要做到这一点,请确保在.emacs
中将lexical-binding
设置为t
,并将其添加到文件末尾,以确保词法绑定用于字节编译:
;; Local Variables:
;; lexical-binding: t
;; End: