【问题标题】:passing function arguments in elisp在 elisp 中传递函数参数
【发布时间】:2019-10-04 09:14:41
【问题描述】:

我在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】:

    正如您所注意到的,这比看起来要复杂,因为evil-define-key 是一个宏(定义为here)。它采用一个命名键映射变量的符号,并在定义该变量后绑定键。但是,在这种情况下,它会得到符号 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 的显式调用。

    【讨论】:

    • 谢谢,将绑定键定义为宏解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2010-09-17
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2010-10-02
    相关资源
    最近更新 更多