Sao chép và dán nội dung từ tệp này sang tệp khác trong vi


256

Tôi đang làm việc với hai tệp và tôi cần sao chép một vài dòng từ một tệp và dán vào một tệp khác. Tôi biết cách sao chép (yy) và dán (p) trong cùng một tệp. Nhưng điều đó không làm việc cho các tập tin khác nhau. Làm thế nào được thực hiện?

Ngoài ra, có cách nào để cắt-dán? Tôi đã thử googling, nhưng hầu hết các tài nguyên chỉ nói về sao chép-dán.


Bạn có chắc chắn rằng điều này không hoạt động? Tôi sử dụng điều này khá thường xuyên để sao chép các dòng giữa các tập tin.
sjngm

Vâng, khi tôi đang làm điều đó, tôi chỉ nhận được một dấu ngoặc kép?
macha

4
Lệnh dd hoạt động như cắt.
Martin Stålberg

Câu trả lời:


218

Vì bạn đã biết cách cắt / yank văn bản, đây là một vài ý tưởng để dán lại vào một tệp khác:

  • Chỉnh sửa tập tin đầu tiên, kéo dài văn bản bạn muốn. Sau đó mở tệp thứ hai của bạn từ bên trong vi ( :e /path/to/other/file) và dán nó
  • Mở cả hai tệp cùng nhau trong một cửa sổ chia và điều hướng giữa chúng bằng Ctrl+ w, Up/ Downhoặc bằng cách:

    • vi -o /path/to/file1 /path/to/file2
    • Từ trong tệp đầu tiên, Ctrl+ w,s

Tôi có hai cửa sổ putty mở, tôi đang thực hiện "v cho chế độ trực quan trước rồi sau đó chọn tất cả các dòng và thực hiện" y "để kéo dài, không phải tôi đang làm tab alt + để vào tệp khác và khi tôi làm một "p" để đặt, nó chỉ in một dấu ngoặc kép.
macha

10
Nếu bạn đang làm việc với 2 cửa sổ putty, bạn phải sử dụng cách sao chép / dán putty / windows. Điều đó thật dễ dàng. Đánh dấu nội dung bạn muốn sao chép bằng chuột (bạn không phải làm gì khác, văn bản được đánh dấu đó hiện được sao chép vào bảng tạm.) Chuyển sang cửa sổ putty khác của bạn. Nhập chế độ chèn trong vim (nhấn i). Nhấn nút chuột phải - chuột phải trong cửa sổ putty sẽ dán bất cứ thứ gì vào bảng tạm.
số

3
Những gì bạn đang làm sẽ không hoạt động: Yanking in vi sẽ không đặt văn bản vào khay nhớ tạm của Windows của bạn và bộ đệm yank không được chia sẻ giữa các phiên bản vim mở.
Adam Batkin

1
Tôi không hiểu điểm cuối cùng phải làm là gì: * Từ trong tệp đầu tiên, Ctrl+ w, s.
Svassr

1
Đối với tôi, nó tách cửa sổ nhưng mở cùng một tệp. Làm thế nào để bạn chọn tập tin để mở sau đó? Tôi đã thấy lệnh :sp myfilephân tách theo chiều ngang và mở tệp được chỉ định, nhưng tôi sẽ làm thế nào nếu tôi muốn chia cửa sổ theo chiều dọc?
Svassr

50

Nếu bạn đang sử dụng Vim trên Windows, bạn có thể truy cập vào bảng tạm (sao chép / dán MS) bằng cách sử dụng:

"*dd - cắt một dòng (hoặc 3dd để cắt ba dòng)

"*yy - sao chép một dòng (hoặc 3yy để sao chép ba dòng)

"*p - dán (các) dòng trên dòng sau con trỏ

"*P - dán (các) dòng trên dòng trước con trỏ

Việc cho phép bạn dán giữa các cửa sổ Vim riêng biệt hoặc giữa các ứng dụng Vim và PC ( Notepad , Microsoft Word , v.v.).


17
Sử dụng +như thanh ghi clipboard hệ thống đa nền tảng (Windows và Linux) so với *, chỉ dành cho Windows ( +hoạt động giống như trong Windows *).
Stephen Swensen

42

Sử dụng các biến thể của dthích ddđể cắt.

Để viết một loạt các dòng vào một tệp khác, bạn có thể sử dụng:

:<n>,<m> w filename

Trường hợp <n><m>là số (hoặc ký hiệu) chỉ định một loạt các dòng.

Để sử dụng clipboard của máy tính để bàn, hãy xem các +glệnh.


Để thực hiện việc này bằng dấu, hãy tạo hai dấu (ví dụ a và b) xung quanh văn bản bạn muốn ghi vào tệp: di chuyển đến dòng đầu tiên ma, di chuyển đến dòng cuối cùng , mb. Sau đó, gửi trước một 'chữ cái của nhãn hiệu khi bạn đang sử dụng lệnh trên::'a,'b w filename
EchoLynx

giải pháp tuyệt vời cho phạm vi rộng!
Yasin Okumuş

29

Bạn có thể mở các tập tin khác và gõ :r file_to_be_copied_from. Hoặc bạn có thể đệm. Hoặc đi đến tệp đầu tiên, đi vào dòng bạn muốn sao chép, nhập "qY, đi đến tệp bạn muốn dán và nhập "qP.

"đệm_name, sao chép vào bộ đệm. Ylà yank và Pđược đặt. Mong rằng sẽ giúp!


Cảm ơn! Điều này đã giúp tôi tấn
Atsushi Yamamoto

28

Đây là một cách để làm điều đó;

  • Bắt đầu Vim và mở tệp1 là tệp bạn đang làm việc.
  • :e file2 sẽ hiển thị file2, tệp bạn muốn sao chép các dòng từ đó.
  • xác định vị trí các dòng bạn muốn sao chép. Nếu đó là ba dòng, bạn nhấn3yy
  • :b1 cái này sẽ chuyển sang bộ đệm 1, trong đó file1 là
  • Tìm ra nơi bạn muốn chèn các dòng bạn đã kéo và nhấn p

Bạn có thể có cả hai tập tin có thể xem được. Chia màn hình với ví dụ Ctrl+ w s.

Đối với cắt, dcắt và đặt các công cụ cắt trong bộ đệm yank. ddsẽ "cắt" một dòng.


2
ngoài chủ đề: làm thế nào để tôi có được những thứ giống như bàn phím?
eckes


Thế còn hai tệp trên hai máy chủ ssh khác nhau, mà cùng một máy khách sẽ vào hai thiết bị đầu cuối khác nhau trong Linux / MacOS thì sao? Ý tôi là, không có putty để sử dụng và hai tệp không thể được mở trong cùng một phiên vi trong một thiết bị đầu cuối.
Qiang Xu

1
Nếu máy khách có thể ssh vào hai máy chủ, nó cũng có thể sử dụng scp hoặc sftp cho hai máy chủ đó. Vì vậy, cách nhanh nhất là chỉ sao chép tệp từ máy chủ này sang máy chủ khác để chúng cư trú trên cùng một máy chủ, chỉnh sửa các tệp đó như được mô tả và sao chép tệp trở lại máy chủ khác khi bạn cần.
số

16

Đây là tất cả các đề xuất tuyệt vời, nhưng nếu bạn biết vị trí của văn bản trong một tệp khác sử dụng sed một cách dễ dàng. :r! sed -n '1,10 p' < input_file.txtĐiều này sẽ chèn 10 dòng trong một tệp đã mở ở vị trí hiện tại của con trỏ.


Thật kỳ lạ, tôi đã nhận được mã thoát là 1 khi không may chạy trên os x, không biết tại sao.
jayunit100

1
Cảm ơn đề nghị này! Tôi đã sử dụng đầu thay vì sed vì tôi muốn 2 dòng đầu tiên::r ! head -n2 file.py
Federico Ponzi

7

Trong khi chỉnh sửa tệp, hãy đánh dấu nơi bạn muốn bắt đầu và kết thúc sử dụng

ma- đặt adấu

mb- đặt bdấu

Sau đó, để sao chép nó vào một tệp khác, chỉ cần sử dụng wlệnh:

:'a,'bw /name/of/output/file.txt

7

Cập nhật 2017-05:

Tôi chỉ thấy rằng nếu bạn thêm dòng sau vào tệp vimrc của bạn,

đặt clipboard = không tên

sau đó Vim đang sử dụng clipboard hệ thống.


Tôi chỉ tìm thấy cách yank sẽ không hoạt động trên cách tôi sao chép nội dung giữa các cửa sổ Vim khác nhau. (Ít nhất, nó không hoạt động dựa trên kiến ​​thức Vim của tôi. Tôi không biết liệu có cách nào khác để cho phép nó hoạt động không).

Cách yank chỉ hoạt động trên cách mở nhiều tệp trong cùng một cửa sổ theo thử nghiệm của tôi.

Nếu bạn muốn làm điều đó, tốt hơn bạn nên sử dụng cách cắt-sao-quá khứ của OS, chẳng hạn như Ctrl+ x, Ctrl+ c(trong Windows).


5

Những bản remaps hoạt động như một cơ duyên đối với tôi:

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

Vì vậy, khi tôi ở chế độ trực quan, tôi chọn các dòng tôi muốn và nhấn Ctrl+ cvà sau đó Ctrl+v để chèn văn bản vào tệp nhận. Bạn cũng có thể sử dụng "* y, nhưng tôi nghĩ điều này đôi khi rất khó nhớ.

Điều này cũng hữu ích để sao chép văn bản từ Vim vào clipboard.

Nguồn: Sao chép và dán giữa các phiên bằng tệp tạm thời


4

Sao chép văn bản giữa hai bộ đệm (== tệp) được mở trong cùng phiên bản của Vim không có vấn đề gì:

Chỉ cần kéo một bộ đệm với y(giả sử bạn đã đánh dấu vùng cần sao chép ở chế độ trực quan trước đó), sau đó dán vào bộ đệm khác bằngp . Nó cũng hoạt động với các tab khác nhau miễn là chúng ở cùng một ví dụ của Vim.

Cách mở hai tệp trong cùng một phiên bản của Vim tùy thuộc vào hệ thống của bạn:

  • Trên Win32, có một tùy chọn trong menu ngữ cảnh cho biết Chỉnh sửa bằng một vim nếu bạn chọn hai hoặc nhiều tệp
  • Khi bạn ở trên bàn điều khiển, bạn có thể đạt được nó với vim file1 file2
  • Nếu bạn sử dụng Vim làm trình chỉnh sửa cho một công cụ khác, hãy đảm bảo chỉ định --remote-silenttùy chọn để đảm bảo rằng tất cả các tệp đang được mở trong cùng một ví dụ

Nếu bạn đã mở hai tệp trong hai phiên bản khác nhau của Vim, thì bạn phải đi với bảng tạm hệ thống: trong trường hợp Vim đầu tiên, hãy kéo văn bản vào bảng tạm hệ thống bằng cách sử dụng "+y(một lần nữa, đánh dấu khu vực được kéo mạnh trong chế độ trực quan trước ), sau đó chuyển đến Vim thứ hai và dán bảng tạm vào đó:"+p .


: tên tệp tabedit có thể được sử dụng để mở tệp đích và sau đó chỉ cần p để dán các dòng của bạn. Tôi nghĩ rằng nó là nhanh hơn.
jabalv

4

Mục tiêu : lưu một phần của một tệp vào một tệp khác.

Giải pháp :

  1. Chọn văn bản bạn muốn lưu:
    • Định vị con trỏ nơi bạn muốn bắt đầu lựa chọn
    • Nhấn vđể chọn ký tự HOẶC chữ hoa Vđể chọn toàn bộ dòng
    • Di chuyển con trỏ đến cuối những gì bạn muốn chọn
  2. Lưu văn bản đã chọn vào tập tin mới. Nhập :wSpacevà tên của tệp mới. Trên thực tế bạn sẽ thấy

    :'<,'>w new.txt

    Sau đó nhấn Enter


Làm thế nào để dán lại từ tập tin tạm thời.?
Vine

3

Kịch bản của tôi là tôi cần sao chép n số dòng ở giữa, n không xác định, từ tệp 1 sang tệp 2.

:'a,'bw /name/of/output/file.txt

2
  1. Đảm bảo rằng bạn có phiên bản Vim được biên dịch với hỗ trợ clipboard
    • :echo has('clipboard') nên trở về 1
    • nếu nó trả về 0(ví dụ Mac OS X, ít nhất là v10.11 (El Capitan), v10.9 (Mavericks) và v10.8 (Mountain Lion) - đi kèm với phiên bản Vim thiếu hỗ trợ clipboard), bạn phải cài đặt Phiên bản Vim có hỗ trợ clipboard, nói qua brew install vim(đừng quên khởi chạy lại (các) thiết bị đầu cuối của bạn sau khi cài đặt)
  2. Nhập chế độ trực quan ( V- multiline, v- plain, hoặcCtrlv - block-visual)
  3. Chọn dòng bạn muốn sao chép
  4. "*y - để sao chép đã chọn
  5. "*p - để dán sao chép

Tái bút

  • bạn có thể thay thế các bước 2-5 bằng các hướng dẫn từ câu trả lời của JayG , nếu bạn cần sao chép và dán một dòng
  • để dễ dàng chọn các dòng, bạn có thể thêm set mouse+=avào .vimrc- nó sẽ cho phép bạn chọn các dòng trong Vim bằng chuột, trong khi không chọn các phần tử không liên quan (như số dòng, v.v.) THÔNG BÁO: nó sẽ chặn khả năng sao chép văn bản được chọn bằng chuột vào bảng tạm hệ thống từ Vim .

1

Ví dụ: fileA và fileB - bắt đầu trong fileA ở dòng 25, sao chép 50 dòng và dán vào 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

Tùy chọn dưới đây hoạt động hầu hết thời gian và cũng để dán sau này.

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

Các dòng được kéo dài sẽ được lưu trữ trong bộ đệm 'x'. Nó có thể được sử dụng bất cứ nơi nào trong chỉnh sửa.

Để dán (các) dòng trong tệp khác,

:e filename&location

Ví dụ: Nhập lệnh dưới đây trong chỉnh sửa hiện tại

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

Hoàn thành hoạt động

mở tệp 1:

vi Test1.sh

a10yy

-Yanked 10 lines

-Biết mở tệp thứ hai từ bản chỉnh sửa hiện tại

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

-di chuyển con trỏ đến dòng mà bạn phải dán

*"ap*

--Lines từ bộ đệm '*a*'sẽ được sao chép sau khi con trỏ hiện tại


1

Nếu bạn muốn sao chép một phần của tệp và dán nội dung đó vào giữa tệp khác, bạn có thể thực hiện theo cách này.

:linenumber,linenumber write newfile

Thí dụ:

:2,34 write temp1

Hoặc là

:'mark, 'mark write newfile

Thí dụ:

:'a,'b write temp1

Bây giờ các dòng được sao chép vào một tập tin khác. Nếu bạn muốn xóa những dòng đó sau khi sao chép, bạn có thể làm

:linenumber1,linenumber2 d

Hoặc là

:'mark1,'mark2 d

Bây giờ, đi đến tập tin khác. Sau đó giữ con trỏ trên dòng mà bạn muốn dán.

Kiểu

:r!cat temp1

Bây giờ, nội dung của tệp tạm thời được dán ở đây. Bạn có thể xóa tệp tạm thời khỏi chính dòng lệnh, sau khi dán nội dung.

:!rm temp1

Điều này sẽ giúp nếu bạn muốn sao chép và dán nhiều lần.


0

Một cách khác có thể là mở hai tệp trong hai bộ đệm tách và sử dụng "đoạn trích" sau đây sau khi lựa chọn trực quan các dòng quan tâm.

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p

0

Vào chế độ lệnh và chạy

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

Ví dụ: trích xuất các dòng 20-30từ filenamevào tệp hiện đang mở

:r! sed -n '20, 30p' filename
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.