Ich versuche, das Böse zum Funktionieren zu bringen evil-jump-to-tag
und mich C-]wie der Emacs zu verhalten M-..
Das normale Verhalten ist für das Durchsuchen von Tags-Dateien in Ordnung, aber ich möchte, dass es auch für slime-edit-definition
Slimes elisp-slime-nav-find-elisp-thing-at-point
, Elisps cider-jump-to-var
, Clojures usw. funktioniert .
Diese und viele weitere Hauptmodi haben ein Äquivalent zum Sprung zur Definition an die Tastenbelegung gebunden M-..
Um das gleiche Verhalten für den Evil-Modus zu erzielen, muss ich für jeden dieser Modi lokal eine Tastenzuordnung festlegen. Alternativ können Sie auch eine Tastenzuordnung vornehmen und Emacs mitteilen, dass bei jedem Drücken dieser Taste die für diese Taste festgelegte Funktion verwendet wird im Emacs-Modus?
Antworten:
Ich habe es jetzt zum Laufen gebracht, dank Ihrer Antworten:
Dies setzt den bösen Zustand auf "Emacs", ruft die an M- gebundene Funktion auf und wechselt in den vorherigen Emacs-Zustand im anderen Puffer zurück. Ich habe es mit Elisp, Slime and Go versucht und es funktioniert für alle.
quelle
(define-key evil-normal-state-map (kbd "C-]") (kbd "\\ M-.")
(wobei "\" gebunden istevil-execute-in-emacs-state
).Versuchen Sie etwas wie
oder, wenn Sie
evil
diese Tastenkombination bereits verwenden, müssen Sie möglicherweise etwas wie tun.Dadurch wird das Verhalten von
C-]
@ Tyler vollständig außer Kraft gesetzt . Wenn Sie das Verhalten des Bösen in Abhängigkeit vom aktuellenM-.
Hauptmodus beibehalten möchten, ist die Lösung von @ Tyler besser geeignet, da Sie eine Funktion haben können, die entscheidet, ob Sie etwas anderes aufrufen oder tun möchten.Hilft das?
quelle
Ich verstehe
evil
die Keymaps von 's nicht, aber die folgende Funktion macht alles, was M-.im Moment gebunden ist:evil
Wenn Sie dies an die entsprechende Tastaturbelegung binden, sollten Sie das tun, was Sie möchten. Möglicherweise gibt es eineevil
spezifischere Möglichkeit, dies zu tun.evil
bindet C-]inevil-motion-state-map
, versuchen so die folgende:quelle
M-.
anevil-repeat-pop-next
. Wenn Sie Ihre Funktion folgendermaßen ändern: (defun my-tag-jump () (interaktiv) (evil-emacs-state) (aufrufinteraktiv (key-binding (kbd "M-"))) (evil-normal- state))evil-jump-to-tag
definiert ist, und sie dort an meine Funktion zu binden.Im Allgemeinen ist es nicht möglich.
Der Grund dafür ist, dass es möglicherweise mehrere Maps gibt, die dieselbe Bindung definieren, und es nicht möglich ist, automatisch herauszufinden, welche Sie möchten. (In Ihrem Beispiel
elisp-slime-nav-mode
ist dies ein untergeordneter Modus). Der einzig wirklich zuverlässige Ansatz besteht darin, dass Sie genau herausfinden, welche Definition Sie möchten.Das heißt, es gibt einen möglichen Hack (gibt es nicht immer ...). Ein Teil der Schwierigkeit besteht darin, dass die Bindung, die Sie neu zuordnen möchten, möglicherweise bereits durch eine böse aktive Keymap maskiert ist, sodass die aktuelle Bindung von abgerufen wird
M-.
ist nutzlos.Normalerweise benutze ich überhaupt kein Böses, daher sind möglicherweise Anpassungen erforderlich (siehe eingebettete Kommentare).
Ein sauberer Ansatz wäre auch, die Bindungen einmal nachzuschlagen (z. B. in einem Modus-Hook), anstatt bei jedem Drücken der Tastenkombination dynamisch nachzuschlagen. Aber ich bin mir nicht sicher, welchen bösen Haken ich verwenden soll, daher bleibt dies als Übung übrig;) (und abhängig von der Reihenfolge, die Sie für Ihre Nebenmodi verwenden, oder wenn Sie sie dynamisch umschalten, ist dies möglicherweise falsch.)
quelle
Die von @severin akzeptierte Lösung funktioniert bei mir fast, aber wenn das Tag nicht gefunden wird, kehrt der Puffer nicht in den normalen Modus zurück. Diese Alternative funktioniert für mich in allen Fällen:
quelle
Ich denke, dass der sauberste Weg ist
(und füge auch jede andere Karte hinzu, die dich interessiert)
xref-find-definitions
ist die Funktion, an dieM-.
in Emacs gebunden ist , wie Sie anhand des Befehls sehen könnenC-h k
.quelle
Einige vim-artige Tastenbelegungsfunktionen.
Hier sind einige Funktionen, die ich definiert habe, um eine Bindung im Vim-Stil in der globalen Karte und in verschiedenen bösen Zuständen zu ermöglichen, sowie zwei allgemeine Funktionen, die entweder eine beliebige Tastenkarte oder eine beliebige Bindungsfunktion übernehmen. Ich habe diese Funktionen zusammengefasst .
Im Allgemeinen ist es besser, diese Funktionen nur für Tastaturmakrobindungen zu verwenden (wie im vorliegenden Anwendungsfall) und für alle anderen Funktionen die Tastaturbindung im Emacs-Stil zu verwenden.
Anmerkungen
bind-key
Makro aus demuse-package
Paket ist eine hervorragende und vielseitige Funktion für die Tastenbindung.Bindung C-]an M-..
Beachten Sie, dass Sie im Normalzustand eine Bindung herstellen möchten, um auf \M-.die Emacs-Bindung zuzugreifen, da im Normalzustand eine Bindung hergestellt werden M-.soll
'evil-repeat-pop-next
. So kann eine Normalzustandsbindung definiert werden mit:oder (erneutes Binden eines
evil-jump-to-tag
Schlüssels im Normalzustand:quelle