Manchmal möchte ich einen bestimmten visuellen Textblock über mehrere Zeilen hinweg 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 würde ich es jetzt so machen ...
- Wählen Sie alle 4 Zeilenzeilen eines Blocks durch Drücken von Vund dann jviermal aus.
- Einrücken mit >.
- Gehen Sie einen Brief mit zurück h.
- Gehen Sie zum Blockieren des visuellen Modus mit Ctrlv.
- Wählen Sie vier Zeilen aus, indem Sie jviermal drücken . Zu diesem Zeitpunkt haben Sie 4x1 visuelle Leerzeichenblöcke (vier Zeilen und eine Spalte) ausgewählt.
- Drücken Sie C. Beachten Sie, dass dies ziemlich links von einer Spalte eingerückt ist.
- Geben Sie a
" vendor_"
ohne Anführungszeichen ein. Beachten Sie den zusätzlichen Platz, den wir zurücklegen mussten. - Drücken Sie Esc. Dies ist eines der wenigen Male, mit denen ich den EscEinfügemodus verlasse. Ctrlcwürde nur die erste Zeile bearbeiten.
- Wiederholen Sie Schritt 1.
- In die andere Richtung einrücken mit <.
Ich muss nicht einrücken, wenn vor den Wörtern mindestens eine Spalte mit Leerzeichen steht. Ich würde das Leerzeichen nicht brauchen, wenn ich den visuellen Block nicht mit löschen müsste c.
Aber wenn ich löschen 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 Sie den Einfügemodus mit Escover verlassen Ctrlc?
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 wieder einfügen, dh eingeben .whatever.
. Hoffentlich können Sie jetzt den Nachteil dieser Methode sehen. Ich beschränke mich darauf, nur eine Textspalte auszuwählen , die in vertikaler Position alle gleich sind .
:s/models\./\0whatever./
\0
mit&
.Antworten:
n
inname
.I
(Großbuchstabe i).vendor_
. Hinweis: Der Bildschirm wird nur in der ersten Zeile aktualisiert - bis Escgedrückt wird (6.). An diesem Punkt werden alle Zeilen aktualisiert.Ein Groß
I
muss eher als ein Klein verwendet werdeni
, weil die Kleini
als Beginn eines interpretiert Textobjekt , das auf seinem eigenen ziemlich nützlich ist, zB für die in einem Tag - Block Auswahl (it
):quelle
j
oder zu drücken^L
. Sie sollten sehen, dass Vim doch nicht beschäftigt war; es wartete nur. Versuchen Sie zweitens,'timeout'
auf einen niedrigeren Wert wie80
(anstelle des Standardwerts1000
) zu wechseln , und stellen Sie fest, dass das Zeitlimit schneller abläuft.timeoutlen
nicht isttimeout
.A
statt drückenI
, was nach dem ausgewählten Block statt zuvor eingefügt wird. Wenn Ihre Linien jedoch unterschiedlich lang sind, funktioniert dies nicht. Ich verwende dafür gerne eine Substitution, die mit dem Ende jeder Zeile übereinstimmt, z. B. einige Zeilen auswählen und verwenden:s/$/inserted/
.Ein anderer Ansatz besteht darin, den Befehl .(
dot
) in Kombination mit zu verwenden I.vendor_
)Ich finde diese Technik ist oft schneller als der optische Block - Modus für eine kleine Anzahl von Ergänzungen und hat den zusätzlichen Vorteil , dass , wenn Sie nicht den Text auf jeder einzelne Zeile in einem Bereich eingelegt werden muss man sich einfach überspringen kann durch Drücken Extra j‚s .
Beachten Sie, dass für eine große Anzahl zusammenhängender Ergänzungen der Blockansatz oder das Makro wahrscheinlich überlegen ist.
quelle
Drücken Sie:
Geben Sie den neuen Text ein.
quelle
Esc
für VIM-Noobs wie mich hervorheben - es hat eine Weile gedauert, bis ich herausgefunden habe, dass die Änderungen "später" weitergegeben werden!v
? Ich kann es damit machenCtrl+V --> A
, aberv
das Auswählen des Textes funktioniert nicht - wirdA
nur an diese Zeile angehängt. Sind sie nicht beide Auswahl? Auch sehr seltsam - wirdA
nur an das Zeilenende angehängt, wenn ich den visuellen Block bis zum Zeilenende erweitere; Andernfalls wird an jeder Stelle angehängt, an der der visuelle Block für jede Zeile endet. Es ist, als würde es keinen Unterschied zwischena
und erkennenA
.c
stattdessen verwendenC
, aber es funktionierte einwandfrei. Vielen DankIch würde ein Makro verwenden, um meine Aktionen aufzuzeichnen und es dann wiederholen.
Sie haben jetzt ein schönes Makro.
Geben Sie ein 3@q, um Ihr Makro dreimal auszuführen und den Rest der Zeilen auszuführen.
quelle
oder fehlt mir etwas
quelle
vender_
Präfix unerwünscht ist.1,4s/^/vendor_/
V
und die Eingabe visuell zu blockieren:
. Es wird dem ed-Ausdruck vorangestellt, mit:'<,'>
dem der ed nur für die Auswahl gilt:'<,'>s/^/vendor_/
Aktualisiert Januar 2016
Die akzeptierte Antwort ist zwar eine großartige Lösung, dies sind jedoch etwas weniger Tastenanschläge und die Skalierung ist besser - im Prinzip basierend auf der akzeptierten Antwort.
n
inname
.I
.vendor_
.Beachten Sie, dass dies weniger Tastenanschläge als die akzeptierte Antwort enthält (vergleiche Schritt 3). Wir zählen nur die Anzahl der auszuführenden j Aktionen.
Wenn Sie Zeilennummern aktiviert haben (wie oben dargestellt) und die Zeilennummer kennen, zu der Sie wechseln möchten, kann Schritt 3 in # geändert werden, Gwobei # die gewünschte Zeilennummer ist.
In unserem obigen Beispiel wäre dies 4G. Bei nur wenigen Zeilennummern funktioniert eine explizite Zählung jedoch gut.
quelle
Ich wollte viele Zeilen in einer Konfigurationsdatei auf einem Server auskommentieren, der nur vi (kein Nano) hatte, daher war die visuelle Methode ebenfalls umständlich. So habe ich das gemacht.
vi file
:set number!
oder:set number
:35,77s/^/#/
Hinweis: Die Nummern sind inklusive, Zeilen von 35 bis 77, beide enthalten werden geändert.
Um dies zu kommentieren / rückgängig zu machen, verwenden Sie einfach
:35,77s/^#//
Wenn Sie nach jeder Codezeile ein Textwort 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:
/unix/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim
/unix/120615/how-to-comment-multiple-lines-at-once
quelle
Möglicherweise haben Sie auch einen Anwendungsfall, in dem Sie einen Textblock löschen und ersetzen möchten.
So was
Zu
Sie können einfach visuell in beiden Zeilen "Welt" auswählen.
Geben Sie cfür den Wandel - jetzt werden Sie in Insert - Modus sein.
Fügen Sie das gewünschte Material ein und klicken Sie auf Escape.
Beide werden vertikal reflektiert. Es funktioniert genau wie 'I', außer dass es den Block durch den neuen Text ersetzt, anstatt ihn einzufügen.
quelle
Angenommen, Sie haben diese Datei:
Sie möchten "vendor_" vor "name", "comment", "phone" und "email" hinzufügen, unabhängig davon, wo sie in der Datei angezeigt werden .
Das
c
Flag fordert Sie zur Bestätigung auf. Sie können das löschen, wenn Sie die Eingabeaufforderung nicht möchten.quelle
Eine Alternative, die flexibler sein kann:
Beispiel: Geben Sie den Text XYZ am Zeilenanfang ein
Was passiert hier?
%
== In jeder Zeile ausführennorm
== Führen Sie die folgenden Tasten im normalen Modus ausI
== Am Zeilenanfang einfügenXYZ
== Der Text, den Sie eingeben möchtenDann drückst du Enterund es wird ausgeführt.
Speziell für Ihre Anfrage:
Sie können auch einen bestimmten Bereich auswählen:
Oder über einen ausgewählten Sichtbereich ausführen:
quelle
ctrl-v ctrl-[
, um ein "Escape Esc" einzufügen, das Sie für den Zweck Ihres normalen Befehls in den "normalen Modus" zurückversetzt. Ich habe das gerade mit getestet'<,'>norm Iaa^[ysiw"
, wo^[
ist der entkommene Esc.quelle
quelle