emacs - 在 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
是一个宏(在此处定义)。它采用一个命名键映射变量的符号,并在定义该变量后绑定键。但是,在这种情况下,它获取的是符号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
。
推荐阅读
- vba - 无法在 vba selenium 中设置 chrome 首选项
- python-3.x - 使用 PySimpleGui 加载多个文件夹
- javascript - 尝试访问 json 字段
- bdd - 如何避免不同用户的用户故事重复?
- delphi - 如何获得正确数量的逻辑处理器
- android - 可过滤的 Android PagedListAdapter
- websocket - 网络套接字。哪个是空闲超时的正确关闭代码?
- ruby-on-rails - 获取从现在到一天结束的 tsrange
- html - 提示对象不支持他的属性或方法
- linkedin - 获取 r_fullprofile 对 Linkedin API 的访问权限