it-swarm.com.de

Vim: Geben Sie die gleichen Zeichen in mehrere Zeilen ein

Manchmal möchte ich einen bestimmten visuellen Textblock mehrzeilig bearbeiten.

Zum Beispiel würde ich einen Text nehmen, der so aussieht:

name
comment
phone
email

Und lass es so aussehen

vendor_name
vendor_comment
vendor_phone
vendor_email

Derzeit ist die Art, wie ich es jetzt tun würde, ...

  1. Wählen Sie alle 4 Zeilen des Blocks aus, indem Sie drücken V und dann j 4 Mal.
  2. Einrücken mit >.
  3. Einen Buchstaben mit zurückgehen h.
  4. Zum Sperren des visuellen Modus mit ctrlv.
  5. Wählen Sie durch Drücken von 4 Zeilen aus j 4 Mal. Zu diesem Zeitpunkt haben Sie einen visuellen 4x1-Whitespace-Block (4 Zeilen, 1 Spalte) ausgewählt.
  6. Drücken Sie c. Beachten Sie, dass dies um eine Spalte nach links eingerückt ist.
  7. Geben Sie einen " vendor_" ohne Anführungszeichen ein. Beachten Sie den zusätzlichen Platz, den wir zurücklegen mussten.
  8. Drücken Sie esc. Dies ist eines der wenigen Male, die ich benutze esc um den Einfügemodus zu verlassen. ctrlc würde nur die erste Zeile bearbeiten.
  9. Wiederholen Sie Schritt 1.
  10. Umgekehrt einrücken mit <.

Ich muss nicht einrücken, wenn vor den Wörtern mindestens eine Leerzeichenspalte steht. Ich würde das Leerzeichen nicht brauchen, wenn ich nicht den Sichtblock mit löschen müsste c.

Aber wenn ich mich klären muss, gibt es dann eine Möglichkeit, das zu tun, was ich oben ausgeführt habe, ohne das erforderliche Leerzeichen mit Einrückung zu erstellen?

Warum funktioniert das gleichzeitige Bearbeiten mehrerer Zeilen nur, wenn der Einfügemodus mit beendet wird? esc Über ctrlc?

Bearbeiten:

Hier ist ein komplizierteres Beispiel

name    = models.CharField( max_length = 135 )
comment = models.TextField( blank = True )
phone   = models.CharField( max_length = 135, blank = True )
email   = models.EmailField( blank = True )

zu

name    = models.whatever.CharField( max_length = 135 )
comment = models.whatever.TextField( blank = True )
phone   = models.whatever.CharField( max_length = 135, blank = True )
email   = models.whatever.EmailField( blank = True )

in diesem Beispiel würde ich den vertikalen visuellen Block über dem . ausführen und ihn dann im Einfügemodus erneut einfügen, dh .whatever. eingeben. Hoffentlich sehen Sie jetzt den Nachteil dieser Methode. Ich kann nur eine Textspalte auswählen die in vertikaler Position alle gleich sind.

261
hobbes3
  1. Bewegen Sie den Cursor zu nin namename__.
  2. Aktivieren Sie den visuellen Blockmodus (ctrlv).
  3. Drücken Sie j dreimal (oder 3j).
  4. Drücken Sie Iname__ (Hauptstadt i).
  5. Geben Sie vendor_ ein.
  6. Drücken Sie esc.

mini-screencast demonstrating the method

Ein Großbuchstabe Imuss anstelle eines Kleinbuchstaben iverwendet werden, da der Kleinbuchstabe ials Beginn eines Textobjekt interpretiert wird, was für sich genommen ziemlich nützlich ist, z. zur Auswahl eines innerhalb eines Variablenblocks ( itNAME _ ):

mini-screencast showing the usefulness of the it text object

795
icktoofay

Ein anderer Ansatz ist die Verwendung des . Befehl (dot) in Kombination mit I.

  1. Bewegen Sie den Cursor dorthin, wo Sie beginnen möchten
  2. Drücken Sie I
  3. Geben Sie das gewünschte Präfix ein (z. B. vendor_).
  4. Drücken Sie esc.
  5. Drücken Sie j eine Linie hinuntergehen
  6. Art . Um die letzte Bearbeitung zu wiederholen, wird das Präfix automatisch erneut eingefügt
  7. Wechsle schnell zwischen j und .

Ich finde, diese Technik ist oft schneller als der visuelle Block-Modus für eine kleine Anzahl von Zusätzen und hat den zusätzlichen Vorteil, dass Sie den Text einfach überspringen können, wenn Sie ihn nicht in jede einzelne Zeile eines Bereichs einfügen müssen j's.

Beachten Sie, dass bei einer großen Anzahl von zusammenhängenden Hinzufügungen der Blockansatz oder das Makro wahrscheinlich überlegen sind.

62
danprice
  1. Wählen Sie mit die Zeilen aus, die Sie ändern möchten CtrlV.
  2. Drücken Sie:

    • I: Vor dem ausgewählten einfügen.
    • A: Nach Auswahl anhängen.
    • C: Ersetzen Sie, was ausgewählt ist.
  3. Geben Sie den neuen Text ein.

  4. Drücken Sie Esc um die Änderungen auf alle ausgewählten Zeilen anzuwenden.
27
Loukan ElKadi

Ich würde ein Makro verwenden, um meine Aktionen aufzuzeichnen, und es dann wiederholen.

  1. Setzen Sie den Cursor auf den ersten Buchstaben des Namens.
  2. Drücken Sie qq, um die Aufnahme in den q-Puffer zu starten.
  3. Drücken Sie i, um in den Einfügemodus zu wechseln, und geben Sie vector_ ein. Drücken Sie dann ESC, um den Einfügemodus zu verlassen.
  4. Drücken Sie jetzt 0, um zum Anfang der Zeile zurückzukehren.
  5. Jetzt j drücken, um runterzugehen.
  6. Drücken Sie erneut q, um die Aufnahme zu beenden.

Sie haben jetzt ein Nice-Makro.

Geben Sie [email protected] ein, um das Makro dreimal auszuführen, um die restlichen Zeilen auszuführen.

27
Brian Neal
:%s/^/vendor_/

oder fehlt mir etwas?

24
srini.venigalla

Aktualisiert Januar 2016

Während die akzeptierte Antwort eine großartige Lösung ist, ist dies tatsächlich etwas weniger Tastenanschläge und skaliert im Prinzip besser, basierend auf der akzeptierten Antwort.

  1. Bewegen Sie den Cursor zu n in name.
  2. Aktivieren Sie den visuellen Blockmodus (ctrlv).
  3. Drücken Sie 3j
  4. Drücken Sie I.
  5. Geben Sie vendor_ ein.
  6. Drücken Sie esc.

visual illustration

Beachten Sie, dass dies weniger Tastatureingaben erfordert als die akzeptierte Antwort (vergleiche Schritt 3). Wir zählen nur die Anzahl der auszuführenden Aktionen.

Wenn Sie Zeilennummern aktiviert haben (wie oben dargestellt) und die Zeilennummer kennen, zu der Sie wechseln möchten, können Sie Schritt 3 in # ändern.G Dabei ist # die gewünschte Zeilennummer.

In unserem obigen Beispiel wäre dies 4G. Bei nur wenigen Zeilennummern funktioniert eine explizite Zählung jedoch gut.

11
arcseldon

Möglicherweise haben Sie auch einen Anwendungsfall, bei dem Sie einen Textblock löschen und ersetzen möchten.

So was

Hello World

Hello World

Zu

Hello Cool

Hello Cool

Sie können nur visuell "Welt" in beiden Zeilen auswählen.

Geben Sie zum Ändern c ein. Jetzt befinden Sie sich im Einfügemodus.

Legen Sie die gewünschten Sachen ein und drücken Sie die Escape-Taste. 

Beide werden vertikal reflektiert. Es funktioniert genau wie 'ich', außer dass es den Block durch den neuen Text ersetzt, anstatt ihn einzufügen.

5
Nishant

Angenommen, Sie haben diese Datei:

something

name
comment
phone
email

somethine else
and more ...

Sie möchten "vendor_" vor "name", "comment", "phone" und "email" hinzufügen, unabhängig davon, wo sie in der Datei erscheinen.

:%s/\<\(name\|comment\|phone\|email\)\>/vendor_\1/gc

Das Flag c fordert Sie zur Bestätigung auf. Sie können das löschen, wenn Sie die Aufforderung nicht möchten.

5
Manish

Ich wollte ein lot Zeilen in einer Konfigurationsdatei auf einem Server auswerten, die nur über vi (kein Nano) verfügte. Die visuelle Methode war ebenfalls umständlich So habe ich das gemacht.

  1. Datei vi file öffnen
  2. Zeilennummern anzeigen :set number! oder :set number
  3. Verwenden Sie dann die Zeilennummern, um den Zeilenanfang durch "#" zu ersetzen. Wie?

:35,77s/^/#/

Hinweis: Die Zahlen sind inklusive, Zeilen von 35 bis 77, beide werden geändert.

Um das zu kommentieren/rückgängig zu machen, benutze einfach :35,77s/^#//

Wenn Sie nach jeder Codezeile ein Text-Word als Kommentar hinzufügen möchten, können Sie auch Folgendes verwenden:

:35,77s/$/#test/ (für Sprachen wie Python) 

:35,77s/;$/;\/\/test/ (für Sprachen wie Java)

credits/Referenzen:

  1. https://unix.stackexchange.com/questions/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers- using-vi-or-vim

  2. https://unix.stackexchange.com/questions/120615/how-to-comment-multiple-lines-at-once

4
computingfreak

Dies ist eine alte Frage, aber ich möchte eine Alternative anbieten, die flexibler sein kann:

Beispiel: Um den Text XYZ am Anfang der Zeile einzugeben

:%norm IXYZ

Was passiert hier?

  • % == Ausführung in jeder Zeile
  • norm == Führen Sie die folgenden Tasten im normalen Modus aus
  • I == Am Zeilenanfang einfügen
  • XYZ == Der Text, den Sie eingeben möchten

Dann drückst du die Eingabetaste und es wird ausgeführt.

Spezifisch für Ihre Anfrage:

:%norm Ivendor_

Sie können auch einen bestimmten Bereich auswählen:

:2,4norm Ivendor_

Oder über einen ausgewählten Sichtbereich ausführen:

:'<,'>norm Ivendor_

1
Aubrey Lavigne
Use Ctrl+V to enter visual block mode
Move Up/Down to select the columns of text in the lines you want to comment.
Then hit Shift+i and type the text you want to insert.
Then hit Esc, wait 1 second and the inserted text will appear on every line
0
Arpan Saini
1. ctrl + v to go to visual block 
2. select the lines using up and down arrow 
3. enter small 3i ( presess SMALL I three times)
4. I (Press capital I, That will take you into insert mode)
4. Write the text you want to add
5. esc 
6. press down arrow
0
Arpan Saini