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
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.