在 elisp 中传递函数参数

passing function arguments in elisp

我在 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-= 绑定到键盘映射中的某个函数?

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

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

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

反引号引入了一种形式,可以逐字 returned,除了其中的值前面有逗号。

(bind-key c++-mode-map)调用它,它应该等同于你显式调用evil-define-key