Wie erreicht man eine Auswahl unterschiedlicher Textlängen in unterschiedlichen Zeilen?

10

Angenommen, ich habe folgende Texte:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

Ich möchte eine Auswahl wie folgt treffen:

aaa-dd-e:"aaa",
bb-x:"bb",
c-9:"c"

Ich habe versucht, mit cv einen visuellen Block zu erstellen, aber nachdem ich in der ersten Spalte eine Auswahl erstellt und "f:" gedrückt habe (ich wollte die Auswahl in jeder Zeile wie oben auf die Doppelpunktmarkierung erweitern), erhalte ich Folgendes:

aaa-dd-e: "aaa" ,
bb-x: "bb",
c-9:"c"

Die Auswahl stoppt beim ersten Doppelpunkt und erstellt ein Rechteck.

Aaron Shen
quelle
6
Was möchten Sie mit dieser Auswahl erreichen, es könnte einen anderen Weg geben
Arjen Dijkstra
Wenn es durch Zeichen getrennt ist, können Sie versuchen, den Block zuerst neu auszurichten und dann auszuwählen. Siehe: Text nur am ersten Trennzeichen in VIM
ausrichten

Antworten:

6

Auswahl ist im Allgemeinen ein Mittel zum Zweck, mehr noch in Vim, wo Auswahl oft überhaupt nicht notwendig ist.

Angenommen, Sie möchten Eigenschaftsnamen in Ihrer Nicht-JSON-Datei weiterhin in Anführungszeichen setzen, um sie in die richtige JSON-Datei umzuwandeln:

  1. Wählen Sie die zu ändernden Zeilen aus, zeichenweise oder zeilenweise, es spielt keine Rolle,
  2. :'<,'>norm I"^[f:i"( '<,'>wird automatisch für Sie eingefügt und ^[mit erhalten <C-v><Esc>).

Wenn Sie das schöne Surround-Plugin haben, wird Schritt 2 zu:

:'<,'>norm ^vt:S"

Mit einer Substitution könnte Schritt 2 werden:

:'<,'>s/^\s*\([^:]*\):/"\1"
romainl
quelle
Ihr habt Recht, ich finde diese visuelle Auswahl jetzt wahrscheinlich unnötig. Mit der Hilfe oder :g/regex/normkann ich einfach erreichen, was ich tun möchte.
Aaron Shen
Gibt es eine Möglichkeit, den gesamten ausgewählten Block in die Zwischenablage des Systems zu verschieben und in eine andere Datei einzufügen?
Aaron Shen
Natürlich. Angenommen, Ihr Vim ist mit Unterstützung für die Zwischenablage kompiliert, die Sie ausführen können, "+yoder "*yje nachdem, auf welche Zwischenablage Sie abzielen möchten. Hier gibt es viele verwandte Fragen.
Romainl
14

Vim unterstützt nur rechteckige blockweise Auswahlen, mit Ausnahme des gezackten rechten Randes beim Drücken $.

Es gibt Plugins (wie vim multiple cursors ), die mehrere Auswahlen emulieren können, aber Sie sollten Ihr tatsächliches Ziel (das Sie leider nicht erwähnt haben) auch mit reinen Vim-Befehlen erreichen können, :globalund :substitute(wenn Sie einen regulären Befehl formulieren können) Ausdruck, der der Auswahl in jeder Zeile entspricht) oder durch Wiederholen von Makros (wenn es eine bestimmte Bewegung gibt, die die Auswahl in jeder Zeile abdeckt).

Ingo Karkat
quelle
Was ist, wenn ich diese Zeilen ausschneiden und in einen anderen Puffer einfügen möchte?
Aaron Shen
1

Just another Hut in den Ring zu werfen, wenn Sie wirklich verwenden , können Sie visuelle Auswahl wollen das nutzen Tabellarische Plugin die Doppelpunkte aufreihen, dann Ihre visuelle Auswahl treffen.

Wenn Sie Ihren Originaltext nehmen:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

:Tab /:\zs richtet alles nach dem Doppelpunkt wie unten aus

aaa-dd-e:  "aaa",
bb-x:      "bb",
c-9:       "c"

Und dann können Sie Ihre visuelle Blockauswahl treffen.

Wie andere bereits gesagt haben, ist eine visuelle Auswahl in dieser Situation wahrscheinlich nicht erforderlich. Durch die Verwendung normoder Ersetzung können Sie wahrscheinlich das erreichen, was Sie möchten, ohne sich um die visuelle Auswahl kümmern zu müssen.

Zach Ingbretsen
quelle
1

Ich habe eine Lösung für dieses Problem gefunden, die überraschend einfach ist! Starten Sie den visuellen Blockmodus am unteren Rand der Auswahl des zu kopierenden Textes und wählen Sie ihn nach oben aus! Wenn Sie nach unten markieren, wird der Block erweitert, während die Auswahl kleiner erscheint.

Arthur Bowers
quelle
Aber so wird es immer ein rechteckiger Block sein, oder? Während ich es lese, ist dies nicht das, was das OP will (sie erwähnen, dass sie den visuellen Blockmodus ausprobiert haben).
Martin Tournoij
Nein. Es ist immer ein rechteckiger Block, wenn alle Zeilen gleich lang sind. Ich habe festgestellt, dass, wenn Sie unten beginnen und nach oben markieren und dann $ drücken, um zum Zeilenende zu gelangen, alle hervorgehobenen Zeilen am Zeilenende hervorgehoben werden.
Arthur Bowers