Jak skonfigurować powiązania klawiszy dla trybów w określonym stanie zła?

9

Mam zestaw kluczowych powiązań, które używam dla obu web-modei php-modew trybie wstawiania (zła). Więc nie mogę użyć set-local-mapani czegoś takiego. Ponieważ w trybie normalnym te same klawisze będą wywoływać inne polecenia. Więc wiązania muszą być aktywne evil-insert-state-maptylko w.

Mam następujące:

(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)))

Tak więc za każdym razem web-modelub php-modepodczas ładowania te powiązania klawiszy będą aktywowane.

Problem polega na tym: Załóżmy, że mam dwa otwarte bufory, jeden w drugim, php-modea drugi w web-mode. Gdy web-modebufor jest bieżącym buforem i przełączam się na inny bufor, który jest w środku php-mode, web-modepowiązania są nadal aktywne w php-modebuforze.

Próbowałem rozwiązać ten problem za pomocą (add-hook 'web-mode-hook [...])i (add-hook 'php-mode-hook [...])zamiast konfigurowania powiązań eval-after-load. Ale to rozwiązanie nie działa w tej sytuacji.

Jakieś sugestie? Byłbym bardzo wdzięczny.

ReneFroger
źródło

Odpowiedzi:

12

Zło ma evil-define-keymakro do definiowania poleceń dla niektórych stanów tylko w określonej mapie klawiszy:

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

Jest w stanie opóźnić wykonanie wiązania (przy użyciu eval-after-loadsamego siebie), a także może przyjąć więcej niż jedną parę klawiszy i poleceń, co jest całkiem sprytnym dodatkiem.

wasamasa
źródło
Twoje rozwiązanie działa, jestem za to wdzięczny. Nigdy nie wiedziałem, że istnieje coś takiego jak klucz definiujący zło. I rzeczywiście całkiem sprytne, że możesz powiązać więcej par klawiszy poleceń z evil-define-key.
ReneFroger