Kopieren Sie alle Zeilen in die Zwischenablage

564

Gibt es eine Möglichkeit, alle Zeilen aus der geöffneten Datei in die Zwischenablage im VI-Editor zu kopieren? Ich habe es versucht, yGaber es wird keine Zwischenablage zum Speichern dieser Zeilen verwendet.

Also ist es möglich?

Xinus
quelle
1
Wenn Sie unter Windows arbeiten und Yank nicht funktioniert, lesen Sie die 17. Antwort von oben: stackoverflow.com/questions/1620018/…
Noumenon

Antworten:

636

Sie sollten den Text in die Register* oder ziehen :+

gg"*yG

Erläuterung:

  • gg um den Cursor auf das erste Zeichen der Datei zu bewegen
  • "*yum *von der ersten Zeile an einen Ruckbefehl in das Register zu starten , bis ...
  • G um das Ende der Datei zu gehen
CMS
quelle
6
Wie markiert man den Text so, dass er wie Schlüssel aussieht? Ich habe das noch nicht auf SO gesehen.
Jergason
10
Hallo ... es funktioniert nicht? Die Daten in der Zwischenablage bleiben unverändert. Wenn ich gg eingebe, geht der Cursor in die erste Zeile ... aber wenn ich "* yG ..cpu piepst bei * ..so ist es normal oder ein Problem mit meinem vim? Ich bin auf Ubuntu ..
Xinus
1
Haben Sie Deadkeys aktiviert? (zB wenn du 'a drückst, bekommst du á) Wenn ja, musst du danach die Leertaste drücken ".
Tordek
144
Vim kann nur auf die Systemzwischenablage zugreifen, wenn sie mit aktiviertem xterm_clipboard kompiliert wurde. Um herauszufinden, ob Sie über diese Funktion verfügen, führen Sie :versionvim aus und suchen Sie nach der +xterm_clipboardFlagge. Wenn ein Minuszeichen vorangestellt ist, verfügen Sie nicht über diese Funktionalität. In diesem Fall möchten Sie möglicherweise vim selbst kompilieren oder gvim ausführen, für das diese Funktion normalerweise aktiviert ist.
Nelstrom
9
Das Problem bei diesem Ansatz ist, dass der Cursor bewegt und das Fenster verschoben wird. Zweimal. Die andere Antwort hat weit weniger Tastenanschläge und Nachteile :)
sehe
696

Verwenden:

:%y+

alle Zeilen ziehen.

Erläuterung:

  • % um auf den nächsten Befehl zu verweisen, der in allen Zeilen ausgeführt werden soll
  • y diese Zeilen zu ziehen
  • + in die Systemzwischenablage kopieren

NB : In Windows +und *gleichwertig siehe diese Antwort .

Turm
quelle
19
Außerdem ändert sich die Cursorposition nicht.
nperson325681
1
@guangnan: Diese Register existieren nicht in vi; nur in vim. Versuchen Sie zu tippen, :helpum sicherzustellen, dass Sie tatsächlich in vim sind.
Auffälliger Compiler
6
Ich musste set clipboard=unnamed, aber dann hat das super funktioniert!
cdunn2001
234
Vim sagt E850: Invalid register name:(
Lony
23
Diese Lösung funktioniert nur, wenn vim mit der Option Zwischenablage kompiliert wurde (vim --version zeigt in diesem Fall + Zwischenablage an). Wenn nicht, ist Brians Lösung (:% w! Pbcopy) eine Lösung für Mac. Für andere Betriebssysteme (z. B. xclip) stehen Alternativen zur Verfügung.
Yaccob
90

auf dem Mac

  • Ausgewähltes Teil kopieren: Text visuell auswählen (Typ voder Vim normalen Modus) und eingeben:w !pbcopy

  • Kopieren Sie die gesamte Datei :%w !pbcopy

  • Vergangenheit aus der Zwischenablage :r !pbpaste

Brian
quelle
6
Funktioniert reibungslos. Eine Erklärung der Befehle wäre wirklich nett.
Vlad Manuel Mureșan
5
@Geo pbcopyist ein Mac-Dienstprogramm. Funktioniert xselmöglicherweise stattdessen unter Linux oder clipunter Windows.
David Lord
1
Dies funktioniert nicht, wenn die Datei länger als die Höhe Ihres Terminals ist.
Sridhar Sarnobat
1
@SridharSarnobat :%w !pbcopyfunktioniert immer noch, wenn die Datei länger als die Höhe des Terminals ist.
Adrian Schmidt
Oh, tut mir leid, ich meinte über ssh, wo der Client ein Mac und der Server Linux ist (was ich angenommen habe, war das, wonach das OP gesucht hat, aber jetzt, wo ich darüber nachdenke, ist das ein nicht verwandtes Problem). Zu meiner Verteidigung würde ich es vermeiden, vim für das Kopieren und Einfügen lokaler Dateien zu verwenden, aber das ist mein persönlicher Geschmack. Gute Tipps.
Sridhar Sarnobat
56

Die Zwischenablage ist Puffer +. Um in die Zwischenablage zu kopieren, tun Sie "+yund [Bewegung].

So gg"+yGwird die gesamte Datei kopieren.

Ebenso zum Einfügen aus der Zwischenablage, "+p

Tordek
quelle
4
Nur um dies zu ergänzen (4 Jahre später ...), hat dies einen kleinen Nachteil, da Ihre Cursorposition an den Anfang der Datei springt. Um dies zu vermeiden (z. B. wenn Sie dies einer Verknüpfung in Ihrem vimrc zuordnen), können Sie Folgendes tun: mqgg "+ yG`q
Tom Lord
45

Eine andere einfache Möglichkeit, die gesamte Datei zu kopieren, wenn Sie Probleme mit der Verwendung von VI haben, ist die Eingabe von "cat filename". Die Datei wird auf dem Bildschirm angezeigt, und Sie können einfach nach oben und unten scrollen und kopieren / einfügen.

Zack
quelle
1
E603 :: fangen ohne: versuchen
Paul Chris Jones
2
Und wenn Sie dies tun möchten, ohne vim zu verlassen, können Sie den folgenden Befehl ausführen : :!cat %. Und um den Inhalt der Datei programmgesteuert in die Zwischenablage unter Mac OS zu kopieren::!cat % | pbcopy
TanguyP
Benötigt, um Datei von Ubuntu VM unter Windows nach Debian in GCP zu kopieren, die im Browserfenster geöffnet wurde ...: / Variationen von vim yanking funktionierten nicht. Dies funktionierte, um sie in Windows einzufügen und dann eine Datei in GCP hochzuladen.
Frmbelz
31

Dies ist, was ich tue, um die gesamte Datei zu ziehen:

ggVGy
EmilianoGNFNR
quelle
12
Ich fürchte, dies beantwortet die Frage nicht, da Sie zum Standardregister und nicht zur Zwischenablage ziehen.
Auffälliger Compiler
2
@ConspicuousCompiler wäre es, wenn er das clipboardSet hätte, in das er den zerrissenen Text kopieren könnte +.
TankorSmash
@TankorSmash ist jedoch nicht die schnellste (:% y) oder ordentlichste (zumindest ggyG ist besser) Methode.
Pedroapero
@ConspicuousCompiler Was ist der Unterschied zwischen Standardregister und Zwischenablage ?
Nilon
16

Sie können den Befehl "cat" verwenden, um die Datei zu öffnen und mit der Maus zu kopieren

Pham Luan
quelle
5
Aber das wird nicht der "vi" Weg sein, wenn die Datei riesig ist, dann wird es auch ein Problem sein ... Dies könnte funktionieren, aber kein vorgeschlagener Weg ...
Aditya
1
resetdas Terminal vorher, dann alle auswählen und kopieren. Dies funktioniert während der sshSitzung.
Arcol
Der schnellste Weg für große Dateien (unter 10.000 Zeilen) auf verschiedenen Remote-Servern, wenn xterm_clipboard nicht verfügbar ist
Matias Haeussler
10

(als Antwort auf @rshdev und um zu vermeiden, dass vim in Kommentaren zu OP mit + xterm_clipboard per @nelstrom neu kompiliert werden muss)

Es gibt ein Programm namens xclip, das wie Putclip unter Ubuntu 11 funktioniert:

:%!xclip -sel clip
u

Es ist nicht standardmäßig installiert. Verwenden Sie zum Installieren:

sudo apt-get install xclip
Eintopf
quelle
10

Unter Ubuntu 12

Sie könnten versuchen, das vim-gnomePaket zu installieren :

sudo apt-get install vim-gnome

Ich habe es versucht, weil vim --versionmir gesagt wurde, dass das Flag xterm_clipboard deaktiviert sein würde (angezeigt durch - ), das für die Verwendung der Zwischenablage-Funktionalität erforderlich ist.

-> Bei der Installation des vim-gnome- Pakets unter Ubuntu 12 wurde auch eine konsolenbasierte Version von vim installiert, für die diese Option aktiviert ist (angezeigt durch ein + vor dem xterm_clipboard-Flag).

Unter Arch Linux

Sie können vim-clipboardaus dem gleichen Grund installieren .

Wenn Sie neovim ausführen, sollten Sie installieren xclip(wie von erklärt help clipboard-tool)

Arch Linux Tux
quelle
1
unix.stackexchange.com/questions/25965/… gibt es eine andere Option, die jemand kennt?
Sandip Pingle
6

Wenn Sie Vim im visuellen Modus verwenden, gelten zumindest unter Windows auch die Standardtasten zum Ausschneiden und Einfügen.

  • CTRLA bedeutet "Markiere die gesamte Datei.
  • CTRLC bedeutet "Kopieren Sie die Auswahl.
  • ESC bedeutet "Auswahl aufheben, damit Ihr nächster Tastendruck nicht die gesamte Datei ersetzt :-)

Zumindest unter dem Ubuntu-Terminal (Gnome) funktioniert auch die Standardkopie ( CTRLSHIFTCobwohl es anscheinend keine Standardtastenkürzel für gibt select all(außer ALTEgefolgt von A).

paxdiablo
quelle
6
Wenn Sie jedoch mswin.vim nicht verwenden, erhöht Strg-A die nächste Zahl in der aktuellen Zeile.
Mark Rushakoff
@Mark, dieses Verhalten stammt aus einer Standard-Vim-Installation, daher gehe ich davon aus, dass dies die Standardeinstellung ist. Alle Wetten sind deaktiviert, wenn die Umgebung anders konfiguriert ist. Wenn dies der Fall wäre, würde das OP vermutlich wissen, was sie tun :-) In beiden Fällen gab OP in einem Kommentar an, dass sie auf Ubuntu waren, also der Windows-Teil von Meine Antwort trifft wahrscheinlich nicht zu. Das Gnome-Terminal-Zeug würde.
Paxdiablo
5

Sie können gg drücken, um Ihren Cursor an den Anfang der Datei zu bringen, und dann yG drücken, um den gesamten Inhalt von Anfang bis Ende (G gefunden) in buffer.good zu kopieren. Viel Glück!

gameboy90
quelle
4

Ich habe einige der Befehle ausprobiert, die oben erwähnt wurden. Keiner hat funktioniert. Dann habe ich den einfachsten von allen gefunden.

Schritt 1: vi <filename>
Schritt 2: Klicken Sie mit der rechten Maustaste auf die Titelleiste des Putty-Fensters.
Schritt 3: Wählen Sie "Scrollback löschen" (um das Kopieren des Restes Ihrer SSH-Sitzung zu vermeiden).
Schritt 4: Klicken Sie erneut mit der rechten Maustaste und wählen Sie "Alle in Zwischenablage kopieren".

Abhinav Deshpande
quelle
1
Bei einer Datei mit 15000 Zeilen wurde nicht alles erfasst. Ich musste meinen Kitt Window > Settings > lines of scrollbackauf 40000 erhöhen (auch verfügbar, indem ich mit der rechten Maustaste auf die Titelleiste klicke). Es ist auch hilfreich, catanstelle von vi zu verwenden, da hierdurch der gesamte Text gescrollt wird.
Noumenon
1
Auf diese Weise habe ich immer Zeilen vom oberen und unteren Rand der Datei verloren. Was ich jetzt mache, ist cat und dann mit der mittleren Maustaste auf den Anfang und das Ende der Datei klicken, um die Auswahl zu erweitern.
Noumenon
Als ich das versuchte, bekam ich nur die 111 Zeilen auf dem Bildschirm, aber es gibt 174 Zeilen in meiner Datei, also funktionierte Noumenons
Katzenantwort
3

:%y aZieht den gesamten Inhalt in den Puffer von vim. Durch Drücken pim Befehlsmodus wird der gezogene Inhalt nach der Zeile eingefügt, auf der sich Ihr Cursor gerade befindet.

Ma'moon
quelle
3

gVim:

:set go=a

ggVG

Siehe :help go-a:

'a' Autoselect:  If present, then whenever VISUAL mode is started,
 or the Visual area extended, Vim tries to become the owner of
 the windowing system's global selection.  This means that the
 Visually highlighted text is available for pasting into other
 applications as well as into Vim itself.  When the Visual mode
 ends, possibly due to an operation on the text, or when an
 application wants to paste the selection, the highlighted text
 is automatically yanked into the "* selection register.
 Thus the selection is still available for pasting into other
 applications after the VISUAL mode has ended.
     If not present, then Vim won't become the owner of the
 windowing system's global selection unless explicitly told to
 by a yank or delete operation for the "* register.
 The same applies to the modeless selection.
kev
quelle
3

Nun, all diese Ansätze sind interessant, aber als fauler Programmierer benutze ich Yank All Line, indem ich eine Kombination aus Zahl + verwende y

Sie haben beispielsweise eine Quellcodedatei mit insgesamt 78 Zeilen. Sie können Folgendes tun:

  1. gg um den Cursor in der ersten Zeile zu erhalten
  2. 78 + einfügen y -> es zieht 78 Zeilen unter den Cursor und die aktuelle Zeile
arfo
quelle
2

In Bill Joys vi gab es kein Konzept für "Zwischenablage", daher glaube ich nicht, dass es eine integrierte Möglichkeit gibt, dies zu tun.

Die automatische Funktion zum Kopieren von hervorgehobenen Elementen in die Zwischenablage von gVim ist am einfachsten oder Sie verwenden ein externes Programm über :!

Für Cygwins vim benutze ich

:%!putclip
u

Vielleicht hat Ubuntu eine CLI-App wie Putclip?

rshdev
quelle
toller Vorschlag, danke! Es gibt ein solches Programm namens xclip. Für Details habe ich eine separate Antwort gepostet (es wäre zu verwirrend gewesen, aus einem Kommentar zu lesen, ohne die zusätzlichen Zeilenumbrüche und die Code-Formatierung).
Stew
2

Wenn Ihre Finger standardmäßig verwenden CTRL-A CTRL-C, versuchen Sie es mit den Zuordnungen von $VIMRUNTIME/mswin.vim.

" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y

" CTRL-A is Select all
noremap <C-A> gggH<C-O>G
inoremap <C-A> <C-O>gg<C-O>gH<C-O>G
cnoremap <C-A> <C-C>gggH<C-O>G
onoremap <C-A> <C-C>gggH<C-O>G
snoremap <C-A> <C-C>gggH<C-O>G
xnoremap <C-A> <C-C>ggVG

Ich habe sie auf <Leader><C-a>und abgebildet <Leader><C-c>.

go2null
quelle
2

Kopieren Sie die gesamte Datei in das vim oder seine Registerkarten

y G 

Gehen Sie dann zu einer Registerkarte und fügen Sie sie ein

p

und um die gesamte Datei zu schneiden, verwenden Sie

d G
Abdul Basit
quelle
2

Ich habe die folgende Zeile zu meiner .vimrc hinzugefügt

nnoremap <F5> :%y+<CR>

Dadurch kann ich den gesamten Text in Vim durch Drücken von F5(im Befehlsmodus) in die Zwischenablage kopieren .

aks
quelle
1

Hier ist ein Kartenbefehl, mit dem Sie alle mit CTRL+ in die Zwischenablage auswählen können a:

"
" select all with control-a
"
nnoremap <C-a> ggmqvG"+y'q

Fügen Sie es Ihrer .vimrc hinzu und Sie können loslegen ...

jahroy
quelle
1

Ich weiß, dass zehn Jahre darauf geregelt werden sollten, aber die ersten beiden Antworten haben bei mir nicht funktioniert, also habe ich weiter gegraben. Wenn Sie auf einem Redhat (Remote-Server) - Windows 10 (lokaler Computer) das Ganze nicht mit der Maus auswählen können, stecken Sie fest, da die üblichen Kopien nicht zwischen den Zwischenablagen des Remote- und des lokalen Computers funktionieren.

Geben Sie zum Kopieren auf dem Remote-Linux und zum Einfügen unter dem lokalen Windows den primären Puffer mit dem an *Um einzufügen und führen Sie einen schönen Doppelzug aus

Verwenden Sie gg" * yy.

Lefty G Balogh
quelle
0

Ich habe eine Funktion erstellt, um diese Aktion auszuführen. Platzieren Sie sie auf Ihrer ~/.vimrc.

fun! CopyBufferToClipboard()
    %y+
endfun
nnoremap <Leader>y :call CopyBufferToClipboard()<CR>
command! -nargs=0 CopyFile :call CopyBufferToClipboard()

OBS: Wenn Sie neovim verwenden, benötigen Sie auch einen Zwischenablage-Manager wie xclip. Für weitere Informationen geben Sie neovim ein:h checkhealth

Es ist auch wichtig zu erwähnen, dass nicht immer eine einfache yKopie in die Zwischenablage kopiert wird, um zu +versuchen , jeden Kopier-Feed , der "Zwischenablage-Register" ist, einzustellen : :set clipboard=unnamed,unnamedplus. Weitere Informationen finden Sie unter : :h unnamed.

Hier mehr Informationen zu vim wikia.

SergioAraujo
quelle
0

Sie können einen Shortcur wie diesen verwenden:

noremap <F6> :%y+<CR>

Wenn Sie F6 im normalen Modus drücken, wird die gesamte Datei kopiert und der Zwischenablage hinzugefügt. Oder Sie können einfach im normalen Modus tippen :%y+und dann drücken Enter.

Nicolas Pardo
quelle
-1

Klicken Sie mit der linken Maustaste und ziehen Sie über den Abschnitt, den Sie kopieren und freigeben möchten. Der Code wird automatisch in die Zwischenablage kopiert.

Kapeel Kokane
quelle
3
Die Datei kann sehr groß sein, und das Ziehen des gesamten Textes mit der Maus ist weder produktiv noch sinnvoll vi.
Dr. Beco
1
Eigentlich ist das eine gute Antwort und funktioniert für mich. In meinem System ist die Umgebung sehr restriktiv. Ich muss die Ausgabe auf dem Bildschirm katzen und dann mit der Maus ziehen, auswählen und loslassen. Dann kopiere ich in Windows Notepad ++. Und es funktioniert großartig. Sonst funktioniert nichts.
Apurva Singh
-1

Ich konnte mit den obigen Antworten keine Dateien kopieren, aber ich habe Kitt und eine Problemumgehung für Quora gefunden.

  1. Ändern Sie die Einstellungen Ihrer PuTTY-Sitzung, gehen Sie zur Protokollierung und ändern Sie sie in "druckbare Zeichen". Legen Sie die Protokolldatei fest
  2. Machen Sie eine Katze der jeweiligen Datei
  3. Gehen Sie zu der Datei, die Sie in Schritt 1 festgelegt haben, und Sie haben Ihren Inhalt in der Protokolldatei.

Hinweis: Es werden alle gedruckten Zeichen dieser Sitzung in die Protokolldatei kopiert, sodass sie irgendwann groß wird. Löschen Sie in diesem Fall die Protokolldatei und ordnen Sie die Zieldatei zu, damit der Inhalt dieser bestimmten Datei auf Ihren Computer kopiert wird.

thewhitetulip
quelle