我想实现以下目标:
(setq my-global-keybindings
'(([?\C-x ?\C-d] . dired)
([?\C-x ?\C-b] . ibuffer)
([?\C-x b] . ivy-switch-buffer)))
(apply #'bind-keys* my-global-keybindings)
但是bind-keys *是这里的宏。
答案 0 :(得分:1)
在绑定键的特定情况下,我认为更好的选择是寻找一个替换该bind-keys*
宏的函数(我看不出为什么它应该是宏而不是函数的任何理由)
但是对于更普遍的问题,这是我的处理方式:
(defmacro my-multi-bind-keys (bindings)
(macroexp-progn
(mapcar (lambda (binding)
`(bind-keys* ,@binding))
bindings)))
(my-multi-bind-keys (([?\C-x ?\C-d] dired)
([?\C-x ?\C-b] ibuffer)
([?\C-x b] ivy-switch-buffer)))
请注意,像您一样使用setq
是有问题的:宏需要在编译期间扩展,但是setq
不应由编译器执行(应 compiled >由编译器在以后执行代码时运行),因此宏没有声音方法可以访问var的值(至少要等到时间旅行才能完成)。