matchits %
/ g%
sind einfach genug zu verwenden, aber ich habe Probleme, die anderen Zuordnungen zu verstehen, die möglicherweise nützlich klingen, aber nicht verständlich zu funktionieren scheinen.
]% Go to [count] next unmatched group, as specified by
|b:match_words|. Similar to |]}|.
Ich würde erwarten , dass dies mir vielleicht damit springen endif
, endfunction
usw. Nehmen Sie das folgende vimscript Beispiel des eingebauten in vim ftplugin mit ( b:match_words
erscheint Set zu sein.)
function! SuperTab()
let l:part = strpart(getline('.'),col('.')-2,1)
if (l:part=~'^\W\?$')
return "\<Tab>"
else
return "\<C-n>"
endif
endfunction
[%
Die meiste Zeit springt man zum function!
, springt gelegentlich (uneinheitlich abhängig von der Cursorposition) zum if
und ignoriert (
s völlig . ]%
springt zu )
s und sonst nichts. va%
verhält sich [%
in diesem Beispiel identisch und wählt nichts aus. Ist das normales Verhalten? Gibt es ein Beispiel, in dem diese Zuordnungen sinnvoll sind?
]%
macht fast nichts. Ich muss mir den Code ansehen.va%
((( )))
"expandieren" jedoch nicht nach wiederholtena%
. Ich bin mir nicht sicher, ob Vim es jemals getan hat, aber imo sollte esa(
.Antworten:
Ich gehe davon aus, dass Sie die neueste
matchit
Plugin-Version 1.13.3 verwenden, die ich derzeit im Github-Repository von Vim finden kann.Wenn Sie drücken
[%
, wird dies:MultiMatch()
Funktion aufgerufen. Am Ende des letzteren befindet sich einewhile
Schleife, deren Anzahl von Iterationen istv:count1
. Diese Variable speichert die Anzahl für den letzten normalen Befehl. Hier sollte es sein1
, weil Sie vorher keine Nummer getroffen haben[%
. In der Mitte der Funktion werden jedoch einige:normal
Befehle ausgeführt, um die Bildschirm- und Cursorposition zu speichern. Diese normalen Befehle ändern den Wert vonv:count1
.Sie können dies folgendermaßen überprüfen:
Geben Sie diesen Code ein und drücken Sie
cd
, lesen Sie Ihre Nachrichten (:messages
): Sie sollten sehen1
, weil Sie zuvor keine Nummer getroffen habencd
. Geben Sie nun diesen Code ein:Und machen Sie das gleiche Experiment, drücken Sie
cd
eine Datei mit mehr als 3 Zeilen ein. Diesmal sollten Sie in den Nachrichten3
nicht sehen1
.Aus diesem Grund wird die
searchpair()
Funktion in der Schleife zu oft aufgerufen, was, wie ich vermute, das von Ihnen beschriebene Verhalten erklärt. Zumindest auf meinem Computer (Linux, Vim-8.0
Patches1-134
).Um dies zu beheben, können Sie die Zeile 729 löschen :
Und verschieben Sie es am Anfang der Funktion (bevor andere Befehle, einschließlich
:normal
Befehle, geändert werden könnenv:count1
):Dies liegt wahrscheinlich an der Pull-Anfrage Nr. 5124 , die neovim vor einem Jahr zusammengeführt hat. Laut
matchit
der Festschreibungsnachricht sollte verhindert werden , dass ein unerwünschter Eintrag in die Jumplist eingefügt wird. Um dies zu lösen, wurde durch das Festschreiben geändert, wie die Bildschirm- und Cursorpositionen gespeichert wurden. Es werden keine:normal
Befehle mehr verwendet, sondern die Funktionwinsaveview()
und aufgerufenwinrestview()
. Indem sie sie:normal
für einen anderen Zweck loswerden , haben sie auch das zuvor beschriebene Problem behoben, dav:count1
es nicht mehr geändert wird. Obwohl es in Zukunft sein könnte, wenn einige Befehle in der Mitte der Funktion hinzugefügt werden.Gegen Ende der
s:MultiMatch()
Funktion, Zeile 722 , wird das Muster, das den Endteil einer Gruppe von Token beschreibt, wie folgt definiert:Der Zweck der Ersetzung besteht darin, jedes Komma, das zwei aufeinanderfolgende Gruppen von Token trennt, durch einen doppelt maskierten Balken zu ersetzen, der von Vims Regex-Engine als Wechsel (Trennung zwischen zwei Zweigen) interpretiert wird. Ich denke, dass die Substitution auch die Doppelpunkte ersetzen sollte, die
:
die Token in jeder Gruppe trennen. Sie können die Ersetzung also folgendermaßen umschreiben:]%
Bewegen Sie mit dieser Änderung den Cursor auf die verschiedenen Token, die inb:match_words
und&l:matchpairs
nicht nur beschrieben sind)
. Zumindest auf meiner Maschine.Bei den vorherigen Änderungen, insbesondere bei der zweiten,
va%
sollte der Text zwischen den beiden umgebenden Token ausgewählt werden. Obwohl das Plugin einen mittleren Teil einer Gruppe von Token (wieelse
inif|else|endif
) als Endteil zu behandeln scheint (es wirdsearchpair()
durch sein drittes Argument übergeben, nicht durch sein zweites). Was Sie als umgebende Token betrachten, kann Sie manchmal überraschen.Derzeit ist die visuelle Zuordnung
a%
in Zeile 71 wie folgt definiert :Wenn ich
o
am Anfang von hinzufüge{rhs}
, um den Cursor an den Anfang der Auswahl zu bewegen (:h v_o
), erhalte ich das gewünschte Verhalten:Hier ist eine Version des
matchit
Plugins mit den 3 kleinen Änderungen, die bisher beschrieben wurden.Und hier ist noch eine, bei der ich versucht habe, auch die PR # 5124 von Neovim aufzunehmen.
Wenn Sie den Code auf Ihrem Computer testen möchten, aber nicht die Rechte haben, das Standard-
matchit
Plugin zu ändern (oder nicht möchten), können Sie die Datei erstellen~/.vim/plugin/matchit.vim
und dort Ihr experimentellesmatchit
Plugin schreiben .Da in der runtimepath,
~/.vim
bevor kommt$VIMRUNTIME
, soll Vim Ihre benutzerdefinierte Version vor einer Standard beziehen. Und da hat das Standard-Plugin den Schutz:... nur Ihre Version sollte vollständig bezogen sein.
quelle
]%
undv_a%
Zuordnungen zu diskutieren, die ein wenig geändert werden könnten.