Как настроить привязки клавиш для режимов в определенном состоянии зла?

9

У меня есть набор привязок клавиш, которые я использую для обоих web-modeи php-modeв режиме вставки (зла). Поэтому я не могу использовать set-local-mapили что-то. Потому что в обычном режиме те же клавиши будут вызывать другие команды. Так что привязки должны быть активны evil-insert-state-mapтолько в.

У меня есть следующее:

(eval-after-load 'php-mode
  '(progn
     (define-key evil-insert-state-map
       (kbd "C-<next>") (lambda () (interactive) (insert " = ")))
     (define-key evil-insert-state-map
       (kbd "C-<prior>") (lambda () (interactive) (insert "->")))))

(eval-after-load 'web-mode
  '(progn
     (define-key evil-insert-state-map
       (kbd "C-<next>") 'zencoding-expand-yas) 
     (define-key evil-insert-state-map
       (kbd "C-<prior>") 'zencoding-expand-line)))

Поэтому каждый раз , web-modeили php-modeзагружается, эти сочетания клавиш будут активированы.

Проблема в том, что у меня есть два открытых буфера, один в, php-modeа другой в web-mode. Когда web-modeбуфер является текущим буфером, и я переключаюсь на другой буфер, который находится внутри php-mode, web-modeпривязки все еще активны внутри php-modeбуфера.

Я попытался решить эту проблему с помощью (add-hook 'web-mode-hook [...])и (add-hook 'php-mode-hook [...])вместо установки привязок в eval-after-load. Но это решение не работает в этой ситуации.

Какие-либо предложения? Я был бы очень признателен.

ReneFroger
источник

Ответы:

12

Зло имеет evil-define-keyмакрос для определения команд для определенных состояний только в определенной таблице ключей:

(evil-define-key 'insert emacs-lisp-mode-map (kbd "C-c C-c") 'butterfly
                                             (kbd "<pause>") 'zone)

Он может задерживать выполнение привязки (используя eval-after-loadсебя), а также может принимать более одной пары «ключ-команда», что является довольно изящным дополнением.

wasamasa
источник
Ваше решение работает, я благодарен за это. Никогда не знал, что есть такая вещь, как злой ключ. И действительно, довольно изящно, что вы можете связать больше пар ключевых команд с evil-define-key.
ReneFroger