передача аргументов функции в elisp - PullRequest
0 голосов
/ 04 октября 2019

У меня есть функция, определенная в моем init.el:

(defun bind-key (keymap)
    (evil-define-key '(normal insert) keymap (kbd "C-=") 'some-function))

(bind-key 'c++-mode-map)

Но evil-define-key не связывает C-= с некоторой функцией в keymap.

Однако, вызвать evil-define-key напрямую все в порядке:

(evil-define-key '(normal insert) c++-mode-map (kbd "C-=") 'some-function)

Я пробовал:

(bind-key 'c++-mode-map)
(bind-key c++-mode-map)

Ни один не работает.

Я гуглил для передачи ключей вфункция, но не нашел решения. Затем я заметил evil-define-key это макрос. Но я не могу найти решения в этой ситуации.

Как мне заставить bind-key работать? Передавая ему карту ключей, функция связывает C-= с некоторой функцией, входящей в карту ключей?

1 Ответ

1 голос
/ 04 октября 2019

Как вы заметили, это сложнее, чем кажется, потому что evil-define-key - это макрос (определенный здесь ). Он принимает символ, который называет переменную раскладки клавиатуры, и связывает ключ, как только эта переменная была определена. Однако в этом случае он получает символ keymap вместо c++-mode-map, поскольку вызов макроса получает в качестве аргументов буквальные значения в вызове.

Вы можете обойти это, изменив свою собственную функцию вмакро. Это означает, что вместо того, чтобы просто запускать некоторый код, он должен возвращать некоторый код, который затем оценивается. Например:

(defmacro bind-key (keymap)
  `(evil-define-key '(normal insert) ,keymap (kbd "C-=") 'some-function))

В обратной цитате вводится форма, которая возвращает дословно, за исключением значений внутри нее, перед которыми стоит запятая.

Вызывайте ее с помощью (bind-key c++-mode-map), и она должна быть эквивалентнойна ваш явный вызов evil-define-key.

...