字符串转换为global-set-key的函数命令(elisp)

时间:2013-02-19 09:25:22

标签: string emacs elisp

我想在函数中调用global-set-key,为其创建参数,以创建全局集密钥。

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

(global-setter "*" "^")

这应该创建绑定,当按*时,应该调用函数example-*^

我无法弄清楚如何将字符串作为函数/命令名传递。我究竟做错了什么?

到目前为止,我尝试过`',@(intern)(eval)(function)的组合,但我不知道自己应该做些什么。

2 个答案:

答案 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: