Kopiuj i wklej zawartość z jednego pliku do drugiego w vi

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

Czy Jest jakiś sposób na wklejanie? Próbowałem googling, ale większość zasobów mówić tylko o kopiuj-wklej.

Author: Peter Mortensen, 2011-01-06

18 answers

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

  • Edytuj pierwszy plik, wybierając żądany tekst. Następnie otwórz drugi plik z Vi (:e /path/to/other/file) i wklej go
  • Otwórz oba pliki razem w podzielonym oknie i przejdź między nimi za pomocą Ctrl + w, do góry/W Dół {[10] } albo przez:

    • vi -o /path/to/file1 /path/to/file2
    • z pierwszego pliku, Ctrl + w , s
 234
Author: Adam Batkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-06 22:34:13

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

"*dd -- cut A line (or 3dd to cut three lines)

"*yy -- copy a line (or 3yy to copy three lines)

"*p -- wklej linię(y) on line za kursorem

"*P -- wklej linię(y) on line przed kursorem

The lets you wklejanie między oddzielnymi oknami Vima lub między aplikacjami Vima i PC (Notatnik, Microsoft Word , itp.).

 54
Author: JayG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-01 18:09:48

Użyj wariacji d Jak dd do cięcia.

Aby zapisać zakres linii do innego pliku, możesz użyć:

:<n>,<m> w filename

Gdzie <n> i <m> są liczbami (lub symbolami) wyznaczającymi zakres linii.

Aby korzystać ze schowka na pulpicie, zapoznaj się z poleceniami +g.

 47
Author: Apalala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-06 22:35:46

Możesz otworzyć drugi plik i wpisać :r file_to_be_copied_from. Albo możesz się buforować. Lub przejdź do pierwszego pliku, przejdź do linii, którą chcesz skopiować, wpisz "qY, Przejdź do pliku, który chcesz wkleić i wpisz "qP.

"buffer_name, kopiuje do bufora. Y jest yank i P jest umieścić. Mam nadzieję, że to pomoże!

 32
Author: Win Man,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-13 22:44:13

Jest na to jeden sposób;

  • Uruchom Vima i otwórz plik1, który jest plikiem, nad którym pracujesz.
  • :e file2, który wyświetli plik file2, z którego chcesz skopiować linie.
  • zlokalizuj linie, które chcesz skopiować. Jeśli są trzy linie, trafisz 3yy
  • :b1 spowoduje to Przełączenie do bufora 1, Gdzie file1 to
  • dowiedz się, gdzie chcesz wstawić linie, które Szarpałeś, i naciśnij p

Można też mieć oba pliki do przeglądania. Podziel ekran za pomocą np. Ctrl + w s .

Jeśli chodzi o cięcie, D tnie i umieszcza cięte rzeczy w buforze yank. dd "wytnie" linię.

 28
Author: nos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-15 20:12:22

Są to świetne sugestie, ale jeśli znasz lokalizację tekstu w innym pliku, użyj sed z łatwością. {[0] } spowoduje wstawienie 10 linii do już otwartego pliku w bieżącej pozycji kursora.

 16
Author: malik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-10 06:46:56

2017-05 aktualizacja:

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

Set clipboard=unnamed

Wtedy Vim korzysta ze schowka systemowego.


Właśnie znalazłem sposób yank nie będzie działać na drodze, gdzie kopiować zawartość między różnymi oknami instancji Vim. (Przynajmniej nie działa w oparciu o moją wiedzę o Vimie. Nie wiem, czy jest inny sposób, aby umożliwić jej działanie).

The yank way działa tylko na drodze, gdzie wiele plików jest otwieranych w tym samym oknie zgodnie z moim testem.

Jeśli chcesz to zrobić, lepiej Użyj OS cut-copy-past sposób, taki jak Ctrl + x, Ctrl + c (pod Windows).

 9
Author: Lichader,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-15 20:21:35

Podczas edycji pliku zaznacz miejsce, w którym ma być używany początek i koniec

ma - ustawia znak a

mb - ustawia znak b

Następnie, aby skopiować to do innego pliku, wystarczy użyć polecenia w:

:'a,'bw /name/of/output/file.txt
 7
Author: vman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 12:54:46

Te remapy działają jak urok dla mnie:

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

Więc, gdy jestem w trybie wizualnym, zaznaczam linie, które chcę i naciskam Ctrl + c a następnie Ctrl + v aby wstawić tekst do pliku odbiorczego. Możesz użyć " * y, jak również, ale myślę, że to jest trudne do zapamiętania czasami.

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

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

 7
Author: rovitulli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-15 23:09:13

Cel: zapisanie fragmentu jednego pliku do innego.

Rozwiązanie :

  1. Wybierz tekst, który chcesz zapisać:
    • Umieść kursor w miejscu, w którym chcesz rozpocząć zaznaczanie
    • Naciśnij v, aby wybrać znaki lub wielkie litery V, aby wybrać całe linie
    • przesuń kursor na koniec tego, co chcesz wybrać
  2. Zapisz wybrany tekst do nowego pliku. Typ :wSpacja i nazwa nowego pliku. Faktycznie zobaczysz

    :'<,'>w new.txt

    Następnie naciśnij Enter

 6
Author: Lu55,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-15 20:26:19

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

Wystarczy wkleić do jednego bufora y (zakładając, że wcześniej zaznaczono obszar do kopiowania w trybie wizualnym), a następnie wkleić do drugiego bufora 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:

  • na Win32 jest opcja w menu kontekstowe Edytuj 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 innego narzędzia, pamiętaj, aby określić opcję --remote-silent, aby upewnić się, że wszystkie pliki są otwierane w tej samej instancji

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

 5
Author: eckes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-15 20:17:14

Moim scenariuszem było skopiowanie n liczby linii w środku, N nieznanych, z pliku 1 do pliku 2.

:'a,'bw /name/of/output/file.txt
 3
Author: Shyam S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-22 10:55:39
  1. upewnij się, że masz skompilowaną wersję Vima z obsługą schowka
    • :echo has('clipboard') should return 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ć wersję Vima z obsługą schowka, powiedzmy przez brew install vim (nie zapomnij ponownie uruchomić terminala po instalacja)
  2. Enter a visual mode (V - multiline, v - plain, or Ctrlv - block-visual)
  3. Select line(s) you want to copy
  4. "*y - aby skopiować zaznaczone
  5. "*p - do wklejenia skopiowane

P. S:

  • możesz zastąpić kroki 2-5 instrukcjami z odpowiedzi przez JayG, jeśli potrzebujesz Kopiuj i wklej pojedynczy wiersz
  • aby ułatwić zaznaczanie linii, możesz dodać set mouse+=a do swojego .vimrc - pozwoli Ci to na zaznaczanie linii w Vimie za pomocą myszki, Nie zaznaczając elementów zewnętrznych (np. numerów linii itp.) Uwaga: zablokuje możliwość kopiowania zaznaczonego myszką tekstu do schowka systemowego z Vim .
 3
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-16 02:42:23

Przykład: fileA i fileB-zacznij w filea w linii 25, skopiuj 50 linii i wklej do fileB

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
 1
Author: Brenda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-20 00:16:20

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

Linie zostaną zapisane w buforze 'x'. Można go używać w dowolnym miejscu edycji.

Aby wkleić wiersz (y) w innym 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

Pełna operacja

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*

-move the kursor do linii, w której należy wkleić

*"ap*

-- linie z bufora '*a*' będą kopiowane po bieżącym pos kursora

 1
Author: Raams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-11 07:05:24

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

: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 wykonać

:linenumber1,linenumber2 d

Lub

:'mark1,'mark2 d

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

Typ

:r!cat temp1

Teraz zawartość plik tymczasowy jest wklejony tutaj. Możesz usunąć plik tymczasowy z samego wiersza poleceń po wklejeniu zawartości.

:!rm temp1

To by pomogło, gdybyś chciał skopiować i wkleić kilka razy.

 1
Author: SibiCoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-06 16:13:26

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
 0
Author: Thorsten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-04 12:35:13

Wejdź w tryb poleceń i uruchom

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

Np. aby wyodrębnić linie 20-30 z filename do aktualnie otwartego pliku

:r! sed -n '20, 30p' filename
 0
Author: Anthony Awuley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-18 21:10:42