Como configurar ligações de teclas para modos em um estado Evil específico?

9

I tem um conjunto de teclas que usam tanto para web-modee php-modeno modo de inserção (de mau). Então, eu não posso usar set-local-mapou algo assim. Porque no modo normal, as mesmas teclas chamarão outros comandos. Portanto, as ligações precisam estar ativas evil-insert-state-mapapenas.

Eu tenho o seguinte:

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

Então, toda vez web-modeou php-modeestá sendo carregado, essas teclas será ativado.

O problema é: Suponha que eu tenha dois buffers abertos, um no php-modee outro no web-mode. Quando o web-modebuffer é o buffer atual e eu alterno para outro buffer que esteja php-mode, as web-modeligações ainda estão ativas dentro do php-modebuffer.

Tentei resolver esse problema usando (add-hook 'web-mode-hook [...])e em (add-hook 'php-mode-hook [...])vez de configurar as ligações eval-after-load. Mas essa solução não funciona nessa situação.

Alguma sugestão? Eu realmente apreciaria isto.

ReneFroger
fonte

Respostas:

12

O mal possui a evil-define-keymacro para definir comandos para determinados estados apenas em um mapa-chave específico:

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

É capaz de atrasar a execução da ligação (usando- eval-after-loadse) e também pode levar mais de um par de chave-comando, que é uma adição bastante bacana.

wasamasa
fonte
Sua solução funciona, sou grato por isso. Nunca soube que existe uma chave que define o mal. E realmente muito bacana que você poderia vincular mais pares de comandos de chave ao evil-define-key.
ReneFroger