2016-05-15 7 views
1

Ich bin neu in Emacs und habe den bösen Modus benutzt. Ich habe ein paar Probleme damit gehabt, einige der Mappings, die ich in vim hatte, neu zuzuordnen. In vim war es einfach, Tasten mit der map Funktion neu zu ordnen. Ich wollte cw zu ciw und dw zu diw neu zuordnen. Aber ich verstehe nicht viel von elisp. Gibt es also ein Plugin oder eine Funktion, die ein einfaches Mapping ermöglicht? Danke.Tastenbelegung im Evil-Modus Emacs

Antwort

1

Zuerst die schlechte Nachricht: out of the box ist dies derzeit nicht möglich, ohne andere Betreiber zu beeinflussen. Der Grund dafür ist, dass c ein Operator ist, so dass Emacs evil-change ausführt, sobald c eingegeben wird. Dann kommt Evil in den Zustand "Operator anstehend" und der folgende w (oder iw) wird gelesen, um die richtige Bewegung herauszufinden.

Das Problem ist, dass es für alle Operatoren nur einen Operatorstatus gibt, d. H. Es gibt nur eine gemeinsame Tastaturbelegung. Wenn Sie also w in iw ändern, ändert sich das Verhalten für alle Operatoren nicht nur c oder d.

Erste gute Nachricht: Wenn das ist in Ordnung, wenn man dann könnte man einfach

(define-key evil-operator-state-map "w" "iw") 

tut jetzt noch bessere Nachricht. Wenn Sie das Zeug oben wissen, dann ist es relativ einfach, das Problem mit ein wenig Emacs Lisp Magic zu lösen. Der Bereich, der an den Operator übergeben wird, wird durch die Funktion evil-operator-range festgelegt. Die Idee ist, diese Funktion zu empfehlen und die Tastenbelegung vorübergehend zu ändern, wenn der aktuelle Operator evil-change oder ist. Es gibt mehrere Kandidaten-Keymaps, in denen Sie die neuen Bindungen platzieren können, aber evil-operator-state-local-map ist eine vernünftige Wahl.

(defun my/evil-motion-range (orig-fun &rest args) 
    (if (not (memq this-command '(evil-delete evil-change))) 
     (apply orig-fun args) 
    (let* ((orig-keymap evil-operator-state-local-map) 
      (evil-operator-state-local-map (copy-keymap orig-keymap))) 
     (define-key evil-operator-state-local-map "w" "iw") 
     (apply orig-fun args)))) 

(advice-add 'evil-operator-range :around #'my/evil-motion-range) 

Eigentlich würde diese Technik ermöglichen, Operator-spezifische Bindungen in einer allgemeinen Weise zu implementieren.