Ihre Zuordnung funktioniert nicht wie erwartet oder verhält sich anders als erwartet. Es sind mehrere Schritte erforderlich, um dies zu beheben:
Vergewissern Sie sich, dass der Schlüssel dem entspricht, was er tun soll
Vim liefert einen Befehl :map
. Standardmäßig (wenn kein Argument angegeben ist) zeigt der Befehl alle derzeit erstellten Zuordnungen an. Hier ist ein Beispiel für das Ergebnis des Befehls:
Wie immer ist der Doc dein Freund: :h map-listing
In der ersten Spalte sehen Sie den Modus der Zuordnung ( n
für den normalen Modus,
v
für den visuellen Modus usw.), in der zweiten Spalte werden die zugeordneten Tasten und in der letzten Spalte die zugeordneten Tasten angezeigt. Beachten Sie, dass es wichtig ist, einige zusätzliche Zeichen zu verstehen, bevor die zugeordneten Aktionen angezeigt werden:
*
zeigt an, dass es nicht remappable ist (dh es ist keine rekursive Zuordnung, siehe know when to use nore
später in dieser Antwort)
&
Gibt an, dass nur skriptlokale Zuordnungen erneut zugeordnet werden können
@
zeigt eine pufferlokale Zuordnung an
Wenn Sie zu einer Zuordnung um Hilfe bitten, sollten Sie diese Informationen hinzufügen, da dies anderen Personen dabei helfen kann, das Verhalten Ihrer Zuordnung zu verstehen.
Es ist möglich , um die Abfrage zu einem bestimmten Modus mit den Schwester-Befehlen zu beschränken :map
, wie :vmap
, :nmap
, :omap
usw.
Um Ihre Suche auf das problematische Mapping zu beschränken, können Sie die zu debuggende Tastenfolge als Parameter der Befehle übergeben:
:map j
:map <Leader>m
:map <F5>
Beachten Sie, dass der <Leader>
Schlüssel durch den tatsächlichen Wert in der Liste ersetzt wird.
Wenn das Ergebnis des Befehls anzeigt, dass Ihre Tasten korrekt zugeordnet sind, liegt das Problem wahrscheinlich nicht an Vim, sondern an Ihrem Terminal oder Ihrer Desktop-Umgebung. Siehe den Teil Überprüfen Sie, ob Ihr Mapping tatsächlich von Vim abgefangen wird
Wenn das Ergebnis des Befehls anzeigt, dass Ihre Tasten nicht richtig zugeordnet sind, lesen Sie den folgenden Teil.
Überprüfen Sie, was Ihre Zuordnung überschrieben hat
Eine andere bequeme Verwendung des :map
Befehls ist die Kombination mit verbose
: Dies fordert die letzte Datei auf, die Ihre Zuordnung geändert hat.
Sehen Sie sich zum Beispiel diese beiden Screenshots an, die das Ergebnis sind :verbose map
: Der erste ist eine Zuordnung, die von my geändert wurde, .vimrc
und der zweite eine Zuordnung, die von einem Plugin erstellt wurde:
Wenn Sie nun sehen, dass ein anderes Skript Ihre Zuordnung geändert hat, müssen Sie prüfen, ob Sie es entfernen oder sein Verhalten ändern können. (Beachten Sie, dass einige Plugins Variablen zum Aktivieren / Deaktivieren ihrer Zuordnungen bereitstellen. Leider tun dies nicht alle Plugins.)
Wenn die letzte Datei, die Ihre Zuordnung geändert hat, Ihre ist .vimrc
, stellen Sie sicher, dass es keine andere Zeile gibt, die auch eine Zuordnung für denselben Schlüssel definiert. Die .vimrc
Datei überschreibt problemlos alle Zuordnungen mit der letzten ihrer Art in der Datei.
Überprüfen Sie, ob Ihre Zuordnung tatsächlich von Vim abgefangen wird
Verschiedene Situationen können darauf hindeuten, dass Vim Ihren Schlüssel nicht abfängt:
- Der Befehl
:map
zeigt an, dass Ihre Taste korrekt zugeordnet ist, das Drücken jedoch nichts bewirkt.
- Ihr Mapping funktioniert auf gVim (GUI), in Terminal Vim jedoch nicht
- Ihre Zuordnung funktioniert auf einem definierten Terminalemulator, aber nicht auf einem anderen
- Ihre Zuordnung funktioniert auf einem definierten Betriebssystem, jedoch nicht auf einem anderen.
Es wird wahrscheinlich von einem der beiden folgenden Dinge verursacht:
Etwas fängt den Schlüssel vor Vim ab : Es können verschiedene Anwendungen sein: Ihr Betriebssystem, Ihre Desktop-Umgebung, Ihr Terminal-Emulator, Tmux (wenn Sie es verwenden) ...
Um dies zu beheben, sollten Sie:
- Versuchen Sie, vorübergehend zu entfernen,
.tmux.conf
wenn Sie tmux verwenden
- Schlagen Sie in der Dokumentation Ihres Terminals oder Ihrer Desktop-Umgebung nach.
Sie könnten auch an Schwester-Websites verweisen wie Super-User ,
Unix und Linux , askUbuntu , etc ...
Wenn dies das Problem ist, haben Sie zwei Möglichkeiten: Entweder verbringen Sie (viel) Zeit damit, das Verhalten der Anwendung zu ändern, die das Problem verursacht, oder Sie finden eine andere Tastenkombination für die Zuordnung, die von keiner anderen Anwendung abgefangen wird.
Ihr Terminalemulator kann die Tastenkombination, die Sie zuordnen möchten, nicht verarbeiten : Terminalemulatoren sind unterschiedlich implementiert und einige von ihnen können eine bestimmte Tastenkombination nicht verarbeiten. (Der Grund, warum sie dies nicht können, liegt außerhalb des Rahmens dieser Frage. Weitere Informationen finden Sie in ihrem Dokument oder auf den oben genannten Schwesterseiten.)
In diesem Fall haben Sie nicht viele Lösungen: Entweder ändern Sie Ihren Schlüssel gegen einen anderen, der von Ihrem Terminal ordnungsgemäß verarbeitet wird, oder Sie ändern Ihren Terminalemulator.
Überprüfen Sie, ob die häufigsten Fehler aufgetreten sind
Einige Probleme in Zuordnungen treten häufig auf und hängen hauptsächlich mit der Vimscript-Syntax zusammen. Wenn Ihre Zuordnung ein unerwartetes Verhalten aufweist, überprüfen Sie die folgenden Punkte:
Fügen Sie keinen Kommentar in dieselbe Zeile wie Ihre Zuordnung ein , sondern fügen Sie den Kommentar in die obige Zeile ein. Beispiel:
Mach das nicht:
inoremap ii <esc> " ii to go back into normal mode
Vim betrachtet die Leerzeichen, das "
und den Kommentar als Teil des Mappings, was zu einem unerwarteten Verhalten führt.
Tun Sie stattdessen Folgendes:
" ii to go back into normal mode
inoremap ii <esc>
Dies ist einfacher zu lesen und beeinträchtigt Ihre Zuordnung nicht.
Leiten Sie Ihre Befehle nicht mit|
. Beispiel:
Mach das nicht:
nnoremap <Leader>x :w | !% python -m json.tools
Vim betrachtet die Pipe |
als eine Befehlsbeendigung: Wenn Sie .vimrc
die Zuordnung nnoremap <Leader>x :w
als Quelle angeben, wird der externe Befehl !% python -m json.tools
ausgeführt.
Tun Sie stattdessen Folgendes:
nnoremap <Leader>x :w <bar> !% python -m json.tools
Siehe eine Erklärung zu<bar>
.
Wissen, wann zu verwenden nore
: immer .
LearnVimscriptTheHardWay es erklären ziemlich klar: nie benutzen map
, nmap
, vmap
usw ... bevorzugen immer die nore Version: noremap
, nnoremap
, vnoremap
usw ... Warum? nore
Steht für non-recursive
Mapping, bedeutet dies, dass die rechte Seite des Mappings als integrierte Funktion betrachtet wird, auch wenn Sie es neu zugeordnet haben. Beispiel:
Angenommen, Sie möchten >
eine Linie -
mappen , um sie zu löschen und den Einzug einer Linie zu erhöhen. Wenn Sie keine nicht rekursiven Zuordnungen verwenden, gehen Sie folgendermaßen vor:
( Tun Sie das nicht, es ist für das Beispiel )
nmap > dd
nmap - >
Wenn Sie auf >Ihre Zeile klicken, wird sie gelöscht, das ist gut. Wenn Sie jedoch auf -eine Zeile klicken, wird diese ebenfalls gelöscht, anstatt eingerückt zu werden. Warum? Weil Vim verstand, "dass ich einen Treffer erhalten habe, in -
den ich übersetzen >
soll, in den ich wiederum übersetzen soll dd
".
Mach das stattdessen
nnoremap > dd
nnoremap - >
Auf diese Weise wird Vim übersetzen -
als >
und wird nicht versuchen, eine andere Übersetzung wegen der zu machen nore
.
Anmerkung bearbeiten "Immer" kann eine übertriebene Antwort sein, in einigen Fällen müssen Sie das rekursive Zuordnungsformular verwenden, aber es ist nicht wirklich üblich. Zur Verdeutlichung zitiere ich @romainl aus dieser Antwort :
Verwenden Sie eine rekursive Zuordnung nur, wenn Sie beabsichtigen, eine andere Zuordnung in Ihrer Zuordnung zu verwenden. Verwenden Sie nicht-rekursive Zuordnungen, wenn Sie dies nicht tun.
Denken Sie daran, dass einige Tastenkombinationen äquivalent sind : Aufgrund der Hexadezimalcodes, die erzeugt werden, werden einige Tastenkombinationen von Vim als ein weiterer Schlüssel interpretiert. Zum Beispiel
<C-h>
ist äquivalent zu <backspace>
<C-j>
wie <enter>
- Auf französischen Tastaturen
<M-a>
gilt das Gleiche á
und das Gleiche für alle
<m-
Zuordnungen. Wie @LucHermitte in dem Kommentar betonte, ist dies ein Problem mit Plugins, die diese Art von Mappings wie Vim-Latex verwenden.
<C-S-a>
ist äquivalent zu
<C-a>
. Die Zuordnung von Strg + Großbuchstaben zu Strg + Kleinbuchstaben ist nicht möglich, da die Terminals ASCII-Codes senden.
Wenn Ihre Zuordnung einen anderen Schlüssel zu beeinflussen scheint, versuchen Sie, eine andere lhs-Kombination zu verwenden. Wenn dies das Problem löst, überprüfen Sie, welche Hexadezimalcodes an Vim gesendet werden.
Stellen Sie sicher, dass Ihr Anführer korrekt definiert ist : Wenn Ihre Zuordnungen<leader>
nicht funktionieren und Sie Ihren Anführer mit dem Befehl geändert haben, stellen Sie sichermapleader
, dass die Definition Ihres Anführers vor der Definition der Zuordnungen erfolgt. Andernfalls versucht Vim, Zuordnungen mit einem Schlüssel zu erstellen, der Ihrer Meinung nach nicht derselbe ist. Auch wenn Sie die Leertaste als Führungslinie verwenden möchten (was ziemlich aktuell ist), stellen Sie sicher, dass Sie die richtige Notation verwendet haben:let mapleader = "\<Space>"
Dein Mapping funktioniert immer noch nicht?
Wenn Sie alle Schritte dieser Antwort durchlaufen haben und Ihr Mapping immer noch nicht wie gewünscht funktioniert, möchten Sie wahrscheinlich auf dieser Site um Hilfe bitten.
Damit die Menschen Ihnen helfen können, wichtige Informationen bereitzustellen, z.
- Der Befehl, mit dem Sie Ihr Mapping definiert haben.
- Was erwarten Sie von Ihrem Mapping?
Eine genaue Beschreibung des Problems:
"Es funktioniert nicht" ist für Leute, die versuchen, Ihnen zu helfen, nicht wirklich hilfreich. Sie sollten genau festlegen, ob das Mapping nichts bewirkt oder wie es sich anders verhält, als Sie es erwartet haben.
- Geben Sie außerdem an, dass Sie die hier beschriebenen Schritte und die Ergebnisse, die Sie mit
:map
und erhalten , tatsächlich befolgt haben:verbose map
All dies spart Ihnen und den Benutzern der Website viel Zeit.
Ein nützlicher Befehl: :unmap
Manchmal kann es nützlich sein, eine Zuordnung zurückzusetzen, ohne Vim zu beenden, um das Debuggen des Verhaltens zu unterstützen.
Verwenden Sie dazu den Befehl, mit :unmap <key>
dem die Zuordnung entfernt wird, die <key>
für die Modi Normal, Visual und Operating Pending zugewiesen wurde . :iunmap
entfernt die Zuordnungen für den Einfügemodus. Für andere Modi siehe :help :unmap
.
Verweise
Eine exzellente Einführung in das Mapping: learnvimscriptthehardway (und viele andere Aspekte von Vim)
Der Doc: :h mapping
,
:h :map
In Abschnitt 20 der FAQ von Vim geht es um die Zuordnung und enthält interessante Fragen:
Und ein Bonus: Eine Frage zu bewährten Methoden, um herauszufinden, welche Schlüssel in Ihrem Mapping verwendet werden sollen
I see a lot of questions on here where a user has a mapping which doesn't work and most of the time the reasons are pretty similar
wie ich in der ersten Zeile meiner Frage sagte, das Sammeln dieser Gründe es ermöglichen sollte, die Anzahl der doppelten Fragen zur Zuordnung zu reduzieren.<m-i>
undé
sind für vim, und es ist das gleiche mit allen Meta - Taste +: sie zu einem anderen diakritischen zugeordnet sind.:map {sequence}
->*
in dem, was vim vor der zugehörigen Aktion druckt, gibt es eine umgekehrte Hervorhebung.:debug normal {keysequence}
(ohne Knall) oder:debug i{keysequence}
für Einfügemodus Mappings etc. Wenn die Tastenfolge Dinge wie spezielle Tasten enthält (<cr>
,<left>
,<c-x>
,<m-i>
,<leader>
...). Dann müssen wir mit execute + double-quotes + backslash -> spielen:debug execute "normal \<leader>\<cr>Z"
.<m-i>
. Die meisten Benutzer verwenden den Metaschlüssel nicht, da sie stark darauf ausgerichtet sind, Vim im Terminal auszuführen - wobei der Metaschlüssel nicht einfach verwendet werden kann. Wir müssen gvim oder macvim verwenden, um das Problem zu erkennen.