Wie kann ich Text aus Vim in die Systemzwischenablage kopieren?


282

Gibt es eine Möglichkeit, einen Textblock in die Systemzwischenablage zu kopieren, damit ich ihn in ein anderes Programm einfügen kann?


12
Dies wurde bereits auf SO gefragt und beantwortet. Möglicherweise finden Sie dort weitere und andere Informationen.
bsmith89

1
Ich habe dieses Plugin auf macvim christoomey / vim-system-copy benutzt und liebe es wirklich. Es funktioniert wirklich gut mit Bewegungen cpip, cpi{.
Filype

2
Was Sie wirklich brauchen, ist EasyClip . Genau das und noch viel mehr ...
Scott Wade

Antworten:


321

Für X11- basierte Systeme (dh Linux und die meisten anderen UNIX- ähnlichen Systeme) gibt es zwei voneinander unabhängige Zwischenablagen:

  • PRIMARY - Dies ist Copy-on-Select und kann mit der mittleren Maustaste eingefügt werden.
  • CLIPBOARD - Dies wird (normalerweise) kopiert ^Cund eingefügt ^V(es ist wie bei MS Windows).

OS X- und Windows- Systeme haben nur eine Zwischenablage.

Für X11-Systeme gibt es auch eine Reihe von Tools, die diese Zwischenablagen für Sie synchronisieren. Wenn sie also identisch zu sein scheinen, kann einer von ihnen ausgeführt werden.

Vim hat zwei spezielle Register, die diesen Zwischenablagen entsprechen:

  • *benutzt PRIMARY; mnemonic: S Teer ist S elect (für Copy-on - s wählen)
  • +benutzt CLIPBOARD; Gedächtnisstütze: STRG PLUS C (für die allgemeine Tastenkombination)

Unter Windows und OS X gibt es keinen Unterschied zwischen +und *, da diese Systeme nur eine Zwischenablage haben und beide Register auf dasselbe verweisen (es ist egal, welches Sie verwenden).

Sie können diese Register als jedes Register verwenden. Verwenden Sie beispielsweise die PRIMARY-Zwischenablage *mit den Befehlen yund p:

  • "*yy
  • "*p

Sie könnten dies vielleicht als bequemere Tastenkombination verwenden:

noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p

Wenn Sie sich "automatisch" mit der Zwischenablage des Systems verbinden möchten, anstatt ständig manuell darauf zu verweisen, können Sie die clipboardVariable festlegen :

  • Setzen Sie sich auf unnamedverwenden *(primär, bei der Auswahl)
  • Setzen Sie ihn auf unnamedplusverwenden +(Zwischenablage ^C)

Wenn Sie jetzt nur verwenden, yywird anstelle des unbenannten Registers von Vim die Zwischenablage des Systems aufgerufen und pdie Zwischenablage des Systems eingefügt.

Sie können diesen Registern auch wie jedem anderen Register Folgendes zuweisen let:

  • :let @+=42
  • :let @*=42

Die clipboardEinstellung verfügt über einige weitere Optionen (z. B. Filter ausschließen). Aber das sind die Grundlagen. Siehe :help 'clipboard'für die ganze Geschichte ;-)

gVim

Wenn Sie gVim verwenden, können Sie bei der Verwendung Copy-on-Select-Verhalten erhalten :set guioptions+=a.
Dies ist standardmäßig auf X11-Systemen aktiviert (Kopien nach PRIMARY), jedoch nicht unter MS Windows und OSX (wenn Sie einen beliebigen Text auswählen, wird Ihre Zwischenablage überschrieben).

Nein +clipboard?

Für Vim ist das +clipboardFeature-Flag erforderlich, damit dies funktioniert. Sie können überprüfen, ob Ihr Vim dies hat, indem Sie :echo has('clipboard')in Vim (wenn die Ausgabe vorhanden ist 0, ist sie nicht vorhanden, wenn sie vorhanden 1ist) oder die Ausgabe von vim --versionfor überprüfen +clipboard.

Die meisten Linux-Distributionen werden standardmäßig mit einem "minimalen" Vim-Build ausgeliefert, den es nicht gibt +clipboard, den Sie jedoch normalerweise installieren können:

  • Debian & Ubuntu: Installieren Sie vim-gtkoder vim-gnome.
  • Fedora: installieren vim-X11und ausführen vimxstatt vim( mehr Infos ).
  • Arch Linux: installieren gvim(dies wird auch +clipboardfür den normalen Betrieb aktiviert vim).

Sie können auch verwenden xclip, xcopyoder xselText in die Zwischenablage zu kopieren; Siehe die folgenden Fragen für Lösungen:

SSH

Sie können eine Zwischenablage auch auf Remotecomputern verwenden, wenn Sie die X11-Weiterleitung über SSH aktivieren. Dies ist besonders bei dem obigen Tipp hilfreich, da Sie dann xclipauf die Zwischenablage Ihres Desktops zugreifen können. Das Vim auf dem Computer, auf dem Sie gerade shoppen, benötigt diese +clipboardFunktion weiterhin.

Dies erfordert die ForwardX11TrustedEinstellung und sollte nur mit vertrauenswürdigen Servern durchgeführt werden , da der Server so fast die vollständige Kontrolle über Ihre X11-Sitzung hat:

$ ssh -XY myhost

Um diese Einstellungen dauerhaft zu machen (sodass Sie sie nicht -XYjedes Mal hinzufügen müssen ), können Sie in folgenden Schritten Folgendes tun ~/.ssh/config:

# Do **NOT** set this globally; it gives the server complete control over
# your X11 session.
Host myhost
    ForwardX11 yes
    ForwardX11Trusted yes

Neovim

Neovim überarbeitete die Unterstützung für die Zwischenablage. Die eingebaute Schnittstelle wurde mit einem System entfernt und ersetzt werden, die ein externes Dienstprogramm aufrufen , wie beispielsweise xclip, xseloder pbcopy/ pbpaste.

Diese Dienstprogramme sollten automatisch abgerufen und verwendet werden. Unter OS X pbcopy und pbpastesollte standardmäßig verfügbar sein, unter Linux möchten Sie wahrscheinlich installieren xclip, da dies am weitesten verbreitet ist (es gibt tatsächlich zwei Versionen xselmit inkompatiblen Flags . Das ist wirklich dumm).

Siehe auch :help clipboardin Neovim.


6
ssh -Y impliziert -X, sodass -X weggelassen werden kann.
Hildred

Bei einigen internationalen Tastaturen müssen Sie möglicherweise drücken "<Space>, um eine zu erhalten ". In diesem Fall müssten Sie also drücken "<Space>+yoder "<Space>*ykopieren.
Arthur F

1
Ein sehr interessanter Nebeneffekt des Lernens (vor einigen Jahren) war für mich die Erkenntnis, dass "viele benannte Register ausgewählt werden können. "+ist keine Magie, es ist nur registrieren +. So zum Beispiel, wenn Sie wollen drei Dinge gleichzeitig kopieren und jeder von ihnen eins nach dem anderen einfügen, können Sie "1y, "2yund "3yspäter "1p, "2pund "3p. Das ist wirklich mächtig und in fast jedem anderen Editor nicht vorhanden. Eine andere interessante Verwendung ist das Betrachten gespeicherter Makros. Wenn Sie beispielsweise mit aufnehmen qq, aber feststellen, dass Sie das Problem beheben müssen, können Sie: in einer temporären Zeile das Problem "qpbeheben und "qd.
Shahbaz

1
Nur eine Anmerkung: OS X verfügt über zwei separate Zwischenablagen. Auf einen wird mit Cmd-C und Cmd-V und auf den anderen mit den emacs-Tastenkombinationen Strg-K und Strg-Y zugegriffen.
BallpointBen

3
@shahbaz - wahrscheinlich besser, um die Buchstabenregister für einen solchen Zweck zu verwenden, da die nummerierten geändert werden, wenn Text gelöscht wird.
Übelsuppe

18

Die anderen Antworten beschreiben, wie Sie Text aus Ihrem Puffer in die Zwischenablage des Systems kopieren. Eine weitere häufige Operation ist das Kopieren von Text aus einem anderen Register in die Zwischenablage. Wenn Sie beispielsweise bereits Text in "das Standardregister gezogen haben, möchten Sie dieses Register möglicherweise in die Zwischenablage laden.

Sie können dies tun mit :let:

  • let @+=@" - kopiert das Standardregister in die Zwischenablage
  • let @*=@" - kopiert das Standardregister in die X11-Primärauswahl ("Maus-Zwischenablage")
  • let @+=@a- aus dem Register ain die Zwischenablage kopieren
  • usw.

Beachten Sie, dass dies für Register im Allgemeinen funktioniert: let @a=@bkopiert Register bzu Register a.


17

Von http://vim.wikia.com/wiki/Accessing_the_system_clipboard

set clipboard=unnamedplus

Dadurch wird das Standard-Vim-Register in das +Register geändert , das mit der Systemzwischenablage verknüpft ist. Von :h clipboard-unnamedplus:

                                        clipboard-unnamedplus
unnamedplus     A variant of the "unnamed" flag which uses the
                clipboard register '+' (quoteplus) instead of
                register '*' for all yank, delete, change and put
                operations which would normally go to the unnamed
                register.  When "unnamed" is also included to the
                option, yank operations (but not delete, change or
                put) will additionally copy the text into register
                '*'.
                Only available with the +X11 feature.
                Availability can be checked with: 
                        if has('unnamedplus')

Warum funktioniert das bei mir nicht, wenn zwischen vim-Instanzen (jeweils in einem separaten Terminator-Terminal) gezogen und eingefügt wird?
Thinwybk

Wenn Sie unter Linux arbeiten und Vim mit der Funktion + X11 kompiliert wurde und clipboard = unnamedplus gesetzt ist, sollten Sie in der Lage sein, eine Zeile in einer Instanz von vim zu ziehen und in eine andere Instanz von vim einzufügen. Sie sollten es auch mit STRG + V oder UMSCHALT + EINFÜGEN in eine andere Anwendung einfügen können. Sie können :versionin Vim überprüfen, ob + X11 in der Liste der enthaltenen Funktionen angezeigt wird. Sie können auch überprüfen, ob die Funktion "unnamedplus" verfügbar ist. :if has('unnamedplus')⏎ echo 'yes'⏎ endif Wenn Sie nicht unter Linux arbeiten, sollten Sie unnamed anstelle von unnamedplus verwenden.
Quincy Bowers

10

Bei Builds, die dies unterstützen, ist das genannte Register *die Systemzwischenablage. Um Text von Vim in die Systemzwischenablage zu kopieren, können Sie den Text im visuellen Modus auswählen und dann drücken, "*yum ihn in die Systemzwischenablage zu kopieren.

Verwenden Sie umgekehrt, um "*pText aus der Systemzwischenablage in Vim einzufügen.


5

Ich empfehle Ihnen, Gvim zu verwenden und Folgendes hinzuzufügen .vimrc:

source $VIMRUNTIME/mswin.vim
behave mswin

Dies ermöglicht die Unterstützung für CtrlC, CtrlX, CtrlVwie Notepad in Windows.

Beachten Sie, dass dies auch einige andere gängige Windows - Verknüpfungen hinzuzufügen, wie CtrlSfür :w, CtrlAfür alle auswählen usw.


0

Wenn Ihr vim nicht unterstützt +clipboard, können Sie das fakeclip- Plugin für Linux, Mac, Windows, tmux, screen, ... verwenden.


0

Jede andere Antwort hat alle wichtigen Dinge über die Register abgedeckt. Ich möchte noch eine Sache hinzufügen, die ich benutze.

In Vim gibt es eine Möglichkeit, den visuell ausgewählten Text direkt in die Zwischenablage zu kopieren . Fügen Sie dies einfach in Ihre vimrc- Datei ein:

set guioptions+=a

Wenn Sie einen Text visuell auswählen, wird dieser in Ihre Zwischenablage kopiert. Weitere Informationen hierzu finden Sie unter:help guioptions

Übrigens ist dies nur für gVim.


2
guioptions+=awird auch in der Antwort von Carpetsmoker erwähnt.
Muru

@muru Ja, Entschuldigung. Das habe ich vorher nicht gesehen. Ich habe es gerade gesehen.
Durga Swaroop

0

Sie können auch einen globalen Befehl verwenden, um ein bestimmtes Muster in die Zwischenablage zu kopieren. Dies kann in Situationen nützlich sein, in denen Informationen in einer Datei verstreut sind und das manuelle Kopieren fehleranfällig und anstrengend ist.

Reinigen Sie zuerst das Register, das die Informationen erhalten soll

:let @a=""

Kopieren Sie dann alle Zeilen, die das Muster enthalten

:g/pattern/yank A

Zuletzt werden die Informationen in die Zwischenablage des Systems übertragen (kopiert)

:let @+=@a

Wenn Sie versuchen, jede Zeile, die ein "Muster" enthält, direkt in die Zwischenablage zu kopieren, funktioniert dies nicht, da die Zwischenablage keinen neuen Inhalt anfügen kann. Daher verwenden wir hier ein normales VIM-Register, um alle Zeilen zu speichern, die das Muster enthalten Muster sofort und dann in die Zwischenablage legen.

OBS: Es ist notwendig, das Register zu löschen, bevor es verwendet wird, und die Verwendung der GROSSBUCHSTABEN-Version des Registers ermöglicht es uns, Inhalte anzufügen, andernfalls funktioniert es auch nicht.


0

Wenn Sie nicht herausfinden können, wie Sie +clipboardzur Arbeit kommen, was ich aus irgendeinem Grund nicht konnte, dann können Sie dies tun.

Angenommen, Sie möchten nur einen Teil der Datei kopieren , dann gehe ich shift+ vin den visuellen Modus und hebe nur die Zeilen hervor, die ich kopieren möchte. Dann mache ich das.

# Linux Wayland
:'<,'>w !wl-copy

# Linux Xorg
:'<,'>w !xclip -selection clipboard

Erläuterung

  • '<,'> - bedeutet, dass Sie den visuellen Modus zur Auswahl eines Bereichs verwendet haben (Sie geben dies nicht ein)
  • w !{cmd}- Schreibe den Bereich auf den Standard von cmd, siehe mehr unter:help w_c
  • wl-copyund xclipsind Programme, an die Sie Text weiterleiten können, und diese fügen ihn in die Zwischenablage Ihres Systems ein

Sobald dies einmal in Ihrem Verlauf ist, müssen Sie das Ganze nicht noch einmal eingeben. Wählen Sie einfach im visuellen Modus aus, geben Sie ein wund drücken Sie die Taste nach oben. Der Befehl sollte sich automatisch vervollständigen. Außerdem müssen Sie den visuellen Modus nicht verwenden. Sie können den gewünschten Bereich einstellen.

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.