首页 > 解决方案 > 在 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-=到键映射中的某个函数吗?

标签: emacskey-bindings

解决方案


正如您所注意到的,这比看起来更棘手,因为它evil-define-key是一个宏(在此处定义)。它采用一个命名键映射变量的符号,并在定义该变量后绑定键。但是,在这种情况下,它获取的是符号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


推荐阅读