So fügen Sie Text am Anfang einer mehrzeiligen Auswahl in vi / Vim ein

423

Wie füge ich in Vim Zeichen am Anfang jeder Zeile in eine Auswahl ein?

Zum Beispiel möchte ich einen Codeblock auskommentieren, indem ich //am Anfang jeder Zeile voranstelle , vorausgesetzt, das Kommentarsystem meiner Sprache erlaubt keine Blockkommentare wie /* */. Wie würde ich das machen?

Jordan Parmer
quelle

Antworten:

747
  • Drücken Sie Esc, um den Befehlsmodus aufzurufen.
  • Verwenden Sie Ctrl+ V, um den visuellen Blockmodus aufzurufen
  • Verschieben Up/ Down, um die Textspalten in den Zeilen auszuwählen, die Sie kommentieren möchten.
  • Drücken Sie dann Shift+ iund geben Sie den Text ein, den Sie einfügen möchten.
  • Drücken Sie dann Esc, warten Sie 1 Sekunde und der eingefügte Text wird in jeder Zeile angezeigt.

Weitere Informationen und Informationen finden Sie unter " Einfügen von Text in mehreren Zeilen " im Vim Tips Wiki.

Pixelbeat
quelle
6
Das einzige Problem dabei ist, dass Strg + V in GVIM überschrieben wird.
Jordan Parmer
14
Nicht für mich (unter Linux) ist es nicht
Pixelbeat
23
Sie können Strg-Q als Ersatz in gVim verwenden (wie: Hilfe, Strg-V erklärt), aber Sie müssen hjkl verwenden, um in diesem Modus zu navigieren, anstatt die Pfeiltasten
Gareth
9
Wenn Ihre Strg-V in Windows GVIM überschrieben wird, sollten Sie die globale VIMRC bearbeiten, um die Aufnahme von mswin.vim zu beenden.
Graywh
18
Irgendeine Idee, warum dies nach dem Drücken von esc nichts bewirken würde? Ich habe ungefähr 10 Sekunden darauf gewartet, dass in weniger als hundert Zeilen etwas passiert - egal, ich habe Shift + vnicht gedrückt CTRL + v. @ vkaul11 Wahrscheinlich das gleiche, was Sie getan haben lol
Tek
186

Dies ersetzt den Anfang jeder Zeile durch "//":

:%s!^!//!

Dies ersetzt den Anfang jeder ausgewählten Zeile (verwenden Sie den visuellen Modus zur Auswahl) durch "//":

:'<,'>s!^!//!

Beachten Sie, dass gv(im normalen Modus) die letzte visuelle Auswahl wiederhergestellt wird. Dies ist von Zeit zu Zeit nützlich.

Tomalak
quelle
3
Vielen Dank! Macht total Sinn. Das Entfernen des Textes erfolgt wie folgt: '<,'> s! ^ // !!
Jordan Parmer
4
Was bedeuten die Ausrufezeichen in der obigen Antwort? (:% s! ^! //!)
Henrik K
19
@HKK, normalerweise verwendet man den Schrägstrich / als Begrenzer für den Befehl zum Suchen und Ersetzen. In diesem Fall fügen wir im Rahmen der Suche und Ersetzung einen Schrägstrich ein, sodass wir einen alternativen Begrenzer verwenden, nämlich das Ausrufezeichen!
Cyber-Mönch
+1 Dies funktioniert in VsVim, wo (Strg + V) (Umschalt + I) Esc dies nicht tut.
Seth Reno
4
+1, hatte keine Ahnung , dass du etwas anderes als regex Begrenzer verwenden könnte (hier war ich mit /und die zu entkommen, die //in :s/^/\/\/anstatt zu schreiben :s!^!//)
Hashbrown
83

Das allgemeine Muster für das Suchen und Ersetzen lautet:

:s/search/replace/

Ersetzt das erste Vorkommen von 'Suche' durch 'Ersetzen' für die aktuelle Zeile

:s/search/replace/g

Ersetzt alle Vorkommen von 'Suche' durch 'Ersetzen' für die aktuelle Zeile, 'g' steht für 'global'.

Dieser Befehl ersetzt jedes Vorkommen von 'Suche' durch 'Ersetzen' nur für die aktuelle Zeile. Mit% wird die gesamte Datei durchsucht. Um jeden Austausch interaktiv zu bestätigen, fügen Sie zur Bestätigung ein 'c' hinzu:

:%s/search/replace/c

Interaktiv Bestätigen Sie das Ersetzen von 'Suche' durch 'Ersetzen' für die gesamte Datei

Anstelle des% -Zeichens können Sie einen Zeilennummernbereich verwenden (beachten Sie, dass das Zeichen '^' ein spezielles Suchzeichen für den Zeilenanfang ist) :

:14,20s/^/#/

Fügt am Anfang der Zeilen 14-20 ein '#' ein

Wenn Sie ein anderes Kommentarzeichen (wie //) verwenden möchten, ändern Sie Ihr Befehlsbegrenzer:

:14,20s!^!//!

Fügt am Anfang der Zeilen 14-20 eine Zeichenfolge '//' ein

Oder Sie können immer einfach den // Zeichen entkommen wie:

:14,20s/^/\/\//

Fügt am Anfang der Zeilen 14-20 eine Zeichenfolge '//' ein

Wenn in Ihrem Editor keine Zeilennummern angezeigt werden, geben Sie einfach Folgendes ein

:set nu
Cyber-Mönch
quelle
Um den Anfang #: anstelle von: 14,20s / # / ^ / zu entfernen, sollten Sie: 14,20s / # //
cn1h
1
@ cn1h Ich denke, dies wird auch andere #in der Zeile ersetzen . Sie sollten ^#stattdessen verwenden.
ankush981
Vielen Dank für die Erklärung der Grundlagen. Es ist gut zu wissen, warum etwas passiert.
DidierCH
38

Ein anderer Weg, der für Neulinge einfacher sein könnte:

 some█
 code
 here

Platzieren Sie den Cursor in der ersten Zeile, z

gg

und geben Sie Folgendes ein, um in den Einfügemodus zu gelangen und Ihren Text hinzuzufügen:

I / / Space

 // █some
 code
 here

Drücken Sie Esc, um zum Befehlsmodus zurückzukehren und den Digraphen zu verwenden:

j . j .

 // some
 // code
 //█here

jist ein Bewegungsbefehl, um eine Zeile nach unten zu gehen und .den zuletzt bearbeiteten Bearbeitungsbefehl zu wiederholen.

Ninegrid
quelle
3
Das ist ganz einfach :). Wenn Sie Probleme damit haben, kann dies daran liegen, dass Sie |anstelle eines Großbuchstaben einen Balken (das andere Symbol mit Ihrem \) eingeben I. Ich dachte, es wäre |zuerst eine.
Kokedude
1
Wenn ich "5" mache Es werden 5 Zeichen aus derselben Zeile gelöscht. Wie kann ich dafür sorgen, dass 5 Zeichen gleichzeitig aus jeder Zeile gelöscht werden?
Rahul Prasad
1
@RahulPrasad Nehmen wir an, Sie haben 25 Zeilen. Beginnen Sie dann am Anfang der ersten Zeile mit 5xj in einem Register und spielen Sie dieses Register 24 Mal ab, zum Beispiel: qa5xjq25 @ a Aber es wäre besser, wenn Sie dies als tatsächliche Frage posten würden wenn es nicht schon existiert ...
Ninegrid
26

Und noch ein anderer Weg:

  • Gehen Sie zum Zeilenanfang
  • Aktivieren Sie den Visual Block-Modus ( CTRL- v)
  • Wählen Sie die gewünschten Linien aus (bewegen Sie sich mit j/ nach oben / unten koder springen Sie mit [Linie] zu einer Linie G).
  • Drücken Sie I (das ist Hauptstadt i)
  • Geben Sie die Kommentarzeichen ein.
  • Drücken Sie ESC
Eibe
quelle
20

Dies fügt #am Anfang jeder Zeile hinzu:

:%s/^/#/

Und die Leute werden aufhören, sich über Ihren Mangel an richtig kommentierten Skripten zu beschweren.

Jar-Jarhead
quelle
2
Was ist, wenn Sie nur in ausgewählten (oder wenigen) Zeilen # hinzufügen möchten
Rahul Prasad
15

Wenn Sie Lust darauf haben, fügen Sie dies in Ihre .vimrc ein:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

Immer dann, wenn im visuellen Modus, können Sie treffen \cauf c omment den Block und \uzu u ncomment es. Natürlich können Sie diese Tastenkombinationen beliebig ändern.

Lucas Oman
quelle
Upvoted, weil es etwas Neues eingeführt hat - vmap!
ankush981
11

Noch ein anderer Weg:

:'<,'>g/^/norm I//

/^/ist nur ein Dummy-Muster, das zu jeder Zeile passt. normMit dieser Option können Sie die folgenden Befehle im Normalmodus ausführen. I//sagt, dass Sie in den Einfügemodus wechseln sollen, während Sie den Cursor an den Zeilenanfang bewegen, und dann den folgenden Text einfügen (zwei Schrägstriche).

:g Dies ist häufig praktisch, um komplexe Aufgaben in mehreren Zeilen auszuführen, bei denen Sie zwischen mehreren Modi wechseln, Zeilen löschen oder hinzufügen, den Cursor bewegen, eine Reihe von Makros ausführen usw. Sie können festlegen, dass nur Zeilen verwendet werden sollen ein Muster abgleichen.

Brian Carper
quelle
1
Eigentlich ist der Befehl: g nicht erforderlich. Dies wird tun :: '<,'> Norm I //
Cyber ​​Oliveira
1
Und: s ist auch in diesem Fall besser zu verwenden.
Graywh
Dies ist die nützlichste Antwort.
Friedlicher
3

Zum Kommentieren von Codeblöcken gefällt mir das NERD Commenter Plugin.

Wählen Sie einen Text aus:

Shift-V
...select the lines of text you want to comment....

Kommentar:

,cc

Kommentar:

,cu

Oder schalten Sie einfach den Kommentarstatus einer Zeile oder eines Blocks um:

,c<space>
Kevin
quelle
2

Ich kann das EnhCommentify- Plugin empfehlen .

z.B. lege dies zu deinem vimrc:

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

Sie können dann die (ausgewählten) Zeilen mit ', c' kommentieren / auskommentieren.

Benedikt Waldvogel
quelle
3
Sie können Nerd Commenter auch unter vim.org/scripts/script.php?script_id=1218
Nathan Fellman
1

Markieren Sie den zu kommentierenden Bereich als visuellen Block ( <C-V)

und TU c#<ESC>p

  1. chänge es auf "#"
  2. Leg es zurück

Wenn Sie dies häufig tun, definieren Sie eine \qVerknüpfung (Beispiel ) in Ihrer .vimrc

:vmap \q c#<ESC>p
JJoao
quelle
1

Wenn die mehrzeilige Auswahl einer Person tatsächlich ein Absatz ist, müssen die Zeilen nicht manuell ausgewählt werden. vim kann das für dich tun:

  1. vip: Wählen Sie den gesamten Absatz aus und markieren Sie ihn
  2. shift-i: Text am Zeilenanfang einfügen
  3. escape: Einfügemodus verlassen / Normalmodus aufrufen [Zeilenanfänge noch ausgewählt]
  4. escape: Zeilenanfänge abwählen
Das ungesehene
quelle
0

So fügen Sie "ABC" am Anfang jeder Zeile ein:

1) Wechseln Sie in den Befehlsmodus

2):% Norm I ABC

Mac
quelle
Dadurch wird der Text links vom ersten Nicht-Leerzeichen in der Zeile hinzugefügt.
Kingsley