Wie füge ich eine Textspalte nach einer anderen Textspalte in Vim ein?

75

Ich habe zwei Spalten voller Text und möchte sie nebeneinander abrufen. Zum Beispiel habe ich

abc
def
ghi

und

123
456
789

und ich will

123 abc
456 def
789 ghi

Ich kann nur herausfinden, wie dieselbe Zeile am Ende jeder Zeile in einer Spalte eingefügt wird. Ich kann nicht herausfinden, wie ein mehrzeiliger Textblock am Ende einer anderen Spalte eingefügt wird.

Lily Ballard
quelle

Antworten:

58

Verwenden Sie den visuellen Block ( ctrl-v), um die Buchstabenspalte auszuschneiden. Gehen Sie dann zur ersten Zeile der Zahlenspalte. Gehen Sie zum Ende und machen Sie ein Leerzeichen. Fügen Sie dann die Buchstabenspalte ein.

Klima
quelle
Hat das Schneiden / Ziehen im visuellen Blockmodus etwas Besonderes? Mein aktuelles Problem ist, dass das von mir verwendete *Register tatsächlich das Register ist, dh die Systemzwischenablage.
Lily Ballard
1
Das gleiche Register wird für Plain yund verwendet p, wenn Sie kein spezielles mit angeben ".
Matej
1
Ich finde dieses nette Plugin von Ingo Karkat hilfreich, wenn ich eine Paste "gießen" möchte. vim.org/scripts/script.php?script_id=3355
Peter Rincker
1
Ah, ich glaube, ich erinnere mich von hier an daran: Es wird unter Hilfe für 'GUI-Auswahl' erwähnt (wahrscheinlich auch anderswo). [Zitat aus der Hilfe] „Beachten Sie, dass beim Einfügen von Text aus einem Vim in ein anderes separates Vim auch die Art der Auswahl (Zeichen, Zeile oder Block) kopiert wird. Für andere Anwendungen ist der Typ immer ein Zeichen. “
Matej
2
@clime: Wenn ich aus einer blockweisen Auswahl in MacVim kopiere und dann zu einer anderen Instanz von MacVim gehe, bleibt die blockweise Natur erhalten. Wenn ich jedoch aus einer anderen Anwendung kopiere (was ich auch getan habe), ist dies nicht der Fall. Ich musste in vim einfügen, dann eine blockweise Auswahl treffen und erneut kopieren, um blockweise Register zu verwenden.
Lily Ballard
72

Ich habe mich gefragt, warum der "visuelle Blockmodus" bei mir nicht funktioniert. Der Schlüssel ist, im visuellen Modus zu ziehen (oder zu löschen).

Ich muss einige Sachen aus Excel-Spalten mit variabler Länge kopieren. So mache ich das:

Names
Donald Knuth
Sebastian Thrun
Peter Norvig
Satoshi Nakamoto

Age
100
50
60
45

Angenommen, Sie möchten die zweite Spalte nach der ersten setzen.

  1. Ziehen Sie es im visuellen Modus:
    • Bewegen Sie den Cursor an den Anfang von Age
    • Drücken Sie Ctrl + v, um den visuellen Modus aufzurufen
    • Bewegen Sie den Cursor auf 5in45
    • Drücken Sie yauf Yank (oder dzu löschen)

Sie haben jetzt im visuellen Modus gerissen.

  1. Einfügen (im normalen Modus)

    • Gehen Sie zum Ende der ersten Zeile und fügen Sie mehr Leerzeichen hinzu, da diese beispielsweise kürzer als die zweite Zeile sind. Wenn Sie einen "Block" einfügen, ohne zusätzliche Leerzeichen hinzuzufügen, wird der "Lauf" in Sebastian Thrun überschrieben.

    • Wenn Sie sich in der ersten Zeile befinden, fügen Sie nach dem letzten Zeichen einige Leerzeichen ein. Stellen Sie sicher, dass Sie sich nicht im Einfügemodus befinden, und pdrücken Sie, um den Block einzufügen . (Wenn Sie im Einfügemodus einfügen möchten, verwenden Sie ctrl+r ")

Geben Sie hier die Bildbeschreibung ein

Abdo
quelle
@Abdo: Danke, das hat mir geholfen. Obwohl das Einfügen im normalen Modus wie erwartet funktioniert, funktioniert das Einfügen mit ctrl+r "nicht wie beschrieben. Sollte es so sein?
Xiphias
@Xiphias tippe :registersund schau was du da drin hast. Wenn Sie etwas unter haben ", tippen Sie wahrscheinlich ctrl+r '(stellen Sie sicher, dass Sie die Schicht halten)
Abdo
1
Eigentlich heißt es "Visual Block Mode", nicht nur "Visual Mode".
Fritz
DUDE ..... Dude ..... Alter. Das ist so nützlich. Wenn jedoch die Daten (das im visuellen Modus ausgewählte Material) ebenfalls ungleichmäßig sind - insbesondere, wenn eine mittlere Zeile mehr Zeichen enthält (+1 für das Zeilenende) als die oberen (oder unteren), je nachdem, wo Sie mit der Auswahl begonnen haben ) - dann kann nicht die vollständige Auswahl getroffen werden. Der Trick besteht darin, am Ende der kürzeren Cursorzeile Leerzeichen einzufügen, bis der Versatz mit dem der längsten Zeile übereinstimmt. zB Versuch 1\n100\n1und die letzte 0von 100fehlen wird.
Jonathan Komar
4
Nur eine kurze Notiz für mich , dass dies nicht funktioniert , wenn ich set clipboard^=unnamedin meiner , vimrcum automatisch die Zwischenablage zwischen macOS und Vim zu teilen. Wenn diese Option festgelegt ist, wird der Inhalt immer als einzelne Spalte eingefügt. Wenn diese Option entfernt ist, funktioniert das Einfügen wie oben beschrieben.
Robenkleene
15

Du hast:

abc
def
ghi

123
456
789

Bewegen Sie den Cursor auf die a. Dann CTRL+V, und bewegen Sie den Cursor auf i. Drücken Sie y.

Fügen Sie als Nächstes nach dem 3Zeichen ein Leerzeichen ein und drücken Sie p.

Erledigt.

Matej
quelle
13

Wenn Sie auf einem Mac arbeiten und nicht herausfinden können, warum das Einfügen den Block in neue Zeilen einfügt, liegt dies daran, dass Sie das System-Pasteboard verwenden.

Kein Problem, nur mit Puffern ziehen / einfügen:

  1. Ctrlv - Wählen Sie aus, was Sie ziehen möchten
  2. "Buchstabey - in letterPuffer ziehen
  3. Gehen Sie dorthin, wo Sie einfügen möchten
  4. "Briefp - Einfügen aus letterPuffer

Stellen Sie sicher, dass dies letternicht +der System-Pasteboard-Puffer ist und somit den gleichen Effekt hat.

Qix - MONICA WURDE FEHLERHAFT
quelle
Das ist die Antwort für mich. Das System Pasteboard, dh. +registrieren, pSpalte nicht einfügen lassen.
Mozlingyu
4

Dies mag offensichtlich erscheinen, aber wenn Sie aus einem extern kopierten Puffer einfügen, funktioniert dies nicht nur mit dem Einfügen im visuellen Modus. Was Sie tun können, ist zuerst eine normale Paste in einem leeren Bereich und vertikales Ausschneiden / Einfügen mit der obigen Methode.

Andrei Pokrovsky
quelle
0

Wenn Sie den Registertyp manuell auf blockweise einstellen möchten, verwenden Sie diese Option

:call setreg(0, getreg(0), 'b')

oder

:call setreg('*', getreg('*'), 'b')

Nützlich zum Einfügen einer Spalte aus einem Tabellenkalkulationseditor.

Siehe :help setregund vimtip für Details.

nullp
quelle