Как дать список в качестве аргументов макроса в elisp? - PullRequest
0 голосов
/ 24 ноября 2018

Я хочу добиться чего-то вроде этого:

(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 голосов
/ 24 ноября 2018

В конкретном случае связывания ключей, я думаю, лучше выбрать функцию, которая заменяет этот макрос 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 не должен выполняться компилятором (он должен быть скомпилирован компилятором для запуска при последующем выполнении кода), поэтому у макроса нет надежного способа получить доступ к переменнойзначение (по крайней мере, пока путешествие во времени не будет сделано).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...