转换为全局设置键(elisp)的函数命令的字符串



我想调用函数中的全局集键,并为其提供参数,以创建全局集键。

(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:

最新更新