在elisp中传递函数参数

时间:2019-10-04 09:14:41

标签: emacs key-bindings

我在init.el中定义了一个函数:

(defun bind-key (keymap)
    (evil-define-key '(normal insert) keymap (kbd "C-=") 'some-function))

(bind-key 'c++-mode-map)

但是evil-define-key不会将C-=绑定到keymap中的某些功能。

但是,可以直接调用evil-define-key

(evil-define-key '(normal insert) c++-mode-map (kbd "C-=") 'some-function)

我尝试过:

(bind-key 'c++-mode-map)
(bind-key c++-mode-map)

都不行。

我已经通过谷歌搜索将键映射传递给函数,但是没有找到解决方案。然后,我注意到evil-define-key是一个宏。但是在这种情况下我找不到解决方法。

如何让bind-key工作?通过向其传递键盘映射,该函数是否将C-=绑定到键盘映射中的某些功能?

1 个答案:

答案 0 :(得分:1)

正如您所注意到的,这比看起来要复杂,因为evil-define-key是一个宏(定义为here)。它使用一个符号来命名一个keymap变量,并在定义该变量后绑定该键。但是,在这种情况下,它得到符号keymap而不是c++-mode-map,因为宏调用将调用中的文字值作为参数。

您可以通过将自己的函数更改为宏来解决此问题。这意味着它不仅需要运行一些代码,还需要返回一些代码然后进行评估。像这样:

(defmacro bind-key (keymap)
  `(evil-define-key '(normal insert) ,keymap (kbd "C-=") 'some-function))

反引号引入了一种形式,该形式逐字返回,但其中的值前面带有逗号。

(bind-key c++-mode-map)调用它,它应该等效于您对evil-define-key的显式调用。