Jak mogę skopiować tekst do schowka systemowego z Vima?


281

Czy istnieje sposób na skopiowanie bloku tekstu do schowka systemowego, aby można go było wkleić w innym programie?


12
To zostało już zadane i udzielone na SO. Możesz tam znaleźć więcej różnych informacji.
bsmith89

1
Korzystam z tej wtyczki na macvim christoomey / vim-system-copy i naprawdę ją lubię . To działa bardzo dobrze z wnioskami cpip, cpi{.
Filype

2
To, czego naprawdę potrzebujesz, to EasyClip . Zrobi to i wiele więcej ...
Scott Wade,

Odpowiedzi:


320

W przypadku systemów opartych na X11 (tj. Linux i większość innych systemów podobnych do UNIX ) istnieją dwa schowki, które są od siebie niezależne:

  • PODSTAWOWE - Jest to kopiowanie przy wyborze i można je wkleić środkowym przyciskiem myszy.
  • SCHOWEK - Jest to kopiowane (zwykle) ^Ci wklejane ^V(To jest jak MS Windows).

Systemy OS X i Windows mają tylko jeden schowek.

W systemach X11 dostępnych jest również wiele narzędzi, które synchronizują te schowki; więc jeśli wydają się być takie same, być może jeden z nich działa.

Vim ma dwa specjalne rejestry odpowiadające tym schowkom:

  • *używa PODSTAWOWY; pamięciowy: S TAR S elekt (na kopię-on- a elekt)
  • +używa SCHOWKA; mnemonic: CTRL PLUS C (dla wspólnego skrótu klawiszowego)

W systemach Windows i OS X nie ma różnicy między +i *, ponieważ systemy te mają tylko jeden schowek, a oba rejestry odnoszą się do tej samej rzeczy (nie ma znaczenia, którego używasz).

Możesz używać tych rejestrów jako dowolnego rejestru. Na przykład za pomocą schowka PODSTAWOWEGO *z poleceniami yi p:

  • "*yy
  • "*p

Możesz użyć tego jako wygodniejszych skrótów klawiszowych:

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

Jeśli chcesz „automatycznie” łączyć się ze schowkiem systemu zamiast odwoływać się do niego ręcznie przez cały czas, możesz ustawić clipboardzmienną:

  • Ustaw unnamedna użycie *(PODSTAWOWE, po wybraniu)
  • Ustaw, aby unnamedplusużyć +(SCHOWEK, ^C)

Teraz wystarczy użyć yyspowoduje przejście do schowka systemu, zamiast nienazwanego rejestru Vima i pwklei schowek systemu.

Możesz także przypisać do tych rejestrów, tak jak każdy rejestr z let:

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

To clipboardustawienie ma kilka dodatkowych opcji (takich jak filtry wykluczania); ale to są podstawy. Zobacz :help 'clipboard'całą historię ;-)

gVim

Jeśli używasz gVim, możesz uzyskać zachowanie kopiowania przy wybieraniu podczas korzystania :set guioptions+=a.
Jest to domyślnie włączone w systemach X11 (kopiowanie do PODSTAWOWEJ), ale nie w MS Windows i OSX (ponieważ zaznaczenie dowolnego tekstu zastąpiłoby Twój schowek).

Nie +clipboard?

Aby Vim +clipboarddziałał, Vim wymaga flagi funkcji; można sprawdzić, czy Vim ma to za pomocą :echo has('clipboard')od wewnątrz vim (jeśli wyjście jest 0, to nie występuje, jeśli jest 1, to jest), lub sprawdzając dane wyjściowe vim --versiondla +clipboard.

Większość dystrybucji Linuksa jest domyślnie dostarczana z „minimalną” kompilacją Vima, której nie ma +clipboard, ale zazwyczaj można ją zainstalować:

  • Debian i Ubuntu: Zainstaluj vim-gtklub vim-gnome.
  • Fedora: zainstaluj vim-X11i uruchom vimxzamiast vim( więcej informacji ).
  • Arch Linux: zainstaluj gvim(pozwoli to również +clipboardna normalne vim).

Możesz także użyć xclip, xcopylub, xselaby skopiować tekst do schowka; zobacz następujące pytania dotyczące rozwiązań:

SSH

Możesz także użyć schowka na zdalnych komputerach, jeśli włączysz przekazywanie X11 przez SSH. Jest to szczególnie przydatne w przypadku powyższej wskazówki, ponieważ można następnie użyć xclipdo uzyskania dostępu do schowka na pulpicie. Vim na maszynie, do której śpiewasz, nadal będzie potrzebował tej +clipboardfunkcji.

Wymaga to ForwardX11Trustedustawienia i powinno być wykonywane tylko z zaufanymi serwerami , ponieważ daje to serwerowi prawie całkowitą kontrolę nad twoją sesją X11:

$ ssh -XY myhost

Aby te ustawienia były trwałe (więc nie trzeba ich dodawać za -XYkażdym razem), możesz zrobić coś takiego ~/.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 odnowił obsługę schowka. Wbudowany w interfejs został usunięty i zastąpiony przez system, który nazywają narzędzia zewnętrznego, takiego jak xclip, xsellub pbcopy/ pbpaste.

Powinien automatycznie podnieść te narzędzia i z nich korzystać. W systemie OS X pbcopy i pbpastepowinien być domyślnie dostępny, w systemie Linux prawdopodobnie chcesz go zainstalować xclip, ponieważ jest on najbardziej dostępny (w rzeczywistości istnieją dwie wersje xselz niezgodnymi flagami . To naprawdę głupie).

Zobacz także :help clipboardw Neovim.


6
ssh -Y oznacza -X, więc -X można pominąć.
Hildred

W przypadku niektórych klawiatur międzynarodowych konieczne może być naciśnięcie przycisku, "<Space>aby uzyskać ". W takim przypadku należy nacisnąć "<Space>+ylub "<Space>*yskopiować.
Arthur F

1
Bardzo interesującym efektem ubocznym uczenia się tego (kilka lat temu) była dla mnie realizacja, która "może wybrać wiele nazwanych rejestrów. "+to nie magia, to tylko rejestracja +. Tak na przykład, jeśli chcesz skopiować trzy rzeczy jednocześnie i wkleić każdy z nich, jeden po drugim, można "1y, "2ya "3ypóźniej "1p, "2pi "3p. Jest to naprawdę potężne i nie istnieje w prawie żadnym innym edytorze. Innym interesującym zastosowaniem jest przeglądanie przechowywanych makr. Na przykład, jeśli nagrywasz za pomocą qq, ale zdajesz sobie sprawę, że musisz to naprawić, możesz: w linii tymczasowej "qpnaprawić to i "qd.
Shahbaz

1
Tylko uwaga: OS X ma dwa osobne schowki. Jedno jest dostępne za pomocą Cmd-C i Cmd-V, a drugie za pomocą skrótów klawiszowych Emacsa Ctrl-K i Ctrl-Y.
BallpointBen

3
@shahbaz - prawdopodobnie lepiej użyć do tego celu rejestrów literowych, ponieważ numery ponumerowane zmieniają się przy każdym usuwaniu tekstu.
evilsoup

18

Pozostałe odpowiedzi dotyczą sposobu kopiowania tekstu z bufora do schowka systemowego. Inną częstą operacją jest kopiowanie tekstu z innego rejestru do schowka. Na przykład, jeśli szarpnąłeś już jakiś tekst "(rejestr domyślny), możesz chcieć załadować ten rejestr do schowka.

Możesz to zrobić za pomocą :let:

  • let @+=@" - kopiuje domyślny rejestr do schowka
  • let @*=@" - kopiuje domyślny rejestr do podstawowego wyboru X11 („schowek myszy”)
  • let @+=@a- skopiuj z rejestru ado schowka
  • itp.

Zauważ, że działa to ogólnie dla rejestrów: let @a=@bkopie rejestrują się w bcelu rejestracji a.


17

Ze strony http://vim.wikia.com/wiki/Accessing_the_system_clipboard

set clipboard=unnamedplus

To zmienia domyślny rejestr Vima na +rejestr, który jest połączony ze schowkiem systemowym. Od :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')

Dlaczego to nie działa dla mnie, gdy szarpanie i wklejanie między instancjami vima (każda w osobnym terminalu terminatora)?
thinwybk

Jeśli korzystasz z Linuksa, a Vim został skompilowany z funkcją + X11 i masz ustawiony schowek = unnamedplus, powinieneś być w stanie szarpnąć linię w jednej instancji vima i wkleić ją w innej instancji vima. Powinieneś także mieć możliwość wklejenia go do dowolnej innej aplikacji za pomocą CTRL + V lub SHIFT + INSERT. Możesz użyć :versionw Vimie, aby sprawdzić, czy + X11 pojawia się na liście zawartych funkcji. Możesz również sprawdzić, czy funkcja „unnamedplus” jest dostępna za pomocą :if has('unnamedplus')⏎ echo 'yes'⏎ endif Jeśli nie używasz Linuksa, powinieneś użyć unnamedplus zamiast unnamedplus.
Quincy Bowers

10

W kompilacjach, które go obsługują, nazwanym rejestrem *jest schowek systemowy. Aby skopiować tekst z Vima do schowka systemowego, możesz zaznaczyć tekst w trybie wizualnym, a następnie nacisnąć, "*yaby skopiować go do schowka systemowego.

I odwrotnie, użyj, "*paby wkleić tekst ze schowka systemowego do Vima.


5

Polecam używać Gvim i dodać to do .vimrc:

source $VIMRUNTIME/mswin.vim
behave mswin

Umożliwia to obsługę CtrlC, CtrlX, CtrlVjak notatnika w systemie Windows.

Pamiętaj, że spowoduje to również dodanie innych typowych skrótów systemu Windows, takich jak CtrlSdla :w, CtrlAdla zaznaczania wszystkich itp.


0

Jeśli twój vim nie obsługuje +clipboard, możesz użyć wtyczki fakeclip dla systemów Linux, Mac, Windows, Tmux, Screen, ...


0

Każda inna odpowiedź obejmowała wszystkie ważne rzeczy dotyczące rejestrów. Chciałbym dodać jeszcze jedną rzecz, której używam.

W Vimie jest sposób na bezpośrednie skopiowanie wizualnie zaznaczonego tekstu do schowka. Po prostu umieść to w swoim pliku vimrc :

set guioptions+=a

Dzięki temu za każdym razem, gdy wizualnie wybierzesz jakiś tekst, zostanie on skopiowany do schowka. Aby uzyskać więcej informacji na ten temat,:help guioptions

BTW, to jest tylko dla gVim.


2
guioptions+=ajest również wspomniany w odpowiedzi Carpetsmoker.
muru

@muru Tak, przepraszam. Nie widziałem tego wcześniej. Właśnie to widziałem.
Durga Swaroop

0

Możesz także użyć polecenia globalnego, aby umieścić określony wzór w schowku. Może być przydatny w sytuacjach, w których informacje są rozproszone w pliku, a ręczne kopiowanie jest podatne na błędy i męczenie.

Najpierw wyczyść rejestr, który otrzyma informacje

:let @a=""

Następnie skopiuj do niego wszystkie linie zawierające wzór

:g/pattern/yank A

Wreszcie przeniesienie (skopiowanie) informacji do schowka systemowego

:let @+=@a

jeśli spróbujesz skopiować każdą linię zawierającą „wzór” bezpośrednio do schowka, to nie zadziała, ponieważ schowek nie ma możliwości dodania nowej zawartości, dlatego używamy tutaj normalnego rejestru vim do przechowywania wszystkich linii zawierających wzór od razu, a następnie umieszczenie go w schowku.

OBS: Konieczne jest wyczyszczenie rejestru przed jego użyciem, a użycie wersji UPPERCASE rejestru pozwala nam na dołączanie treści, w przeciwnym razie też nie będzie działać.


0

Jeśli nie możesz wymyślić, jak dostać się +clipboarddo pracy, czego z jakiegoś powodu nie mogłem, możesz to zrobić.

Zakładając, że chcesz tylko skopiować sekcję pliku, robię shift+, vaby przejść do trybu wizualnego i zaznaczać tylko linie, które chcę skopiować. Potem to robię.

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

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

Wyjaśnienie

  • '<,'> - oznacza, że ​​użyłeś trybu wizualnego, aby wybrać zakres (nie wpisujesz tego)
  • w !{cmd}- zapisz zakres na standardowe wejście cmd, patrz więcej na:help w_c
  • wl-copyi xclipsą programami, do których możesz przeciągać tekst i dodają go do schowka systemowego

Ponadto, gdy znajdzie się to w twojej historii, nie musisz ponownie wpisywać całego tekstu. Po prostu wybierz w trybie wizualnym, wpisz, wa następnie naciśnij w górę, a polecenie powinno się automatycznie uzupełniać. Ponadto nie musisz używać trybu wizualnego. Możesz ustawić dowolny zakres.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.