Как вы заметили, это сложнее, чем кажется, потому что 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
.