如何在 elisp 中将列表作为参数提供给宏?
How to give a list as arguments to a macro in elisp?
我想实现这样的目标:
(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* 在这里是一个宏
在绑定键的特定情况下,我认为更好的选择是寻找一个函数来替换那个 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 的值(至少在时间旅行开始工作之前) .
我想实现这样的目标:
(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* 在这里是一个宏
在绑定键的特定情况下,我认为更好的选择是寻找一个函数来替换那个 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 的值(至少在时间旅行开始工作之前) .