Wie kann ich Text in der Mitte der Zeile in mehrere Zeilen in Vim einfügen?

91

Angenommen, ich habe zehn Zeilen und möchte einem Wort, das in diesen Zeilen vorkommt, Text voranstellen. Es muss nicht am Anfang der Zeile stehen.

Von:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

zu:

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

Ist es auch möglich, nicht nur prepend die bar(aber eigentlich Surround foomit bar(foo)?

Ich möchte auch eine schnelle Möglichkeit, //Kommentare an mehrere Zeilen anzuhängen ( Kommentare im C-Stil).

Ich benutze Vim / GVim 7.2.

Allen
quelle
1
Kommentare im C-Stil sind / * * / Kommentare im BCPL-Stil sind //
William Pursell

Antworten:

169

Gehen Sie zum ersten foo, drücken Sie Ctrl- v, um den visuellen Blockmodus aufzurufen, und drücken Sie, bis alle Zeilen mit foomarkiert sind. Drücken Sie dann Shift- i, um am Anfang (des Blocks) einzufügen. Wenn Sie fertig sind und drücken Esc, werden die eingefügten Zeichen zu jeder Zeile links vom markierten Block hinzugefügt.

Um am Ende einzufügen, drücken Sie erneut Ctrl- v, bewegen Sie sich nach oben / unten, um alle betroffenen Zeilen zu markieren, und drücken Sie dann Endoder $, um die Auswahl bis zum Ende der Zeilen zu erweitern. Jetzt können Sie drücken Shift- aam Ende aller Zeilen anhängen, wie zuvor mit Shift- i.

Die visuelle Auswahl kann auch mit normalen Bewegungsbefehlen erfolgen. Um einen ganzen Block in C zu kommentieren, können Sie zur öffnenden Klammer gehen und Ctrl- v % Shift- eingeben i // Esc.

etw
quelle
5
Nur eine Ergänzung: Wenn Strg-V den visuellen Blockmodus in Vim unter Windows nicht startet, sollte stattdessen Strg-Q verwendet werden.
Paul
3
Eine Variation der Antwort besteht darin, den visuellen Block mit Umschalt + V zu markieren und dann den Block im Ex-Modus zu ändern :: '<,'> s / ^ / prexix_text /: '<,'> s / $ / Suffix_text / Hinweis als "'< , '> "wird automatisch von vim gedruckt, wenn Sie": "drücken.
Dimba
1
Verwenden Sie zum Kommentieren einen visuellen Block (markieren Sie mit Strg + V). Wenn die Spalte mit dem Kommentarzeichen "//" markiert ist, drücken Sie "d", um die Kommentare zu entfernen. Vergessen Sie nicht auch C ++ Kommentare (/ ** /) :)
dimba
9
Es ist erwähnenswert, dass ich unter Linux den Einfügemodus verlassen musste, bevor das Präfix auf alle Zeilen angewendet wurde, und es ist ein Kapital, das ich brauchte, um vom visuellen Modus in den Einfügemodus zu wechseln - dh Umschalt + I, Präfix eingeben, Escape, Escape.
Joshua Enfield
6
Dies funktioniert nicht bei Kitt. Wenn ich drücke i, passiert nichts. Wenn ich drücke, shift+iverschwindet die Auswahl, aber ich kann Text einfügen (an der aktuellen Stelle, an der sich nur der Cursor befindet).
Jürgen Paul
44

Um Ihre erste Frage zu beantworten, klicken Sie unten

:%s/foo/bar(&)/g

wird nach foodem passenden Muster suchen und es umgeben bar(). Das /gwird dies mehrmals in einer Zeile tun.

Da Sie nur übereinstimmen foo, können Sie eine einfache machen :s/foo/bar(foo)/g. Das Obige funktioniert jedoch, wenn Sie sich dafür entscheiden, einen regulären Ausdruck anstelle eines einfachen Wortes (z f[a-z][a-z]. B. ) zu verwenden. Das '&' oben steht für das, was Sie gefunden haben.

Brian Agnew
quelle
Ich hatte eine lange Antwort mit Makros. Das ist viel einfacher :-)
Brian Ramsay
Wie machst du das für mehrere Zeilen? Ein praktischer Fall ist, wenn Sie einen Codeblock haben, der aus ähnlichen Zeilen besteht, die diese Ersetzung erfordern.
Es sieht sicher so aus, als würde es in allen Zeilen funktionieren ... beachten Sie:% s und / g.
Ojrac
Interessant ist Folgendes:% s / foo / bar (&) / gc bestätigt nicht - 'c' hat keine Auswirkung. Ugh
1
Der Text zwischen dem :und dem sbestimmt, auf welchen Zeilen gearbeitet wird. Nichts bedeutet nur die aktuelle Zeile. 1,30bedeutet Zeilen 1 bis 30 (einschließlich). '<,'>bedeutet die Linien in der aktuellen visuellen Auswahl.
Rampion
17

Um eine Reihe von Zeilen voranzustellen, verwende ich einen von zwei verschiedenen Ansätzen:

Ein Ansatz ist die Blockauswahl (von etw erwähnt). Im Allgemeinen können Sie einen rechteckigen Bereich auswählen, ctrl-Vgefolgt von einer Cursorbewegung. Wenn Sie ein Rechteck markiert haben, werden durch Drücken shift-IZeichen auf der linken Seite des Rechtecks shift-Aeingefügt oder auf der rechten Seite des Rechtecks ​​angehängt. Mit dieser Technik können Sie also ein Rechteck erstellen, das die am weitesten links stehende Spalte der Zeilen enthält, die Sie voranstellen, drücken shift-I, das Präfix eingeben und dann die Escape- Taste drücken möchten .

Der andere Ansatz ist die Verwendung einer Substitution (wie von Brian Agnew erwähnt). Brians Ersetzung wirkt sich auf die gesamte Datei aus (das% im Befehl bedeutet "alle Zeilen"). Um nur wenige Zeilen zu beeinflussen, ist es am einfachsten, in shift-Vder ersten / letzten Zeile zu drücken (wodurch der visuelle Zeilenmodus aktiviert wird) und dann zur letzten / ersten Zeile zu wechseln. Geben Sie dann Folgendes ein:

:s/^/YOUR PREFIX/

Das ^ ist ein regulärer Ausdruck (in diesem Fall der Zeilenanfang). Wenn Sie dies im visuellen Linienmodus eingeben, wird '<,'> automatisch vor dem s eingefügt. Dies bedeutet, dass der Bereich der Substitution die visuelle Auswahl ist.

Zusätzlicher Tipp: Wenn Ihr Präfix Schrägstriche enthält, können Sie diese entweder mit einem umgekehrten Schrägstrich maskieren oder ein anderes Interpunktionszeichen als Trennzeichen im Befehl verwenden. Um beispielsweise C ++ - Zeilenkommentare hinzuzufügen, schreibe ich normalerweise:

:s:^:// :

Zum Hinzufügen eines Suffix ist der Substitutionsansatz im Allgemeinen einfacher, es sei denn, alle Ihre Zeilen haben genau die gleiche Länge. Verwenden Sie einfach $ für das Muster anstelle von ^ und Ihre Zeichenfolge wird angehängt anstatt vorangestellt.

Wenn Sie gleichzeitig ein Präfix und ein Suffix hinzufügen möchten, können Sie Folgendes tun:

:s/.*/PREFIX & SUFFIX/

Das. * Entspricht der gesamten Zeile. Das & in der Ersetzung setzt den übereinstimmenden Text (die gesamte Zeile) zurück, aber jetzt werden Ihr Präfix und Suffix hinzugefügt.

Übrigens: Wenn Sie Code auskommentieren, möchten Sie ihn wahrscheinlich später auskommentieren. Sie können Visual-Block ( ctrl-V) verwenden, um die Schrägstriche auszuwählen, und dann d drücken, um sie zu löschen, oder Sie können eine Substitution (wahrscheinlich mit einer visuellen Linienauswahl, erstellt mit shift-V) verwenden, um die führenden Schrägstriche wie folgt zu entfernen:

:s:// ::
Laurence Gonsalves
quelle
6

: normal zur Rettung!

:%norm Wibar(

:%norm WEa)

: norm (al) spielt die Befehle so ab, als hätten Sie sie eingegeben:

W - geht zum nächsten Wort

i - Startet den Einfügemodus

bar (- gibt die Sequenz 'bar (' ein)

Oder in einer Zeile:

:%norm Wibar(ctrlvESCEa)

Wenn Sie Windows ausführen, geben Sie ctrlqstatt ein ctrlv.

Cyber ​​Oliveira
quelle
3

Eine weitere Möglichkeit (wahrscheinlich nicht so nützlich in Ihrem Testfall, aber praktisch in anderen Situationen) besteht darin, den Bereich, den Sie ändern möchten, mit Markierungen abzusperren.

  • Setzen Sie den Cursor irgendwo in die oberste Zeile und drücken Sie 'a
  • Setzen Sie den Cursor an eine beliebige Stelle in der letzten Zeile und drücken Sie 'b
  • Geben Sie den Befehl ein :'a,'b s/foo/bar(&)/

Normalerweise mag ich den visuellen Blockmodus, wenn alles auf dem Bildschirm sichtbar ist, und ich bevorzuge normalerweise Markierungen, wenn Start und Stopp durch viele Bildschirme getrennt sind.

Godfrey Parke
quelle
Es sollte mstatt 'einen neuen Marker setzen. 'dient zum Springen zur Linie eines vorhandenen Markers. `Springt zur Zeile und Spalte dieses Markers.
Tiktak
1

Ein anderer einfacher regulärer Ausdruck ist:

%s/^/<text you want to prepend>/
Artorias2718
quelle
0

Verwenden Sie für die Kommentare im C-Stil die Regexp-Antwort von Brian, stimmen Sie mit dem Zeilenende überein $und fügen Sie sie ein.

maxwellb
quelle