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

您的代码不起作用的一个原因是您引用了 (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 和 variables 调用的任何函数都必须是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 回答