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

(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
godblessfq 24 Ноя 2018 в 11:24

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

1
Stefan 24 Ноя 2018 в 14:12