Subversive bietet zwei neue Bedienerbewegungen, um schnelle Ersetzungen sehr einfach durchzuführen. Es enthält keine Standardzuordnungen und hat keine Wirkung, bis Sie Ihre eigenen Karten hinzufügen.
Sehen Sie sich auch hier um, wenn Sie statt des folgenden Textes lieber eine Video-Erklärung dieses Plugins ansehen möchten.
Beispielkonfiguration:
" s for substitute
nmap s <plug> (SubversiveSubstitute)
nmap ss <plug> (SubversiveSubstituteLine)
nmap S <plug> (SubversiveSubstituteToEndOfLine)
Beachten Sie, dass Sie in diesem Fall die Änderungszeichentaste s
schattieren, sodass Sie die längere Form cl
verwenden müssen
Nachdem Sie diese Karten hinzugefügt haben, können Sie s<motion>
ausführen, um das von der Bewegung bereitgestellte Textobjekt durch den Inhalt des Standardregisters (oder eines expliziten Registers, falls vorhanden) zu ersetzen. Sie könnten beispielsweise siw
ausführen, um das aktuelle Wort unter dem Cursor durch den aktuellen yank zu ersetzen, oder sip
, um den Absatz usw. zu ersetzen.
Ein weiterer interessanter Operator von subversive ermöglicht die Angabe sowohl des zu ersetzenden Textes als auch des Zeilenbereichs, auf den die Änderung angewendet werden soll, indem mehrere aufeinanderfolgende Bewegungen verwendet werden.
Beispielkonfiguration:
nmap <leader> s <plug> (SubversiveSubstituteRange)
xmap <leader> s <plug> (SubversiveSubstituteRange)
nmap <leader> ss <plug> (SubversiveSubstituteWordRange)
Wenn Sie nach dem Hinzufügen dieser Karte <leader>s<motion1><motion2>
ausführen und dann Text in eine Eingabeaufforderung in der Statusleiste eingeben, sollte der von motion1
angegebene Text durch den Text ersetzt werden, den wir in der Eingabeaufforderung für jede Zeile eingegeben haben bereitgestellt von motion2
. Alternativ können wir auch motion1
im visuellen Modus auswählen und dann <leader>s<motion2>
drücken, um den gleichen Effekt zu erzielen.
Das kann sehr mächtig sein. Beispielsweise könnten Sie <leader>siwip
ausführen, um alle Vorkommen des aktuellen Worts unter dem Cursor zu ersetzen, die innerhalb des Absatzes unter dem Cursor vorhanden sind. Oder <leader>sl_
um alle Vorkommen des Zeichens unter dem Cursor in der aktuellen Zeile zu ersetzen.
Die <leader>ss
-Zuordnung wird als Abkürzung verwendet, um das aktuelle Wort unter dem Cursor zu ersetzen. Dadurch können Sie beispielsweise <leader>ssip
ausführen, um das Wort unter dem Cursor im aktuellen Absatz zu ersetzen. Beachten Sie, dass dies vollständige Wörter abdeckt und sich daher von <leader>siwip
unterscheidet (was nicht erfordert, dass es bei jedem Treffer Wortgrenzen gibt).
Sehen wir es uns in Aktion an:
In diesem GIF benennen wir zuerst den lokalen foo
Parameter um, indem wir <leader>ssom
ausführen und dann bar
in die Eingabeaufforderung eingeben (beachten Sie, dass om
eine benutzerdefinierte Bewegung ist, die für „äußere c#-Methode“ steht und von diesem Plugin nicht bereitgestellt wird). Beachten Sie außerdem, dass der Text _foos
nicht betroffen ist, da wir <leader>ss
verwenden, da er nicht mit dem vollständigen Wort übereinstimmt. Dies ist in diesem Fall nützlich, da wir nur den Parameter innerhalb der Funktion umbenennen möchten.
Danach wechseln wir in den visuellen Modus und wählen den foo
Teil _foos
aus, führen dann <leader>sie
aus und geben erneut bar
in die Eingabeaufforderung ein. ie
handelt sich wiederum um eine benutzerdefinierte Bewegung, die für entire buffer
steht (Einzelheiten finden Sie im nächsten Abschnitt).
Danach gehen wir zum Foo
-Teil von AddFoo
und führen <leader>seie
aus und geben erneut Bar
ein. Machen Sie dann schließlich dasselbe für das vollständig großgeschriebene FOOS
.
Beachten Sie, dass Sie bei Verwendung von neovim die Option inccommand
aktivieren können, um während der Eingabe eine Echtzeitvorschau der Ersetzung zu erhalten (entspricht der Einstellung g:subversivePromptWithActualCommand
auf 1
).
Beachten Sie auch, dass diese Bewegung wiederholbar ist. Wenn Sie <leader>siwip
in einem Absatz ausführen, gehen Sie dann zu einem anderen Absatz und drücken Sie dann .
dann wird die gleiche Ersetzung auf den neuen Absatz unter dem Cursor angewendet.
Beachten Sie, dass es hilfreich ist, zusätzlich zu den integrierten Textobjekten wie aktueller Absatz ( ip
), aktueller Satz ( is
) oder aktuelle Zeile ( _
) benutzerdefinierte Textobjekte hinzuzufügen, um diese Zuordnungen wirklich nutzen zu können. Benutzerdefinierte Textobjekte wie die aktuelle Einrückungsebene, die aktuelle Methode, die aktuelle Klasse, der gesamte Puffer, die aktuelle Bildlaufseite usw. können hier sehr hilfreich sein.
Ein paar wirklich einfache Bewegungen, die für Subversive nützlich sind, sind zum Beispiel:
" ie = inner entire buffer
onoremap ie :exec "normal! ggVG" <cr>
" iv = current viewable text in the buffer
onoremap iv :exec "normal! HVL" <cr>
Es gibt auch andere Plugins, die viele benutzerdefinierte Textobjekte bereitstellen, und ich würde empfehlen, einen Blick darauf zu werfen.
Bei vielen Ersetzungen können Sie sich auf die Hervorhebungsvorschau verlassen, um zu verstehen, was ersetzt wird. Wenn Sie jedoch eine größere Ersetzung in der gesamten Datei vornehmen, möchten Sie möglicherweise jede einzelne Datei bestätigen. Sie können dies mit den folgenden Karten tun:
nmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
xmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
nmap <leader> css <plug> (SubversiveSubstituteWordRangeConfirm)
Diese funktionieren genauso wie die <leader>s
-Karten oben, außer dass jede Ersetzung einzeln durchgegangen wird.
Wenn Sie für einen der oben genannten Ersatzanträge ein explizites Register angeben, erfolgt keine Eingabeaufforderung, sondern es wird der Inhalt des angegebenen Registers verwendet. Beispiel: "a<leader>siwip
ersetzt sofort alle Instanzen des aktuellen Worts unter dem Cursor durch den Inhalt des Registers a
das im aktuellen Absatz vorhanden ist.
Sollte dies nicht ausreichen, können Sie stattdessen auch die folgenden Stecker verwenden:
nmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
xmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
nmap <leader> ss <plug> (SubversiveSubstituteWordRangeNoPrompt)
Dies funktioniert genauso wie die vorherigen Plugs, außer dass anstelle einer Eingabeaufforderung das Standardregister verwendet wird.
Sie können dies tun, indem Sie das Black-Hole-Register an einen der Substitute-Over-Range-Befehle übergeben. Beispiel: "_<leader>siwip
“ oder "_<leader>csiwip
, wenn Sie jeden Löschvorgang bestätigen möchten.
Leider können Sie nicht einfach einen leeren Wert in die Eingabeaufforderung eingeben, da es keine Möglichkeit gibt, diese Eingabe vom Abbrechen per Escape zu unterscheiden (es sei denn, Sie setzen g:subversivePromptWithActualCommand
auf 1
, in diesem Fall funktioniert das einwandfrei).
g:subversivePromptWithCurrent
– Wenn auf 1
gesetzt, enthält die Eingabeaufforderung den Text, der ersetzt wird. Dies kann nützlich sein, wenn Sie lediglich eine Bearbeitung vornehmen möchten. Standard: 0
g:subversiveCurrentTextRegister
– Wenn festgelegt, wird das angegebene Register mit dem Text gefüllt, der ersetzt wird. Dies kann als Alternative zu g:subversivePromptWithCurrent
nützlich sein, sodass Sie <cr>r
in der Eingabeaufforderung drücken können (vorausgesetzt, Sie haben es auf 'r'
gesetzt), wenn Sie es bearbeiten möchten, und andernfalls einfach direkt eingeben können, wann Sie möchten ein vollständiger Ersatz.g:subversivePromptWithActualCommand
– Wenn der Wert auf 1
gesetzt ist, wird nicht nur zur Eingabe des Ersetzungstextes aufgefordert, sondern mit dem nativen vim-Ersetzungsbefehl. Erfahrene vim-Benutzer bevorzugen dies möglicherweise, damit sie die verschiedenen Ersetzungsflags selbst anpassen können. Standard: 0
g:subversivePreserveCursorPosition
– Wenn auf 1
gesetzt, bewegt sich der Cursor nicht, wenn Ersetzungen angewendet werden. Der Standardwert ist 0
um dem normalen Vim-Verhalten zu entsprechen. Wenn Sie auch vim-abolish installiert haben, können Sie darüber nachdenken, auch etwas Ähnliches wie die folgende Zuordnung hinzuzufügen:
nmap <leader> <leader> s <plug> (SubversiveSubvertRange)
xmap <leader> <leader> s <plug> (SubversiveSubvertRange)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRange)
Dies verhält sich genauso wie <leader>s
, mit der Ausnahme, dass ein „Abolish“-„Subvert“ ausgeführt wird, anstatt den in vim integrierten Ersatzbefehl zu verwenden. Dadurch wird die Ersetzung angewendet und auch die Groß-/Kleinschreibung des ursprünglichen Worts bleibt erhalten. Zum Beispiel:
In diesem Fall bewegen wir den Cursor über foo
, führen dann <leader><leader>seie
aus und geben dann bar
ein, wodurch alle Instanzen von foo
unabhängig von der Groß-/Kleinschreibung ersetzt werden.
Dies kann eine sehr praktische Möglichkeit sein, schnelle Umbenennungen durchzuführen.
Wie erwartet funktioniert die Zuordnung <leader><leader>ss
ähnlich, außer dass nur vollständige Wörter gefunden werden, die Wortgrenzen enthalten.
Und auch hier gibt es alternative Plug-ins, die das Standardregister anstelle einer Eingabeaufforderung verwenden, wenn Sie das bevorzugen:
nmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
xmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRangeNoPrompt)
Beachten Sie, dass, wenn Sie vim-yoink zusammen mit vim-subversive installieren, die Post-Paste-Yoink-Austauschfunktion automatisch auch mit subversiven (Einzelbewegungs-)Ersetzungen funktioniert. Mit anderen Worten: Unter Annahme der Standardzuordnungen können Sie siw
ausführen und dann <cn>
/ <cp>
drücken, um zwischen verschiedenen Yanks aus dem Yoink-Verlauf zu wechseln.
Subversive bietet auch einen Plug zum Ersetzen des Einfügens im visuellen Modus, um auch dort den Austausch nach dem Einfügen zu ermöglichen:
xmap s <plug> (SubversiveSubstitute)
xmap p <plug> (SubversiveSubstitute)
xmap P <plug> (SubversiveSubstitute)
Wenn Sie nun im visuellen Modus p
drücken, können Sie zwischen den Yanks wechseln, genau wie beim Einfügen im normalen Modus.