Ich habe folgendes in meinem vimrc:
func! AddSpaceBeforeEqual()
s/\([a-z)_0-9"'\[\]]\)=/\1 =/ge
endfunc
Ich benutze vint, um mein vimrc zu fusseln, und habe die folgende Warnung erhalten:
ProhibitCommandWithUnintendedSideEffect Vermeiden Sie Befehle mit unbeabsichtigten Nebenwirkungen. Vermeiden Sie die Verwendung von: s [ubstitute], da dies den Cursor bewegt und Fehlermeldungen druckt. Bevorzugen Sie Funktionen (wie search ()), die besser für Skripte geeignet sind. Für viele vim-Befehle gibt es Funktionen, die dasselbe mit weniger Nebenwirkungen tun. Unter: help functions () finden Sie eine Liste der integrierten Funktionen. Google Vimscript Style Guide
Ich denke jedoch nicht, dass dies eine Möglichkeit ist, die Ersetzung ohne Verwendung des :s
Befehls durchzuführen.
Zum Beispiel gibt die search()
Funktion die Linien an, die einem Muster entsprechen, aber es gibt keine Möglichkeit, eine Substitution durchzuführen. Die substitute()
Funktion arbeitet mit einer Zeichenfolge und ersetzt nicht eine ganze Datei.
Sollte ich selbst eine Ersatzmethode implementieren oder ist dies eine intelligentere Möglichkeit, meine Funktion neu zu schreiben?
quelle
:help function-search-undo
Hier ist eine vereinfachte Implementierung Ihrer Funktion, geschrieben mit
substitute()
:Passen Sie das Suchmuster nach Geschmack an.
quelle
Der
:s
Befehl ist ein reiner Vimscript-Ansatz.Ich vermute, die Warnung bedeutet nur, dass der Cursor höchstwahrscheinlich nach seiner Verwendung falsch positioniert wird (was Sie umgehen können, indem Sie die
winsaveview()
Funktion vor und denwinrestview()
Befehl nach seiner Verwendung verwenden). Außerdem müssen Sie sich um mögliche Fehler kümmern, die auftreten können. Dies wird normalerweise mithilfe dese
Flags erledigt . Außerdem muss man sich um einige Einstellungen kümmern, wie zum Beispiel diegdefault
Einstellung, die die Bedeutung desg
Flags umkehrt .Man muss sich um diese Besonderheiten kümmern und das ist wahrscheinlich die Hauptursache für diese Warnungen. Dies bedeutet jedoch nicht, die Verwendung des
:s
Befehls zu vermeiden . Es ist vollkommen in Ordnung, den:s
Befehl zu verwenden , wenn Sie etwas im aktuellen Puffer ersetzen möchten.(Beachten Sie, dass Sie natürlich alle Zeilen durchlaufen und einen search () / getline () / setline () -Ansatz verwenden können. Dies ist jedoch normalerweise langsamer.)
quelle