在elisp中传递函数参数

问题描述 投票:0回答:1

我在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-=绑定到键映射中的某些功能?

emacs key-bindings
1个回答
0
投票

您已经注意到,这比它看起来复杂,因为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

© www.soinside.com 2019 - 2024. All rights reserved.