Kopieren Sie Inhalte aus einer Datei in eine andere Datei in vi und fügen Sie sie ein


256

Ich arbeite mit zwei Dateien und muss einige Zeilen aus einer Datei kopieren und in eine andere Datei einfügen. Ich weiß, wie man (yy) kopiert und (p) in dieselbe Datei einfügt. Das funktioniert aber nicht für verschiedene Dateien. Wie wird das gemacht?

Gibt es auch eine Möglichkeit zum Ausschneiden und Einfügen? Ich habe versucht zu googeln, aber die meisten Ressourcen sprechen nur vom Kopieren und Einfügen.


Sind Sie sicher, dass dies nicht funktioniert? Ich benutze dies ziemlich oft, um Zeilen zwischen Dateien zu kopieren.
sjngm

Nun, wenn ich das mache, bekomme ich nur ein Anführungszeichen?
Macha

4
Der Befehl dd funktioniert wie cut.
Martin Stålberg

Antworten:


218

Da Sie bereits wissen, wie Sie Text ausschneiden / ziehen, finden Sie hier einige Ideen, wie Sie ihn wieder in eine andere Datei einfügen können:

  • Bearbeiten Sie die erste Datei und ziehen Sie den gewünschten Text. Öffnen Sie dann Ihre zweite Datei in vi ( :e /path/to/other/file) und fügen Sie sie ein
  • Öffnen Sie beide Dateien zusammen in einem geteilten Fenster und navigieren Sie mit Ctrl+ w, Up/ Downentweder durch:

    • vi -o /path/to/file1 /path/to/file2
    • Aus der ersten Datei, Ctrl+ w,s

Ich habe zwei Kittfenster geöffnet, mache zuerst "v für den visuellen Modus und wähle dann alle Zeilen aus und mache ein" y "für das Ziehen, nicht ich mache ein Alt + Tab, um auf die andere Datei zu gelangen, und wenn ich es tue ein "p" für put, es druckt nur ein Anführungszeichen.
macha

10
Wenn Sie mit 2 Kittfenstern arbeiten, müssen Sie die Kitt- / Fenster-Methode zum Kopieren / Einfügen verwenden. Das ist einfach. Markieren Sie das Material, das Sie kopieren möchten, mit Ihrer Maus (Sie müssen nichts weiter tun, der markierte Text wird jetzt in die Zwischenablage kopiert.) Wechseln Sie zu Ihrem anderen Kittfenster. Rufen Sie den Einfügemodus in vim auf (drücken Sie i). Drücken Sie die rechte Maustaste - die rechte Maus in einem Kittfenster fügt alles ein, was sich in der Zwischenablage befindet.
Nr.

3
Was Sie tun, funktioniert nicht: Wenn Sie in vi ziehen, wird der Text nicht in Ihre Windows-Zwischenablage verschoben, und der Yank-Puffer wird nicht von offenen vim-Instanzen gemeinsam genutzt.
Adam Batkin

1
Ich verstehe nicht, was der letzte Punkt tun soll: * Aus der ersten Datei, Ctrl+ w, s.
Svassr

1
Für mich hat es das Fenster geteilt, aber genau die gleiche Datei geöffnet. Wie wählen Sie die Datei aus, in der Sie sie öffnen möchten? Ich habe den Befehl gesehen, der :sp myfilehorizontal geteilt und die angegebene Datei geöffnet wird. Wie würde ich vorgehen, wenn ich das Fenster lieber vertikal teilen möchte?
Svassr

50

Wenn Sie Vim unter Windows verwenden, können Sie über Folgendes auf die Zwischenablage (MS Copy / Paste) zugreifen:

"*dd - Schneiden Sie eine Linie (oder 3dd, um drei Linien zu schneiden)

"*yy - Kopieren Sie eine Zeile (oder 3JJ, um drei Zeilen zu kopieren)

"*p - Zeile (n) in Zeile nach dem Cursor einfügen

"*P - Zeile (n) in Zeile vor dem Cursor einfügen

Mit können Sie zwischen separaten Vim-Fenstern oder zwischen Vim- und PC-Anwendungen ( Editor , Microsoft Word usw.) einfügen .


17
Verwendung +als plattformübergreifendes System-Zwischenablage-Register (Windows und Linux) im Vergleich zu Windows *( +funktioniert unter Windows genauso wie *).
Stephen Swensen

42

Verwenden Sie die Variationen von dgerne ddschneiden.

So schreiben Sie eine Reihe von Zeilen in eine andere Datei:

:<n>,<m> w filename

Wo <n>und <m>sind Zahlen (oder Symbole), die einen Zeilenbereich bezeichnen.

Informationen zur Verwendung der Desktop-Zwischenablage finden Sie in den +gBefehlen.


Erstellen Sie dazu mit Markierungen zwei Markierungen (z. B. a und b) um den Text, den Sie in eine Datei schreiben möchten: In die erste Zeile verschieben ma,, In die letzte Zeile verschieben , mb. Prepend dann 'auf das Schreiben der Markierung , wenn Sie den obigen Befehl sind::'a,'b w filename
EchoLynx

Tolle Lösung für große Sortimente!
Yasin Okumuş

29

Sie können die andere Datei öffnen und eingeben :r file_to_be_copied_from. Oder Sie können puffern. Oder gehen Sie zur ersten Datei, gehen Sie in die Zeile, die Sie kopieren möchten, geben Sie ein "qY, gehen Sie zu der Datei, die Sie einfügen und eingeben möchten "qP.

"Puffername, kopiert in den Puffer. Yist zerrt und Pwird gestellt. Hoffentlich hilft das!


Vielen Dank! Das hat mir Tonnen geholfen
Atsushi Yamamoto

28

Hier ist eine Möglichkeit, dies zu tun.

  • Starten Sie Vim und öffnen Sie Datei1, an der Sie gerade arbeiten.
  • :e Datei2, die Datei2 aufruft, die Datei, aus der Sie Zeilen kopieren möchten.
  • Suchen Sie die Zeilen, die Sie kopieren möchten. Wenn es drei Zeilen sind, schlagen Sie3yy
  • :b1 Dies wechselt zu Puffer 1, wo sich Datei1 befindet
  • Finden Sie heraus, wo Sie die Linien einfügen möchten, die Sie gezogen haben, und drücken Sie p

Sie können auch beide Dateien anzeigen lassen. Teilen Sie den Bildschirm mit zB Ctrl+ w s.

Beim Schneiden wird ddas geschnittene Material geschnitten und in den Ruckpuffer gelegt. ddwird eine Linie "schneiden".


2
Off-Topic: Wie bekomme ich diese Tastatur-Tasten-ähnlichen Dinge?
eckes


Was ist mit den beiden Dateien auf zwei verschiedenen SSH-Servern, in die sich derselbe Client in zwei verschiedenen Terminals unter Linux / MacOS befindet? Ich meine, es ist kein Kitt zu verwenden, und die beiden Dateien können nicht in derselben vi-Sitzung in einem Terminal geöffnet werden.
Qiang Xu

1
Wenn der Client auf zwei Server ssh kann, kann er auch scp oder sftp für diese beiden Server verwenden. Der schnellste Weg besteht also darin, die Datei einfach von einem Server auf den anderen zu kopieren, damit sie sich auf demselben Server befindet, diese Dateien wie beschrieben zu bearbeiten und die Datei gegebenenfalls wieder auf den anderen Server zu kopieren.
Nr.

16

Dies sind alles großartige Vorschläge, aber wenn Sie wissen, wo sich Text in einer anderen Datei befindet, können Sie sed mit Leichtigkeit verwenden. :r! sed -n '1,10 p' < input_file.txtDadurch werden 10 Zeilen in eine bereits geöffnete Datei an der aktuellen Position des Cursors eingefügt.


Seltsamerweise habe ich einen Exit-Code von 1 bekommen, als ich dies leider auf OS X ausführte, nicht sicher warum.
Jayunit100

1
Danke für diesen Vorschlag! Ich habe Kopf statt Sed verwendet, weil ich die ersten beiden Zeilen wollte::r ! head -n2 file.py
Federico Ponzi

7

Markieren Sie beim Bearbeiten der Datei, wo Start und Ende verwendet werden sollen

ma- setzt die aMarke

mb- setzt die bMarke

Um das in eine andere Datei zu kopieren, verwenden Sie einfach den folgenden wBefehl:

:'a,'bw /name/of/output/file.txt

7

Update 2017-05:

Ich habe gerade festgestellt, dass, wenn Sie die folgende Zeile in Ihre vimrc-Datei einfügen,

set clipboard = unbenannt

dann benutzt Vim die System-Zwischenablage.


Ich habe gerade festgestellt, dass der Yank-Weg nicht funktioniert, wenn ich Inhalte zwischen verschiedenen Vim-Instanzfenstern kopiere. (Zumindest funktioniert es aufgrund meiner Vim-Kenntnisse nicht. Ich weiß nicht, ob es eine andere Möglichkeit gibt, es zu aktivieren.)

Der Ruck-Weg funktioniert nur auf dem Weg, auf dem laut meinem Test mehrere Dateien im selben Fenster geöffnet werden.

Wenn Sie dies tun möchten, verwenden Sie besser die Methode zum Ausschneiden und Kopieren des Betriebssystems wie Ctrl+ x, Ctrl+ c(unter Windows).


5

Diese Remaps wirken für mich wie ein Zauber:

vmap <C-c> "*y     " Yank current selection into system clipboard
nmap <C-c> "*Y     " Yank current line into system clipboard (if nothing is selected)
nmap <C-v> "*p     " Paste from system clipboard

Wenn ich mich im visuellen Modus befinde, wähle ich die gewünschten Zeilen aus und drücke Ctrl+ cund dann Ctrl+v , um den Text in die Empfängerdatei einzufügen. Sie könnten auch "* y" verwenden, aber ich denke, das ist manchmal schwer zu merken.

Dies ist auch nützlich, um Text von Vim in die Zwischenablage zu kopieren.

Quelle: Kopieren und Einfügen zwischen Sitzungen mithilfe einer temporären Datei


4

Das Kopieren von Text zwischen zwei Puffern (== Dateien), die in derselben Instanz von Vim geöffnet sind, ist kein Problem:

Ziehen Sie einfach einen Puffer mit y(vorausgesetzt, Sie haben zuvor einen zu kopierenden Bereich im visuellen Modus markiert) und fügen Sie ihn dann mit in den anderen Puffer einp . Es funktioniert auch mit verschiedenen Registerkarten, solange sie sich in derselben Instanz von Vim befinden.

Wie Sie zwei Dateien in derselben Instanz von Vim öffnen, hängt von Ihrem System ab:

  • Unter Win32 gibt es im Kontextmenü die Option Mit einem Vim bearbeiten, wenn Sie zwei oder mehr Dateien auswählen
  • Wenn Sie sich auf der Konsole befinden, können Sie dies mit erreichen vim file1 file2
  • Wenn Sie Vim als Editor für ein anderes Tool verwenden, müssen Sie die --remote-silentOption angeben, um sicherzustellen, dass alle Dateien in derselben Instanz geöffnet werden

Wenn Sie die beiden Dateien in zwei verschiedenen Instanzen von Vim geöffnet haben, müssen Sie mit der System-Zwischenablage arbeiten: Ziehen Sie in der ersten Vim-Instanz den Text mit "+y(markieren Sie erneut den Bereich, der zuvor im visuellen Modus gezogen werden soll) in die System-Zwischenablage ), dann gehe zum zweiten Vim und füge dort die Zwischenablage ein : "+p.


: tabedit Dateiname kann verwendet werden, um die Zieldatei zu öffnen, und dann einfach p, um Ihre Zeilen einzufügen . Ich denke es geht schneller.
Jabalv

4

Ziel : Speichern Sie einen Teil einer Datei in einer anderen Datei.

Lösung :

  1. Wählen Sie den Text aus, den Sie speichern möchten:
    • Positionieren Sie den Cursor dort, wo Sie mit der Auswahl beginnen möchten
    • Drücken Sie v, um Zeichen auszuwählen, ODER Großbuchstaben V, um ganze Zeilen auszuwählen
    • Bewegen Sie den Cursor an das Ende Ihrer Auswahl
  2. Speichern Sie den ausgewählten Text in der neuen Datei. Typ :wSpaceund Name der neuen Datei. Eigentlich wirst du sehen

    :'<,'>w new.txt

    Dann drücken Enter


Wie füge ich eine temporäre Datei ein?
Vineet

3

Mein Szenario war, dass ich n Zeilen in der Mitte, n unbekannt, von Datei 1 nach Datei 2 kopieren musste.

:'a,'bw /name/of/output/file.txt

2
  1. Stellen Sie sicher, dass Sie die Vim-Version mit Unterstützung für die Zwischenablage kompiliert haben
    • :echo has('clipboard') sollte zurückkehren 1
    • Wenn es zurückkehrt 0(zum Beispiel Mac OS X, mindestens Version 10.11 (El Capitan), Version 10.9 (Mavericks) und Version 10.8 (Mountain Lion) - wird mit einer Vim-Version geliefert, die keine Unterstützung für die Zwischenablage bietet), müssen Sie eine installieren Vim-Version mit Unterstützung für die Zwischenablage, z. B. über brew install vim(Vergessen Sie nicht, Ihre Terminals nach der Installation neu zu starten.)
  2. Rufen Sie einen visuellen Modus auf ( V- mehrzeilig, v- einfach oder Ctrlv- blockvisuell)
  3. Wählen Sie die Zeile (n) aus, die Sie kopieren möchten
  4. "*y - um ausgewählte zu kopieren
  5. "*p - kopiert einfügen

PS:

  • Sie können die Schritte 2 bis 5 durch die Anweisungen aus der Antwort von JayG ersetzen , wenn Sie eine einzelne Zeile kopieren und einfügen müssen
  • Um die Auswahl von Linien zu vereinfachen, können Sie sie set mouse+=azu Ihrer hinzufügen. Sie können .vimrcLinien in Vim mit der Maus auswählen, ohne fremde Elemente (wie Zeilennummern usw.) auszuwählen. HINWEIS: Die Möglichkeit, von der Maus ausgewählten Text zu kopieren, wird blockiert in die System-Zwischenablage von Vim .

1

Beispiel: DateiA und DateiB - Beginnen Sie in DateiA in Zeile 25, kopieren Sie 50 Zeilen und fügen Sie sie in DateiB ein

fileA

Goto 25th line

25G

copy 50 lines into buffer v

"v50yy

Goto fileB

:e fileB

Goto line 10

10G    

paste contents of buffer v
"vp

1

Die folgende Option funktioniert meistens und auch zum späteren Einfügen.

 "xnyy
x - buffer name
n - number of line to Yank - optional

Die gezogenen Zeilen werden im Puffer gespeichert 'x'. Es kann überall in der Bearbeitung verwendet werden.

Um Zeilen in die andere Datei einzufügen,

:e filename&location

Beispiel: Geben Sie den folgenden Befehl in die aktuelle Bearbeitung ein

:e /u/test/Test2.sh
and paste using "xP
P - before cursor
p - after cursor

Komplette Operation

Datei 1 öffnen:

vi Test1.sh

a10yy

-Yanked 10 lines

- Öffnen Sie jetzt die zweite Datei aus der aktuellen Bearbeitung

*:e /u/test/Test2.sh*

- Bewegen Sie den Cursor auf die Zeile, in die Sie einfügen müssen

*"ap*

- Zeilen aus dem Puffer '*a*'werden nach der aktuellen Cursorposition kopiert


1

Wenn Sie einen Teil einer Datei kopieren und diesen Inhalt in die Mitte einer anderen Datei einfügen möchten, können Sie dies auf diese Weise tun.

:linenumber,linenumber write newfile

Beispiel:

:2,34 write temp1

Oder

:'mark, 'mark write newfile

Beispiel:

:'a,'b write temp1

Jetzt werden die Zeilen in eine andere Datei kopiert. Wenn Sie diese Zeilen nach dem Kopieren löschen möchten, können Sie dies tun

:linenumber1,linenumber2 d

Oder

:'mark1,'mark2 d

Gehen Sie jetzt zu einer anderen Datei. Halten Sie dann den Cursor auf der Zeile, in die Sie einfügen möchten.

Art

:r!cat temp1

Jetzt wird der Inhalt der temporären Datei hier eingefügt. Sie können die temporäre Datei nach dem Einfügen des Inhalts von der Befehlszeile selbst löschen.

:!rm temp1

Dies wäre hilfreich, wenn Sie mehrmals kopieren und einfügen möchten.


0

Eine andere Möglichkeit könnte darin bestehen, die beiden Dateien in zwei geteilten Puffern zu öffnen und nach visueller Auswahl der interessierenden Zeilen das folgende "Snippet" zu verwenden.

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p

0

Rufen Sie den Befehlsmodus auf und führen Sie ihn aus

:r! sed -n '<start_line_num>, <end_line_num> p' file_to_extract_text_from

ZB um Zeilen 20-30aus filenameder aktuell geöffneten Datei zu extrahieren

:r! sed -n '20, 30p' filename
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.