Sao chép tất cả các dòng vào clipboard


564

Có cách nào để sao chép tất cả các dòng từ tệp đang mở sang clipboard trong trình chỉnh sửa VI. Tôi đã thử yGnhưng nó không sử dụng clipboard để lưu trữ những dòng đó.

Vì vậy, nó có thể?



1
Nếu bạn đang dùng Windows và yank không hoạt động, hãy xem câu trả lời thứ 17 từ đầu: stackoverflow.com/questions/1620018/
trộm

Câu trả lời:


636

Bạn nên kéo văn bản đến *hoặc + đăng ký :

gg"*yG

Giải trình:

  • gg để đưa con trỏ đến ký tự đầu tiên của tệp
  • "*yđể bắt đầu một lệnh yank đến thanh ghi *từ dòng đầu tiên, cho đến khi ...
  • G đi đến cuối tập tin

6
Làm thế nào để bạn đánh dấu văn bản để nó trông giống như các phím? Tôi chưa thấy điều đó trên SO.
Jergason

10
Xin chào ... nó không hoạt động? Dữ liệu clipboard vẫn không thay đổi. Khi tôi gõ gg, con trỏ sẽ chuyển đến dòng đầu tiên ... nhưng khi tôi gõ "* yG ..cpu tiếng bíp ở * .. nó có bình thường hay có vấn đề gì với vim của tôi không? Tôi đang ở trên Ubuntu ..
Xinus

1
Bạn đã bật Deadkeys chưa? (ví dụ: khi bạn nhấn 'a bạn nhận được á) Nếu vậy, bạn cần nhấn phím cách sau ".
Tordek

144
Vim chỉ có thể truy cập vào bảng tạm hệ thống nếu nó được biên dịch với xterm_clipboard được bật. Để tìm hiểu xem bạn có tính năng này hay không, hãy chạy :versiontrong vim và tìm +xterm_clipboardcờ. Nếu nó đi trước một dấu trừ, thì bạn sẽ không có chức năng này. Nếu đây là trường hợp, bạn có thể muốn tự biên dịch vim hoặc chạy gvim thường bật tính năng này.
nelstrom

9
Vấn đề với cách tiếp cận này là nó di chuyển con trỏ và cuộn cửa sổ xung quanh. Hai lần. Các câu trả lời khác có tổ hợp phím rất ít hạn chế :)
sehe

696

Sử dụng:

:%y+

để kéo tất cả các dòng.

Giải trình:

  • % để tham khảo lệnh tiếp theo để làm việc trên tất cả các dòng
  • y để kéo những dòng đó
  • + để sao chép vào clipboard hệ thống

NB : Trong Windows, +*tương đương xem câu trả lời này .


19
Thêm vào đó, nó sẽ không thay đổi vị trí con trỏ.
nperson325681

1
@guangnan: Những thanh ghi này không tồn tại trong vi; chỉ trong vim. Hãy thử gõ :helpđể đảm bảo bạn thực sự trong vim.
Trình biên dịch dễ thấy

6
Tôi cần set clipboard=unnamed, nhưng sau đó điều này làm việc tuyệt vời!
cdunn2001

235
Vim nói E850: Invalid register name:(
lony

23
Giải pháp này chỉ hoạt động nếu vim được biên dịch với tùy chọn clipboard (vim --version sẽ hiển thị + clipboard trong trường hợp đó). Nếu không, giải pháp của Brian (:% w! Pbcopy) là một giải pháp cho Mac. Các lựa chọn thay thế có sẵn cho các hệ điều hành khác (ví dụ xclip).
yaccob

90

trên máy Mac

  • sao chép phần đã chọn: chọn trực quan văn bản (loại vhoặc Vở chế độ bình thường) và loại:w !pbcopy

  • sao chép toàn bộ tập tin :%w !pbcopy

  • quá khứ từ clipboard :r !pbpaste


6
Hoạt động trơn tru. Một lời giải thích về các lệnh sẽ thực sự tốt đẹp.
Vlad Manuel Mureșan

5
@Geo pbcopylà một tiện ích Mac. Trên Linux, xselcó thể hoạt động thay thế hoặc cliptrên Windows.
David Lord

1
Điều này sẽ không hoạt động nếu tệp dài hơn chiều cao của thiết bị đầu cuối của bạn.
Sridhar Sarnobat

1
@SridharSarnobat :%w !pbcopyvẫn hoạt động nếu tệp dài hơn chiều cao của thiết bị đầu cuối.
Adrian Schmidt

Ôi xin lỗi, ý tôi là ssh trong đó máy khách là máy Mac và máy chủ là Linux (mà tôi giả sử là thứ mà OP đang tìm kiếm nhưng bây giờ tôi nghĩ về nó, đó là một vấn đề không liên quan). Để bảo vệ, tôi sẽ tránh vim để sao chép và dán các tệp cục bộ, nhưng đó là sở thích cá nhân của tôi. Lời khuyên tốt.
Sridhar Sarnobat

56

Bảng tạm là bộ đệm +. Để sao chép vào clipboard, làm "+yvà [chuyển động].

Vì vậy, gg"+yGsẽ sao chép toàn bộ tập tin.

Tương tự, để dán từ clipboard, "+p


4
Chỉ cần thêm vào điều này (4 năm sau ...), điều này có một nhược điểm nhỏ là vị trí con trỏ của bạn sẽ nhảy lên trên cùng của tệp. Để tránh điều này (ví dụ: nếu bạn đang ánh xạ nó tới một số phím tắt trong vimrc của mình), bạn có thể làm một cái gì đó như: mqgg "+ yG`q
Tom Lord

45

Một cách dễ dàng khác để sao chép toàn bộ tệp nếu bạn gặp sự cố khi sử dụng VI, chỉ bằng cách nhập "tên tệp mèo". Nó sẽ lặp lại tập tin vào màn hình và sau đó bạn có thể chỉ cần cuộn lên xuống và sao chép / dán.


1
E603 :: bắt mà không cần: thử
Paul Chris Jones

2
Và nếu bạn muốn làm điều đó mà không rời vim, bạn có thể chạy lệnh sau : :!cat %. Và để sao chép nội dung của tệp theo chương trình vào bảng tạm trên Mac OS::!cat % | pbcopy
TanguyP

Cần sao chép tệp từ Ubuntu VM trên Windows sang Debian trong GCP được mở trong cửa sổ trình duyệt ...: / Biến thể của vim yanking không hoạt động, điều này hoạt động để dán vào Windows sau đó tải tệp lên GCP.
frmbelz

31

Đây là những gì tôi làm để kéo toàn bộ tập tin:

ggVGy

12
Tôi e rằng điều này không trả lời được câu hỏi, vì bạn đang kéo thanh ghi mặc định, không vào bảng tạm.
Trình biên dịch dễ thấy

2
@ConspicuptCompiler nếu anh ta có clipboardbộ sao chép văn bản được kéo vào +.
TankorSmash

@TankorSmash không phải là phương pháp nhanh nhất (:% y) cũng không gọn gàng nhất (ít nhất là ggyG là tốt hơn).
pedroapero

@ConspicuptCompiler sự khác biệt giữa thanh ghi mặc địnhclipboard là gì?
nilon

16

Bạn có thể sử dụng lệnh "cat" để mở tệp và sử dụng chuột để sao chép


5
Nhưng đó không phải là cách "vi", nếu tệp rất lớn thì đó cũng là một vấn đề ... Điều này có thể hoạt động nhưng không phải là cách được đề xuất ...
Aditya

1
resetthiết bị đầu cuối trước, sau đó chọn tất cả và sao chép. Điều này hoạt động thông qua sshphiên.
arcol

Cách nhanh nhất cho các tệp lớn (dưới 10 nghìn dòng) trong các máy chủ từ xa khác nhau nếu xterm_clipboard không khả dụng
Matias Haeussler

10

(để trả lời @rshdev và để tránh phải biên dịch lại vim với + xterm_clipboard mỗi @nelstrom trong các nhận xét về OP)

có một chương trình gọi là xclip hoạt động như putclip trên Ubuntu 11:

:%!xclip -sel clip
u

Nó không được cài đặt theo mặc định. để cài đặt, sử dụng:

sudo apt-get install xclip

10

Trên Ubuntu 12

bạn có thể thử cài đặt vim-gnomegói:

sudo apt-get install vim-gnome

Tôi đã thử nó, vì vim --versionđã nói với tôi rằng nó sẽ tắt cờ xterm_clipboard (được biểu thị bằng - ), cần thiết để sử dụng chức năng clipboard.

-> cài đặt gói vim-gnome trên Ubuntu 12 cũng đã cài đặt phiên bản vim dựa trên bảng điều khiển, có bật tùy chọn này (được biểu thị bằng dấu + trước cờ xterm_clipboard)

Trên Arch Linux

bạn có thể cài đặt vim-clipboard cho cùng một lý do.

Nếu bạn chạy neovim thì bạn nên cài đặt xclip(như được giải thích bởi help clipboard-tool)


1
unix.stackexchange.com/questions/25965/ Có còn lựa chọn nào khác không?
Sandip Pingle

6

Nếu bạn đang sử dụng Vim ở chế độ trực quan, các phím cắt và dán tiêu chuẩn cũng được áp dụng, ít nhất là với Windows.

  • CTRLA có nghĩa là "Đánh dấu toàn bộ tập tin.
  • CTRLC có nghĩa là "Sao chép lựa chọn.
  • ESC có nghĩa là "Bỏ chọn, vì vậy lần nhấn phím tiếp theo của bạn sẽ không thay thế toàn bộ tệp :-)

Trong thiết bị đầu cuối Ubuntu (Gnome) ít nhất, bản sao tiêu chuẩn cũng hoạt động ( CTRLSHIFTCmặc dù dường như không có phím tắt tiêu chuẩn nào cho select all(ngoài ALTEsau đó A).


6
Nhưng nếu bạn không sử dụng mswin.vim, thì ctrl-a sẽ tăng số tiếp theo trên dòng hiện tại.
Mark Rushakoff

@Mark, hành vi này là từ bản cài đặt Vim tiêu chuẩn nên tôi cho rằng đó là mặc định. Tất cả các cược đều tắt nếu môi trường được cấu hình khác nhau, mặc dù nếu đó là trường hợp, tôi nghi ngờ OP sẽ biết họ đang làm gì :-) Trong cả hai trường hợp, OP đã nêu trong một nhận xét rằng họ đã ở trên Ubuntu nên là một phần của Windows câu trả lời của tôi có lẽ không áp dụng. Các thiết bị đầu cuối Gnome sẽ.
paxdiablo

5

bạn có thể nhấn gg để xác định vị trí con trỏ của bạn vào đầu tệp, sau đó nhấn yG để sao chép tất cả nội dung từ đầu đến cuối (nằm ở vị trí G) để đệm.


4

Tôi đã thử một vài lệnh mà mọi người đã đề cập ở trên. Không có làm việc. Sau đó, tôi đã nắm giữ đơn giản nhất của tất cả chúng.

Bước 1: vi <filename>
Bước 2: Nhấp chuột phải vào thanh tiêu đề của cửa sổ Putty
Bước 3: Chọn "Xóa cuộn lại" (để tránh sao chép phần còn lại của phiên SSH)
Bước 4: Nhấp chuột phải lần nữa và chọn "Sao chép tất cả vào khay nhớ tạm".


1
Đối với tập tin dòng 15000, điều này đã không lấy tất cả. Tôi cần tăng Putty của tôi Window > Settings > lines of scrollbacklên 40000 (cũng có sẵn bằng cách nhấp chuột phải vào thanh tiêu đề). Nó cũng giúp sử dụng catthay vì vi vì nó cuộn qua tất cả các văn bản.
Noumenon

1
Tôi đã kết thúc luôn luôn mất dòng từ đầu và cuối của tập tin theo cách này. Những gì tôi làm bây giờ là cat, sau đó nhấp chuột vào giữa và bắt đầu tập tin để mở rộng lựa chọn.
Noumenon

Khi tôi thử điều này, tôi chỉ nhận được 111 dòng trên màn hình nhưng có 174 dòng trong tệp của mình, vì vậy câu trả lời con mèo của Noumenon đã làm việc cho tôi
seizethecarp

3

:%y aĐặt tất cả nội dung vào bộ đệm của vim, Nhấn ptrong chế độ lệnh sẽ dán nội dung được kéo theo sau dòng mà con trỏ của bạn hiện đang đứng.


3

gVim:

:set go=a

ggVG

Xem :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

Chà, tất cả các cách tiếp cận này đều thú vị, tuy nhiên vì lập trình viên lười biếng tôi sử dụng tất cả các dòng bằng cách sử dụng kết hợp số + y

ví dụ: bạn có tệp mã nguồn với tổng số 78 dòng, bạn có thể làm như dưới đây:

  1. gg để lấy con trỏ ở dòng đầu tiên
  2. chèn 78 + y -> nó đặt 78 dòng bên dưới con trỏ và dòng hiện tại của bạn

2

Không có khái niệm "clipboard" trong vi của Bill Joy nên tôi không nghĩ có một cách tích hợp để làm điều đó.

Tính năng sao chép tự động mọi thứ được tô sáng vào bảng tạm của gVim là dễ nhất hoặc sử dụng chương trình bên ngoài qua :!

Đối với vim của Cygwin tôi sử dụng

:%!putclip
u

Có lẽ Ubuntu có ứng dụng CLI như putclip ??


đề nghị tuyệt vời, cảm ơn! có một chương trình như vậy, được gọi là xclip. để biết chi tiết, tôi đã đăng một câu trả lời riêng biệt (sẽ rất khó hiểu khi đọc từ một bình luận, mà không có thêm dòng mới và định dạng mã).
Hầm

2

Nếu ngón tay của bạn mặc định CTRL-A CTRL-C, sau đó thử ánh xạ từ $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

Tôi có chúng ánh xạ tới <Leader><C-a><Leader><C-c>.


2

Đừng sao chép toàn bộ tập tin bên trong vim hoặc các tab của nó

y G 

sau đó di chuyển đến một tab và dán bằng

p

và để cắt toàn bộ tập tin sử dụng

d G

2

Tôi đã thêm dòng sau vào .vimrc của tôi

nnoremap <F5> :%y+<CR>

Điều này cho phép tôi sao chép tất cả văn bản trong Vim vào bảng tạm bằng cách nhấn F5(trong chế độ lệnh).


1

Đây là một lệnh bản đồ để chọn tất cả vào bảng tạm bằng CTRL+ a:

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

Thêm nó vào .vimrc của bạn và bạn tốt để đi ...


1

Tôi biết mười năm về việc này nên được giải quyết nhưng hai câu trả lời đầu tiên không hiệu quả với tôi nên tôi tiếp tục đào. Trên Redhat (máy chủ từ xa) - Windows 10 (máy cục bộ), nếu bạn không thể chọn toàn bộ bằng chuột, bạn sẽ bị kẹt vì các bản sao thông thường không hoạt động giữa bảng điều khiển từ xa và máy cục bộ.

Vì vậy, để sao chép trên Linux từ xa và dán vào Windows cục bộ, hãy chỉ định bộ đệm chính với *và thực hiện một cú đúp đẹp

Sử dụng gg" * yy.


0

Tôi đã tạo ra một chức năng để thực hiện hành động này, đặt nó trên của bạn ~/.vimrc.

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

OBS: Nếu bạn đang sử dụng neovim, bạn cũng cần một số trình quản lý clipboard như xclip. để biết thêm thông tin loại trong neovim:h checkhealth

Một điều cũng quan trọng cần đề cập là không phải lúc nào đơn giản ycũng sẽ sao chép vào bảng tạm, để làm cho mọi nguồn cấp dữ liệu sao chép +là "Đăng ký Clipboard" hãy thử đặt : :set clipboard=unnamed,unnamedplus. Để biết thông tin mor, xem::h unnamed .

Ở đây thêm thông tin về vim wikia.


0

Bạn có thể sử dụng shortcur, như thế này:

noremap <F6> :%y+<CR>

Điều đó có nghĩa là, khi bạn đẩy F6 ở chế độ Normald, nó sẽ sao chép toàn bộ tệp và thêm nó vào bảng tạm. Hoặc bạn chỉ có thể gõ ở chế độ bình thường :%y+và sau đó đẩy Enter.


-1

Nhấp vào nút chuột trái, kéo qua phần bạn muốn sao chép và phát hành. Mã sẽ tự động được sao chép vào clipboard.


3
Các tập tin có thể rất lớn và kéo toàn bộ văn bản bằng chuột không hiệu quả (cũng không phải là một vicách).
Bác sĩ Beco

1
Trên thực tế đây là một câu trả lời tốt và làm việc cho tôi. Trong hệ thống của tôi, môi trường là v hạn chế. Tôi phải cat đầu ra trên màn hình, sau đó sử dụng chuột để kéo, chọn và phát hành .. sau đó tôi sao chép vào Windows Notepad ++ .. và hoạt động rất tốt. Không có gì khác làm việc.
Apurva Singh

-1

Tôi không thể sao chép các tập tin bằng cách sử dụng các câu trả lời ở trên nhưng tôi đã đặt ra và tôi đã tìm thấy một cách giải quyết trên Quora.

  1. Thay đổi cài đặt của phiên PuTTY của bạn, chuyển đến đăng nhập và thay đổi thành "ký tự có thể in". Đặt tệp nhật ký
  2. Làm một con mèo của tập tin tương ứng
  3. Chuyển đến tệp bạn đã đặt ở bước 1 và bạn sẽ có nội dung của mình trong tệp nhật ký.

Lưu ý: nó sao chép tất cả các ký tự được in của phiên đó vào tệp nhật ký, vì vậy cuối cùng nó sẽ trở nên lớn. Trong trường hợp đó, hãy xóa tệp nhật ký và gửi tệp mục tiêu để bạn có được nội dung của tệp cụ thể đó được sao chép trên máy của bạn.

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.