Skopiuj wszystkie linie do schowka


564

Czy istnieje sposób na skopiowanie wszystkich wierszy z otwartego pliku do schowka w edytorze VI. Próbowałem, yGale nie używa schowka do przechowywania tych linii.

Czy to możliwe?



1
Jeśli korzystasz z systemu Windows, a szarpnięcie nie działa, zobacz 17. odpowiedź z góry: stackoverflow.com/questions/1620018/...
Noumenon,

Odpowiedzi:


635

Powinieneś szarpnąć tekst do rejestru* lub :+

gg"*yG

Wyjaśnienie:

  • gg aby ustawić kursor na pierwszym znaku pliku
  • "*yaby uruchomić polecenie szarpnięcia do rejestru *od pierwszego wiersza, aż ...
  • G przejść na koniec pliku

6
Jak oznaczyć tekst, aby wyglądał jak klucze? Nie widziałem tego jeszcze na SO.
jergason

10
Witaj ... nie działa? Dane w schowku pozostają niezmienione. kiedy piszę gg kursor przechodzi do pierwszego wiersza ... ale kiedy piszę "* yG .. cpu wydaje sygnał dźwiękowy w * .. więc czy to normalne czy jakiś problem z moim vimem? Jestem na Ubuntu ..
Xinus

1
Czy masz włączone Deadkeys? (np ". po naciśnięciu „a dostajesz á”). Jeśli tak, musisz nacisnąć spację po .
Tordek

144
Vim może uzyskać dostęp do schowka systemowego tylko wtedy, gdy jest skompilowany z włączoną funkcją xterm_clipboard. Aby dowiedzieć się, czy masz tę funkcję, uruchom :versionvim i poszukaj +xterm_clipboardflagi. Jeśli jest poprzedzony znakiem minus, to nie będziesz mieć tej funkcji. W takim przypadku możesz samodzielnie skompilować vima lub uruchomić gvim, który zwykle ma włączoną tę funkcję.
nelstrom

9
Problem z tym podejściem polega na tym, że przesuwa on kursor i przewija okno. Dwa razy. Inna odpowiedź ma znacznie mniejszą liczbę naciśnięć klawiszy i wady :)
sehe

696

Posługiwać się:

:%y+

szarpać wszystkie linie.

Wyjaśnienie:

  • % odnieść następne polecenie do pracy na wszystkich liniach
  • y szarpać te linie
  • + aby skopiować do schowka systemowego

Uwaga : w systemie Windows +i *równoważne patrz ta odpowiedź .


19
Ponadto nie zmieni położenia kursora.
nperson325681,

1
@guangnan: Te rejestry nie istnieją w vi; tylko w vimie. Spróbuj pisać, :helpaby upewnić się, że naprawdę jesteś w vimie.
Widoczny kompilator

6
Musiałem set clipboard=unnamed, ale to zadziałało świetnie!
cdunn2001

234
Vim mówi E850: Invalid register name:(
lony

23
To rozwiązanie działa tylko wtedy, gdy vim został skompilowany z opcją schowka (w tym przypadku vim --version pokaże + schowek). Jeśli nie, rozwiązanie Briana (:% w! Pbcopy) jest rozwiązaniem dla komputerów Mac. Alternatywy są dostępne dla innych systemów operacyjnych (np. Xclip).
yaccob

90

na Macu

  • skopiuj wybraną część: wizualnie zaznacz tekst (wpisz vlub Vw trybie normalnym) i wpisz tekst:w !pbcopy

  • skopiuj cały plik :%w !pbcopy

  • przeszłość ze schowka :r !pbpaste


6
Działa płynnie. Wyjaśnienie poleceń byłoby naprawdę miłe.
Vlad Manuel Mureșan

5
@Geo pbcopyto narzędzie dla komputerów Mac. W systemie Linux xselmoże zamiast tego działać lub clipw systemie Windows.
David Lord,

1
To nie zadziała, jeśli plik jest dłuższy niż wysokość terminala.
Sridhar Sarnobat

1
@SridharSarnobat :%w !pbcopynadal działa, jeśli plik jest dłuższy niż wysokość terminala.
Adrian Schmidt

Och, przepraszam, miałem na myśli ssh, gdzie klientem jest Mac, a serwerem jest Linux (co, jak zakładałem, było tym, czego szukał OP, ale teraz, gdy o tym myślę, to niezwiązany problem). W mojej obronie unikałbym vima do kopiowania i wklejania lokalnych plików, ale to mój osobisty gust. Dobre wskazówki.
Sridhar Sarnobat,

56

Schowek jest buforem +. Aby skopiować do schowka, wykonaj "+yi [ruch].

Skopiuje gg"+yGcały plik.

Podobnie, aby wkleić ze schowka, "+p


4
Aby dodać do tego (4 lata później ...), ma to niewielką wadę polegającą na tym, że pozycja kursora przeskakuje na początek pliku. Aby tego uniknąć (np. Jeśli mapujesz to na skrót w vimrc), możesz zrobić coś takiego: mqgg "+ yG`q
Tom Lord

45

Innym łatwym sposobem na skopiowanie całego pliku, jeśli masz problemy z używaniem VI, jest po prostu wpisanie „cat filename”. Wyświetli plik na ekranie, a następnie możesz po prostu przewijać w górę i w dół oraz kopiować / wklejać.


1
E603:: złap bez: spróbuj
Paul Chris Jones

2
A jeśli chcesz to zrobić bez wychodzenia z vim, można uruchomić następujące polecenie: :!cat %. I programowo skopiować zawartość pliku do schowka w systemie Mac OS::!cat % | pbcopy
TanguyP

Potrzebne do skopiowania pliku z Ubuntu VM w systemie Windows do Debiana w GCP otwartego w oknie przeglądarki ...: / Nie działały odmiany vim yanking, działało to w przypadku wklejenia do systemu Windows, a następnie przesłania pliku do GCP.
frmbelz

31

Oto, co robię, aby szarpać cały plik:

ggVGy

12
Obawiam się, że to nie odpowiada na pytanie, ponieważ zaciągasz się do rejestru domyślnego, a nie do schowka.
Widoczny kompilator

2
@ ConspicuousCompiler zrobiłby to, gdyby miał clipboardzestaw do kopiowania szarpanego tekstu +.
TankorSmash

@TankorSmash nie jest jednak najszybszą (:% y) ani najładniejszą (przynajmniej ggyG jest lepsza) metodą.
pedroapero 28.09.16

@ ConspicuousCompiler jaka jest różnica między domyślnym rejestrem a schowkiem ?
nilon

17

Możesz użyć polecenia „cat”, aby otworzyć plik i użyć myszy do kopiowania


5
Ale to przyzwyczajenie być „vi” sposób, jeśli plik jest ogromny wtedy też będzie problem ... Ta praca może, ale nie zaproponował sposób ...
Aditya

1
resetterminal, a następnie wybierz wszystko i skopiuj. Działa to poprzez sshsesję.
arcol

Najszybszy sposób na duże pliki (poniżej 10 tysięcy linii) na różnych zdalnych serwerach, jeśli xterm_clipboard jest niedostępny
Matias Haeussler

10

(w odpowiedzi na @rshdev i aby uniknąć konieczności ponownej kompilacji vima z + xterm_clipboard na @nelstrom w komentarzach do OP)

w Ubuntu 11 jest program o nazwie xclip, który działa jak putclip:

:%!xclip -sel clip
u

nie jest domyślnie instalowany. aby zainstalować, użyj:

sudo apt-get install xclip

10

Na Ubuntu 12

możesz spróbować zainstalować vim-gnomepakiet:

sudo apt-get install vim-gnome

Próbowałem, ponieważ vim --versionpowiedział mi, że flaga Xterm_clipboard będzie wyłączona (wskazane przez - ), która jest potrzebna do korzystania z funkcji schowka.

-> instalacja pakietu vim-gnome na Ubuntu 12 również zainstalowała wersję vima opartą na konsoli, która ma włączoną tę opcję (oznaczoną + przed flagą xterm_clipboard)

Na Arch Linux

możesz zainstalować vim-clipboardz tego samego powodu.

Jeśli uruchamiasz neovim, powinieneś zainstalować xclip(zgodnie z wyjaśnieniem help clipboard-tool)


1
unix.stackexchange.com/questions/25965/... czy jest jakaś inna opcja, którą ktoś zna?
Sandip Pingle,

6

Jeśli używasz Vima w trybie wizualnym, obowiązują również standardowe klawisze wycinania i wklejania, przynajmniej w systemie Windows.

  • CTRLA oznacza „Zaznacz cały plik.
  • CTRLC oznacza „Skopiuj zaznaczenie.
  • ESC oznacza „Usuń zaznaczenie, więc następne naciśnięcie klawisza nie zastępuje całego pliku :-)

Przynajmniej w terminalu Ubuntu (Gnome) standardowa kopia również działa ( CTRLSHIFTCchociaż nie wydaje się, aby istniał standardowy skrót klawiaturowy dla select all(inny niż ALTEpo nim A).


6
Ale jeśli nie używasz mswin.vim, ctrl-a zwiększa następny numer w bieżącym wierszu.
Mark Rushakoff,

@ Mark, to zachowanie pochodzi ze standardowej instalacji Vima, więc zakładam, że jest to ustawienie domyślne. Wszystkie zakłady są wyłączone, jeśli środowisko jest skonfigurowane inaczej, ale gdyby tak było, podejrzewam, że OP wiedziałby, co robią :-) W obu przypadkach OP stwierdził w komentarzu, że jest na Ubuntu, więc część systemu Windows moja odpowiedź prawdopodobnie nie ma zastosowania. Terminal Gnome miałby.
paxdiablo

5

możesz nacisnąć gg, aby zlokalizować swój curser na początku pliku, a następnie nacisnąć yG, aby skopiować całą zawartość od początku do końca (zlokalizowane G) do bufora. powodzenia!


4

Wypróbowałem kilka poleceń wspomnianych powyżej przez ludzi. Żaden nie działał. Potem zdobyłem najprostszy z nich wszystkich.

Krok 1: vi <filename>
Krok 2: Kliknij prawym przyciskiem myszy pasek tytułu okna Kit
Krok 3: Wybierz „Wyczyść przewijanie” (aby uniknąć kopiowania pozostałej sesji SSH)
Krok 4: Ponownie kliknij prawym przyciskiem myszy i wybierz „Kopiuj wszystko do schowka”.


1
W przypadku pliku linii 15000 to nie wszystko. Musiałem zwiększyć mój Kit Window > Settings > lines of scrollbackdo 40000 (dostępny również poprzez kliknięcie paska tytułu prawym przyciskiem myszy). Pomaga także używać catzamiast vi, ponieważ przewija on cały tekst.
Noumenon,

1
Skończyło się na tym, że zawsze traciłem w ten sposób linie od góry i dołu pliku. Teraz robię to cat, a następnie kliknięcie środkowym przyciskiem na początku i na końcu pliku, aby rozszerzyć wybór.
Noumenon,

Kiedy spróbowałem, dostałem tylko 111 linii na ekranie, ale w moim pliku jest 174 linii, więc odpowiedź kota Noumenona zadziałała dla mnie
seizethecarp

3

:%y aWciąga całą zawartość do bufora vima. Naciśnięcie pw trybie poleceń spowoduje wklejenie zszarpanej zawartości po linii, w której aktualnie znajduje się kursor.


3

gVim:

:set go=a

ggVG

Zobacz :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.

3

Cóż, wszystkie te podejścia są interesujące, jednak jako leniwy programista używam szarpnięcia całej linii, używając kombinacji liczby + y

na przykład masz plik kodu źródłowego zawierający łącznie 78 wierszy, możesz wykonać następujące czynności:

  1. gg aby uzyskać kursor w pierwszej linii
  2. wstaw 78 + y -> szarpnie 78 linii poniżej kursora i bieżącej linii

2

Nie było koncepcji „schowka” w vi Billa Joy'a, więc nie sądzę, że istnieje wbudowany sposób, aby to zrobić.

Automatyczna funkcja kopiowania wyróżnionego do schowka schowka gVim jest najłatwiejsza lub użyj zewnętrznego programu poprzez:!

Do vima Cygwina używam

:%!putclip
u

Może Ubuntu ma aplikację CLI taką jak putclip?


świetna sugestia, dzięki! istnieje taki program o nazwie xclip. dla szczegółów, opublikowałem osobną odpowiedź (byłoby zbyt mylące, aby czytać z komentarza, bez dodatkowych znaków nowej linii i formatowania kodu).
Gulasz

2

Jeśli domyślnie masz palce CTRL-A CTRL-C, wypróbuj mapowania z $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

Mam je zmapowane na <Leader><C-a>i <Leader><C-c>.


2

Kopiuj cały plik w vimie lub jego zakładkach

y G 

następnie przejdź do karty i wklej

p

i wyciąć cały plik

d G

2

Dodałem następujący wiersz do mojego .vimrc

nnoremap <F5> :%y+<CR>

To pozwala mi skopiować cały tekst z Vima do schowka, naciskając F5(w trybie poleceń).


1

Oto polecenie mapy, aby zaznaczyć wszystko do schowka za pomocą CTRL+ a:

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

Dodaj go do swojego .vimrc i możesz iść ...


1

Wiem, że dziesięć lat w tej sprawie powinno zostać uregulowanych, ale dwie pierwsze odpowiedzi nie zadziałały dla mnie, więc kopałem dalej. Na Redhat (zdalny serwer) - Windows 10 (komputer lokalny), jeśli nie możesz zaznaczyć całej rzeczy myszką, utkniesz, ponieważ zwykłe kopie nie działają między schowkami komputera zdalnego i lokalnego.

Tak więc, aby skopiować na zdalnym systemie Linux i wkleić na lokalnym systemie Windows, określ bufor główny za pomocą * i wykonaj ładne podwójne szarpnięcie

Zastosowanie gg" * yy.


0

Stworzyłem funkcję do wykonania tej akcji, umieść ją na swoim ~/.vimrc.

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

OBS: Jeśli używasz neovim, potrzebujesz również jakiegoś menedżera schowka, takiego jak xclip. Aby uzyskać więcej informacji, wpisz neovim:h checkhealth

Ważne jest również, aby wspomnieć, że nie zawsze jest proste ybędzie skopiować do schowka, tak aby każdy kanał kopiowania +którym jest „Schowek Rejestracja” spróbować zestawu: :set clipboard=unnamed,unnamedplus. Aby uzyskać więcej informacji, zobacz::h unnamed .

Tutaj więcej informacji na temat vim wiki.


-1

Kliknij lewy przycisk myszy, przeciągnij przez sekcję, którą chcesz skopiować i zwolnić. Kod jest automatycznie kopiowany do schowka.


3
Plik może być ogromny, a przeciąganie całego tekstu myszką nie jest produktywne (ani nie jest visposobem).
Dr Beco

1
Właściwie to dobra odpowiedź i dla mnie działa. W moim systemie środowisko jest v restrykcyjne. Muszę przesłać dane wyjściowe na ekranie, a następnie użyć myszy do przeciągania, wybierania i zwalniania .. następnie kopiuję do Notatnika Windows ++ .. i działa świetnie. Nic innego nie działa.
Apurva Singh,

-1

Nie mogłem skopiować plików przy użyciu powyższych odpowiedzi, ale mam kit i znalazłem obejście Quora.

  1. Zmień ustawienia sesji PuTTY, przejdź do logowania i zmień na „znaki do wydruku”. Ustaw plik dziennika
  2. Zrób kota odpowiedniego pliku
  3. Przejdź do pliku ustawionego w kroku # 1, a będziesz mieć zawartość w pliku dziennika.

Uwaga: kopiuje wszystkie drukowane znaki z tej sesji do pliku dziennika, więc w końcu będzie duże. W takim przypadku usuń plik dziennika i cat plik docelowy, aby zawartość tego pliku została skopiowana na komputer.

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.