Wie richte ich Tastenkombinationen für Modi in einem bestimmten bösen Zustand ein?

9

Ich habe eine Reihe von Tastenkombinationen, die ich sowohl für web-modeals auch php-modeim Einfügemodus (von Evil) verwende. Also kann ich nicht benutzen set-local-mapoder so. Denn im normalen Modus rufen dieselben Tasten dann andere Befehle auf. Die Bindungen müssen also evil-insert-state-mapnur in aktiv sein.

Ich habe folgendes:

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

Also jedes Mal , web-modeoder php-modegeladen wird, werden diese Tastenbelegungen aktiviert.

Das Problem ist: Angenommen, ich habe zwei offene Puffer, einen im php-modeund einen im web-mode. Wenn der web-modePuffer der aktuelle Puffer ist und ich zu einem anderen Puffer wechsle, der sich im Puffer befindet php-mode, sind die web-modeBindungen im php-modePuffer noch aktiv .

Ich habe versucht, dieses Problem zu lösen, indem ich die Bindungen in (add-hook 'web-mode-hook [...])und (add-hook 'php-mode-hook [...])anstelle von eingerichtet habe eval-after-load. Aber diese Lösung funktioniert in dieser Situation nicht.

Irgendwelche Vorschläge? Ich würde dies sehr begrüssen.

ReneFroger
quelle

Antworten:

12

Evil hat das evil-define-keyMakro zum Definieren von Befehlen für bestimmte Zustände nur in einer bestimmten Keymap:

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

Es ist in der Lage, die Ausführung der Bindung zu verzögern (indem es sich eval-after-loadselbst verwendet) und kann auch mehr als ein Schlüssel-Befehlspaar aufnehmen, was eine ziemlich raffinierte Ergänzung ist.

Wasamasa
quelle
Ihre Lösung funktioniert, dafür bin ich dankbar. Ich wusste nie, dass es so etwas wie einen bösen Schlüssel gibt. Und in der Tat ziemlich geschickt, dass Sie mehr Schlüsselbefehlspaare an die binden könnten evil-define-key.
ReneFroger