Skopiuj i wklej zawartość z jednego pliku do innego w vi

256

Pracuję z dwoma plikami i muszę skopiować kilka wierszy z jednego pliku i wkleić do innego pliku. Wiem, jak skopiować (yy) i wkleić (p) w tym samym pliku. Ale to nie działa dla różnych plików. Jak to się robi?

Czy jest też sposób na wycięcie i wklejenie? Próbowałem google, ale większość zasobów mówi tylko o kopiowaniu i wklejaniu.

macha
źródło
Jesteś pewien, że to nie działa? Używam tego dość często, aby kopiować linie między plikami.
sjngm
Kiedy to robię, dostaję tylko cudzysłów?
macha
4
Polecenie dd działa jak cut.
Martin Stålberg,

Odpowiedzi:

218

Ponieważ wiesz już, jak wycinać / szarpać tekst, oto kilka pomysłów na wklejenie go z powrotem do innego pliku:

  • Edytuj pierwszy plik, przeciągając żądany tekst. Następnie otwórz drugi plik z poziomu vi ( :e /path/to/other/file) i wklej go
  • Otwórz oba pliki razem w podzielonym oknie i nawiguj między nimi za pomocą Ctrl+ w, Up/ Downalbo:

    • vi -o /path/to/file1 /path/to/file2
    • W pierwszym pliku Ctrl+ w,s
Adam Batkin
źródło
Mam otwarte dwa okna szpachli, najpierw robię „v dla trybu wizualnego, a następnie zaznaczam wszystkie linie i robię„ y ”dla szarpania, nie robię klawisza Alt + Tab, aby dostać się do drugiego pliku i kiedy to robię „p” dla put, drukuje tylko znak cudzysłowu.
macha
10
Jeśli pracujesz z 2 kitami, musisz użyć metody kopiowania / wklejania putty / windows. To łatwe. Za pomocą myszy zaznacz rzeczy, które chcesz skopiować (nie musisz nic więcej robić, zaznaczony tekst jest teraz kopiowany do schowka). Przejdź do drugiego okna szpachli. Wejdź do trybu wstawiania w vimie (hit i). Naciśnij prawy przycisk myszy - prawa mysz w oknie szpachli wklei wszystko, co znajduje się w schowku.
nos
3
To, co robisz, nie zadziała: szarpanie w vi nie umieści tekstu w schowku Windows, a bufor szarpnięć nie jest współdzielony między otwartymi instancjami vima.
Adam Batkin
1
Nie rozumiem, co ostatni punkt ma robić: * Od wewnątrz pierwszego pliku, Ctrl+ w, s.
svassr
1
dla mnie podzielił okno, ale otworzył dokładnie ten sam plik. Jak wtedy wybrać plik, który chcesz otworzyć? Widziałem polecenie :sp myfiledzielące poziomo i otwierające określony plik, ale jak mam to zrobić, jeśli wolę podzielić okno w pionie?
svassr
50

Jeśli używasz Vima w systemie Windows, możesz uzyskać dostęp do schowka (kopiowanie / wklejanie MS) za pomocą:

"*dd - wytnij linię (lub 3dd, aby wyciąć trzy linie)

"*yy - skopiuj linię (lub 3 lata, aby skopiować trzy linie)

"*p - wklej linię (linie) po linii za kursorem

"*P - wklej wiersze przed wierszem

Pozwala wklejać między osobnymi oknami Vima lub między aplikacjami Vima i PC ( Notatnik , Microsoft Word itp.).

JayG
źródło
17
Użyj +jako rejestr schowka systemowego na wielu platformach (Windows i Linux) vs. *, który jest tylko Windows ( +działa tak samo w Windows jak *).
Stephen Swensen
42

Użyj odmian dlubię ddciąć.

Aby zapisać zakres wierszy w innym pliku, możesz użyć:

:<n>,<m> w filename

Gdzie <n>i <m>są liczbami (lub symbolami), które oznaczają zakres linii.

Aby korzystać ze schowka na pulpicie, spójrz na +gpolecenia.

Apalala
źródło
Aby to zrobić ze znaków, należy utworzyć dwa znaki (A i B, na przykład) wokół tekstu, który chcesz zapisać do pliku: Przejdź do pierwszej linii, maprzejdź do ostatniej linii mb. Następnie dodaj 'literę do litery znaku, gdy używasz powyższego polecenia::'a,'b w filename
EchoLynx
świetne rozwiązanie dla szerokiej gamy produktów!
Yasin Okumuş
29

Możesz otworzyć inny plik i wpisać :r file_to_be_copied_from. Lub możesz buforować. Lub przejdź do pierwszego pliku, przejdź do wiersza, który chcesz skopiować, wpisz "qY, przejdź do pliku, który chcesz wkleić i wpisać "qP.

"nazwa_buforu, kopiuje do bufora. Yjest szarpany i Pjest wprowadzany. Mam nadzieję, że to pomaga!

Win Man
źródło
Dzięki! To pomogło mi wiele ton
Atsushi Yamamoto,
28

Oto jeden ze sposobów, aby to zrobić;

  • Uruchom Vima i otwórz plik 1, który jest plikiem, nad którym pracujesz.
  • :e plik2, który wywoła plik2, plik, z którego chcesz skopiować linie.
  • zlokalizuj linie, które chcesz skopiować. Jeśli to trzy linie, trafiłeś3yy
  • :b1 spowoduje to przełączenie na bufor 1, gdzie znajduje się plik1
  • wymyśl, gdzie chcesz wstawić linie, które szarpałeś i naciśnij p

Oba pliki mogą być również widoczne. Podziel ekran za pomocą np . Ctrl+ w s.

Jeśli chodzi o cięcie, dwycina i umieszcza wycięte elementy w buforze szarpania. dd„wytnie” linię.

nr
źródło
2
poza tematem: jak uzyskać te rzeczy przypominające przyciski klawiatury?
eckes
Co z tymi dwoma plikami znajdują się na dwóch różnych serwerach ssh, do których ten sam klient ssh'uje w dwóch różnych terminalach w systemie Linux / MacOS? Chodzi mi o to, że nie można użyć żadnego zestawu, a tych dwóch plików nie można otworzyć w tej samej sesji vi w jednym terminalu.
Qiang Xu,
1
Jeśli klient może ssh na dwóch serwerach, może również użyć scp lub sftp na tych dwóch serwerach. Najszybszym sposobem jest więc skopiowanie pliku z jednego serwera na drugi, aby znajdowały się one na tym samym serwerze, edycja tych plików zgodnie z opisem i skopiowanie pliku z powrotem na drugi serwer, jeśli zajdzie taka potrzeba.
nos
16

Są to świetne sugestie, ale jeśli znasz lokalizację tekstu w innym pliku, skorzystaj z sed z łatwością. :r! sed -n '1,10 p' < input_file.txtSpowoduje to wstawienie 10 linii do już otwartego pliku w bieżącej pozycji kursora.

malik
źródło
co dziwne, dostałem kod wyjścia 1 gdy uruchomiłem to niestety na OS X, nie wiem dlaczego.
jayunit100,
1
Dzięki za tę sugestię! Użyłem głowy zamiast sed, ponieważ chciałem pierwsze 2 linie::r ! head -n2 file.py
Federico Ponzi
7

Podczas edycji pliku zaznaczaj miejsca, w których chcesz używać początku i końca

ma- wyznacza aznak

mb- wyznacza bznak

Następnie, aby skopiować to do innego pliku, po prostu użyj wpolecenia:

:'a,'bw /name/of/output/file.txt
Vman
źródło
7

Aktualizacja 2017-05:

Właśnie odkryłem, że jeśli dodasz następujący wiersz do pliku vimrc,

ustaw schowek = bez nazwy

wtedy Vim używa schowka systemowego.


Właśnie odkryłem, że sposób yank nie będzie działał w sposób, w jaki kopiuję zawartość między różnymi oknami instancji Vima. (Przynajmniej nie działa w oparciu o moją wiedzę Vima. Nie wiem, czy jest inny sposób, aby to umożliwić).

Sposób yank działa tylko w sposób, w którym wiele plików jest otwieranych w tym samym oknie, zgodnie z moim testem.

Jeśli chcesz to zrobić, lepiej użyj sposobu wycinania i kopiowania w systemie operacyjnym, takiego jak Ctrl+ x, Ctrl+ c(w systemie Windows).

Lichader
źródło
5

Te remapy działają dla mnie jak urok:

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

Tak więc, gdy jestem w trybie wizualnym, wybieram linie, które chcę i naciśnij Ctrl+, ca następnie Ctrl+, vaby wstawić tekst do pliku odbiorcy. Możesz również użyć „* y”, ale myślę, że czasami trudno to zapamiętać.

Jest to również przydatne do kopiowania tekstu z Vima do schowka.

Źródło: Kopiuj i wklej między sesjami przy użyciu pliku tymczasowego

rovitulli
źródło
4

Kopiowanie tekstu między dwoma buforami (== plików), które są otwarte w tej samej instancji Vima, nie stanowi problemu:

Po prostu szarpnij jednym buforem za pomocą y (zakładając, że zaznaczyłeś wcześniej obszar do skopiowania w trybie wizualnym), a następnie wklej do drugiego buforu za pomocą p. Działa również z różnymi kartami, o ile są one w tej samej instancji Vima.

Jak otworzyć dwa pliki w tej samej instancji Vima, zależy od twojego systemu:

  • W systemie Win32 w menu kontekstowym jest dostępna opcja Edytuj z jednym vimem jeśli wybierzesz dwa lub więcej plików
  • Gdy jesteś na konsoli, możesz to osiągnąć za pomocą vim file1 file2
  • Jeśli używasz Vima jako edytora dla innego narzędzia, pamiętaj o określeniu --remote-silentopcji, aby upewnić się, że wszystkie pliki są otwierane w tym samym wystąpieniu

Jeśli otworzyłeś dwa pliki w dwóch różnych instancjach Vima, musisz przejść do schowka systemowego: w pierwszej instancji Vim przeciągnij tekst do schowka systemowego za pomocą "+y(ponownie zaznacz obszar, który ma być szarpany w trybie wizualnym przed ), a następnie przejść do drugiego Vima i wklej schowka tam: "+p.

eckes
źródło
: nazwa pliku tabedit może być użyta do otwarcia pliku docelowego, a następnie po prostu p do wklejenia linii. Myślę, że to jest szybsze.
jabalv
4

Cel : zapisać fragment jednego pliku w innym pliku.

Rozwiązanie :

  1. Wybierz tekst, który chcesz zapisać:
    • Ustaw kursor w miejscu, w którym chcesz rozpocząć wybór
    • Naciśnij, vaby wybrać znaki LUB wielkie litery, Vaby zaznaczyć całe linie
    • Przesuń kursor na koniec tego, co chcesz wybrać
  2. Zapisz zaznaczony tekst w nowym pliku. Wpisz :wSpacei nazwę nowego pliku. Właściwie to zobaczysz

    :'<,'>w new.txt

    Następnie wciśnij Enter

Lu55
źródło
Jak wkleić z powrotem z pliku tymczasowego.?
Vineet
3

Mój scenariusz był taki, że muszę skopiować n liczby wierszy na środku, n nieznanych, z pliku 1 do pliku 2.

:'a,'bw /name/of/output/file.txt
Shyam S.
źródło
2
  1. Upewnij się, że masz wersję Vima skompilowaną z obsługą schowka
    • :echo has('clipboard') powinien wrócić 1
    • jeśli zwróci 0(na przykład Mac OS X, co najmniej v10.11 (El Capitan), v10.9 (Mavericks) i v10.8 (Mountain Lion) - zawiera wersję Vima bez obsługi schowka), musisz zainstalować Wersja Vima z obsługą schowka, powiedzmy przez brew install vim(nie zapomnij ponownie uruchomić terminali po instalacji)
  2. Wejdź w tryb wizualny ( V- wielowierszowy, v- zwykły lub Ctrlv- blokowy)
  3. Wybierz linie, które chcesz skopiować
  4. "*y - aby skopiować wybrane
  5. "*p - aby wkleić skopiowane

PS:

  • można zastąpić kroki 2-5 z instrukcjami odpowiedzi przez JayG , jeśli trzeba skopiować i wkleić pojedynczą linię
  • aby ułatwić wybieranie linii, możesz dodać set mouse+=ado swojego .vimrc- pozwoli ci wybierać linie w Vimie za pomocą myszy, nie zaznaczając obcych elementów (takich jak numery linii itp.) UWAGA: zablokuje możliwość kopiowania tekstu zaznaczonego myszką do schowka systemowego od Vima .
Peter Mortensen
źródło
1

Przykład: plik A i plik B - uruchom plik A w wierszu 25, skopiuj 50 wierszy i wklej do pliku B.

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
Brenda
źródło
1

Poniższa opcja działa przez większość czasu, a także do wklejania później.

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

Wyszarpane linie zostaną zapisane w buforze 'x'. Można go użyć w dowolnym miejscu w edycji.

Aby wkleić linie w drugim pliku,

:e filename&location

Przykład: Wpisz poniższe polecenie w bieżącej edycji

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

Zakończ operację

otwórz plik 1:

vi Test1.sh

a10yy

-Yanked 10 lines

-teraz otwórz drugi plik z bieżącej edycji

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

-przesuń kursor do linii, w której musisz wkleić

*"ap*

- Linie z bufora '*a*'zostaną skopiowane po bieżącej pozycji kursora

Raams
źródło
1

Jeśli chcesz skopiować część pliku i wkleić tę zawartość w środku innego pliku, możesz to zrobić.

:linenumber,linenumber write newfile

Przykład:

:2,34 write temp1

Lub

:'mark, 'mark write newfile

Przykład:

:'a,'b write temp1

Teraz linie są kopiowane do innego pliku. Jeśli chcesz usunąć te linie po skopiowaniu, możesz to zrobić

:linenumber1,linenumber2 d

Lub

:'mark1,'mark2 d

Teraz przejdź do innego pliku. Następnie trzymaj kursor na linii, w której chcesz wkleić.

Rodzaj

:r!cat temp1

Teraz wkleja się tutaj zawartość pliku tymczasowego. Możesz usunąć plik tymczasowy z samego wiersza poleceń po wklejeniu zawartości.

:!rm temp1

Pomoże to, jeśli chcesz skopiować i wkleić kilka razy.

SibiCoder
źródło
0

Innym sposobem może być otwarcie dwóch plików w dwóch podzielonych buforach i użycie następującego „fragmentu” po wizualnym zaznaczeniu interesujących linii.

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p
Thorsten
źródło
0

Wejdź do trybu poleceń i uruchom

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

Np. Aby wyodrębnić linie 20-30z filenameaktualnie otwartego pliku

:r! sed -n '20, 30p' filename
Anthony Awuley
źródło