Wie füge ich Text am Ende jeder Zeile in Vim hinzu?

116

In Vim habe ich folgenden Text:

key => value1
key => value2
key => value1111
key => value12
key => value1122222

Ich möchte am Ende jeder Zeile "," hinzufügen. Der vorherige Text wird wie folgt aussehen:

key => value1,
key => value2,
key => value1111,
key => value12,
key => value1122222,

Weiß jemand, wie man das macht? Ist es möglich, den visuellen Blockmodus zu verwenden, um dies zu erreichen?

Grace Shao
quelle
Ähnliche Frage hier .
glitzert

Antworten:

163

Dies wird es für jede Zeile in der Datei tun:

:%s/$/,/

Wenn Sie anstelle der gesamten Datei eine Teilmenge von Zeilen erstellen möchten, können Sie diese anstelle von angeben %.

Eine Möglichkeit besteht darin, eine visuelle Auswahl vorzunehmen und dann die einzugeben :. Es wird :'<,'>für Sie ausgefüllt, dann geben Sie den Rest ein (Beachten Sie, dass Sie nur hinzufügen müssen s/$/,/)

:'<,'>s/$/,/
Alan Curry
quelle
4
Die letzte Reihe hat ein Extra ', sollte sein :'<,'>s/$/,/.
cjg
warum braucht man keine g? ( :'<,'>s/$/,/g)
Thorbjørn EK Christensen
@ ThorbjørnE.K.Christensen weil da /$/sowieso nur einmal übereinstimmt.
Bubaya
156

Es gibt tatsächlich eine Möglichkeit, dies im visuellen Blockmodus zu tun. Durch $Aeinfaches Drücken im visuellen Blockmodus wird das Ende aller Zeilen in der Auswahl angehängt. Der angehängte Text wird in allen Zeilen angezeigt, sobald Sie drücken Esc.

Das ist also eine mögliche Lösung:

vip<C-V>$A,<Esc>

Das heißt, im normalen Modus wählt Visual einen Absatz aus vip, wechselt in den visuellen Blockmodus CTRLV, hängt an alle Zeilen $Aein Komma an ,und drückt dann Esczur Bestätigung.

Die Dokumentation ist bei :h v_b_A. Im Beispielabschnitt finden Sie sogar eine Illustration, wie es funktioniert : :h v_b_A_example.

glänzt
quelle
1
Nein, dies ist Standard-Vim: Wählen Sie einige Zeilen im visuellen Blockmodus (mit C-V) aus, bewegen Sie den Cursor an das Zeilenende $und hängen Sie sie an alle an A. Du wirst lieben :h v_b_A, was wirklich gründlich ist.
glitzert
1
Oh, ich sehe was los ist! Normalerweise benutze ich Strg-C anstelle von <Esc>, um den Einfügemodus zu verlassen, und anscheinend funktioniert dies mit Strg-C nicht! Wie seltsam.
Weronika
3
Sie können einen Tastenanschlag speichern, indem Sie <C-V>ipanstelle von verwenden vip<C-V>.
Aaron Thoma
1
@accolade, wechselt auf diese Weise nicht in den visuellen Blockmodus und funktioniert nicht. <CV> muss danach erneut auftreten, wenn Sie dies auf diese Weise tun.
ImagineerThat
@imagineerThat, seltsam - es funktioniert für mich - muss auf eine nicht standardmäßige Option zurückzuführen sein. (Nicht 'virtualedit'- das habe ich getestet.) Ich bestätige, dass es in einem sauberen Vim nicht funktioniert. Danke für den Hinweis!
Aaron Thoma
44

Eine andere Lösung mit einer weiteren großartigen Funktion:

:'<,'>norm A,

Siehe :help :normal.

romainl
quelle
1
@Schweiz, dann wird dir dieser Kommentar gefallen .
Romainl
1
@Schweiz, vielleicht gefällt dir auch udiocas Exposé auf :normal. Ich fand es informativ!
Conner
1
Wusste nichts von diesem Subreddit. Vielen Dank.
Romainl
32

Ex-Modus ist am einfachsten:

:%s/$/,

: - enter command mode
% - for every line
s/ - substitute
$ - the end of the line
/ - and change it to
, - a comma
Ned Batchelder
quelle
10

Der Ersatzbefehl kann auf eine visuelle Auswahl angewendet werden. Erstellen Sie einen visuellen Block über den Zeilen, die Sie ändern möchten, und geben Sie ein. Beachten Sie dabei :, dass die Befehlszeile wie folgt initialisiert wird : :'<,'>. Dies bedeutet, dass der Ersatzbefehl die visuelle Auswahl wie folgt bearbeitet:

:'<,'>s/$/,/

Und dies ist eine Ersetzung, die für Ihr Beispiel funktionieren sollte, vorausgesetzt, Sie möchten wirklich das Komma am Ende jeder Zeile, wie Sie erwähnt haben. Wenn nachgestellte Leerzeichen vorhanden sind, müssen Sie den Befehl möglicherweise entsprechend anpassen:

:'<,'>s/\s*$/,/

Dadurch wird eine beliebige Anzahl von Leerzeichen vor dem Zeilenende durch ein Komma ersetzt, wodurch nachfolgende Leerzeichen effektiv entfernt werden.

Dieselben Befehle können in einer Reihe von Zeilen ausgeführt werden, z. B. für die nächsten 5 Zeilen: :,+5s/$/,/oder für den gesamten Puffer : :%s/$/,/.

pb2q
quelle
3

Wenn Sie am Ende der Zeilen, die mit 'key' beginnen, ',' hinzufügen möchten, verwenden Sie:

:%s/key.*$/&,
Kinderschienen
quelle
Oder :g/key/s/$/,. Siehe :help :global.
Romainl
2

Ich habe <M-DOWN>(Alt-Abwärtspfeil) zugeordnet, <DOWN>.damit ich den letzten Befehl in einer Reihe von Zeilen sehr schnell wiederholen kann. Mit diesem Mapping kann ich:

A,<ESC>

Halten Sie dann die Alt-Taste gedrückt, während Sie wiederholt nach unten drücken, um das Komma an das Ende jeder Zeile anzuhängen.
Dies funktioniert gut für mich, da es eine sehr gute Kontrolle darüber ermöglicht, welche Zeilen die Änderung bewirken und welche nicht.
(Ich habe auch die anderen Pfeile ähnlich zugeordnet, um ein einfaches Wiederholen zu ermöglichen. )

Hier ist die Zuordnungszeile, die Sie in Ihr vimrc einfügen können:

map <M-DOWN> <DOWN>.
Sam Brinck
quelle
1
:%s/$/,/g

$ entspricht dem Zeilenende

Kalhartt
quelle
2
Das wird $nicht nur zur Linie beitragen ,.
ZyX
2
/gwird verwendet, um die Ersetzung bei jedem Auftreten in einer Zeile durchzuführen. Da es nur einen $in einer Zeile gibt, können Sie ihn sicher fallen lassen.
Romainl
Ja mein Fehler auf dem, $. und das / g ist von habbit, und ja, es ist optional.
Kalhartt
1

Das folgende Makro kann auch verwendet werden, um Ihre Aufgabe zu erfüllen.

qqA,^[0jq4@q
dvk317960
quelle