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