Як встановити прив'язки клавіш для режимів у конкретному злому стані?


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. Але це рішення не працює в цій ситуації.

Будь-які пропозиції? Я б дуже цінував це.

Відповіді:


12

Evil має evil-define-keyмакрос для визначення команд для певних станів лише у конкретній мапі клавіш:

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

Він здатний затримати виконання прив'язки (використовуючи eval-after-loadсебе), а також може взяти більше однієї пари ключів-команд, що є досить витонченим доповненням.


Ваше рішення працює, я вдячний за це. Ніколи не знав, що існує таке поняття, як ключ, що визначає зло. І справді дуже вишукано, що ви можете прив’язати до пари більше ключових команд evil-define-key.
ReneFroger
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.