Wie kann ich ein Mapping debuggen?


66

Ich sehe hier viele Fragen, bei denen ein Benutzer ein Mapping hat, das nicht funktioniert, und die Gründe dafür sind meistens ziemlich ähnlich.

Ich schlage vor, diese Frage als Referenz für diese Art von Fragen zu verwenden, um eine vollständige Prozedur zum Debuggen einer Zuordnung anzugeben. Wenn ein Benutzer ein Problem mit einer Zuordnung hat, kann er hierher umgeleitet werden, um die häufigsten Probleme zu beheben.

Natürlich wird es immer noch Sonderfälle geben, die eine spezielle Frage erfordern und hier nicht angesprochen werden.

Antworten:


89

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:

Ergebnis von <code>: map </ code>

Wie immer ist der Doc dein Freund: :h map-listing

In der ersten Spalte sehen Sie den Modus der Zuordnung ( nfür den normalen Modus, vfü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 norespä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, :omapusw.

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 :mapBefehls 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, .vimrcund der zweite eine Zuordnung, die von einem Plugin erstellt wurde:

Kartensatz von vimrc

Mapping-Set aus einem Plugin

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 .vimrcDatei ü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 :mapzeigt 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.confwenn 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 .vimrcdie Zuordnung nnoremap <Leader>x :wals Quelle angeben, wird der externe Befehl !% python -m json.toolsausgefü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, vmapusw ... bevorzugen immer die nore Version: noremap, nnoremap, vnoremapusw ... Warum? noreSteht für non-recursiveMapping, 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 :mapund 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 . :iunmapentfernt 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


2
Um meine Erfahrungen mit anderen Nutzern zu teilen, schlug unser Moderator vor, dies zu tun . Und weil, 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 similarwie 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.
Statox

1
Ein wiederkehrendes Problem mit vim-Latex und Französisch Tastaturen: <m-i>und ésind für vim, und es ist das gleiche mit allen Meta - Taste +: sie zu einem anderen diakritischen zugeordnet sind.
Luc Hermitte

1
Es ist auch wichtig zu wissen, wie man pufferlokale Zuordnungen liest, wenn wir nach ihrer Definition fragen mit :map {sequence}-> *in dem, was vim vor der zugehörigen Aktion druckt, gibt es eine umgekehrte Hervorhebung.
Luc Hermitte

2
Manchmal wollen wir wirklich debuggen, was passiert. In der Regel, wenn das Mapping ein Plug-Mapping oder eine Funktion mit einem Namen aufruft, an den man sich nicht erinnern kann, oder mit komplexen Parametern. In diesem Fall können wir ausführen: :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".
Luc Hermitte

2
In Bezug auf Meta-Sequenzen ist dies ein alter Punkt der FAQ, da vim-latex Dinge wie verwendet hat <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.
Luc Hermitte
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.