如何在elisp中为宏提供参数列表?

时间:2018-11-24 08:24:41

标签: emacs elisp-macro

我想实现以下目标:

(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 *是这里的宏。

1 个答案:

答案 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的值(至少要等到时间旅行才能完成)。