Làm cách nào tôi có thể sao chép văn bản vào bảng tạm hệ thống từ Vim?


282

Có cách nào để sao chép một khối văn bản vào bảng tạm hệ thống, để tôi có thể dán nó vào một chương trình khác không?


12
Điều này đã được hỏi và trả lời trên SO. Bạn có thể tìm thấy nhiều thông tin khác nhau ở đó.
bsmith89

1
Tôi đã sử dụng plugin này trên macvim christoomey / vim-system-copy và thực sự thích nó. Nó hoạt động thực sự tốt với chuyển động cpip, cpi{.
Filype

2
Những gì bạn thực sự cần là EasyClip . Nó sẽ làm điều đó và còn hơn thế nữa ...
Scott Wade

Câu trả lời:


321

Đối với các hệ thống dựa trên X11 (ví dụ: Linux và hầu hết các hệ thống tương tự UNIX khác ), có hai bảng ghi độc lập với nhau:

  • CHÍNH XÁC - Đây là bản sao khi chọn và có thể được dán bằng nút chuột giữa.
  • CLIPBOARD - Điều này được sao chép bằng (thường) ^Cvà được dán bằng ^V(Nó giống như MS Windows).

Hệ thống OS XWindows chỉ có một bảng tạm.

Đối với các hệ thống X11, cũng có một số công cụ đồng bộ hóa các bảng ghi này cho bạn; Vì vậy, nếu chúng có vẻ giống nhau, bạn có thể có một trong số chúng đang chạy.

Vim có hai thanh ghi đặc biệt tương ứng với các clipboards này:

  • *sử dụng CHÍNH HÃNG; ghi nhớ: S tar là S đắc cử (đối với copy-on- s đắc cử)
  • +sử dụng CLIPBOARD; ghi nhớ: CTRL PLUS C (đối với tổ hợp phím chung)

Trên Windows & OS X, không có sự khác biệt giữa +*, vì các hệ thống này chỉ có một bảng tạm và cả hai thanh ghi đều đề cập đến cùng một thứ (không quan trọng bạn sử dụng cái nào).

Bạn có thể sử dụng các thanh ghi như bất kỳ đăng ký. Ví dụ: sử dụng bảng tạm PRIMARY *với các lệnh yp:

  • "*yy
  • "*p

Bạn có thể sử dụng điều này như các phím bấm tiện lợi hơn:

noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p

Nếu bạn muốn "tự động" giao diện với bảng tạm của hệ thống thay vì tham khảo thủ công mọi lúc, bạn có thể đặt clipboardbiến:

  • Đặt nó để unnamedsử dụng *(CHÍNH, khi chọn)
  • Đặt nó để unnamedplussử dụng +(CLIPBOARD, ^C)

Bây giờ, chỉ cần sử dụng yysẽ vào bảng tạm của hệ thống, thay vì đăng ký không tên của Vim và psẽ dán bảng tạm của hệ thống.

Bạn cũng có thể gán cho các thanh ghi này giống như bất kỳ thanh ghi nào với let:

  • :let @+=42
  • :let @*=42

Các clipboardthiết lập có một số tùy chọn hơn (chẳng hạn như loại trừ các bộ lọc); nhưng đây là những điều cơ bản Xem :help 'clipboard'cho toàn bộ câu chuyện ;-)

gVim

Nếu bạn sử dụng gVim, bạn có thể có hành vi sao chép khi chọn khi sử dụng :set guioptions+=a.
Điều này được bật theo mặc định trên các hệ thống X11 (bản sao thành PRIMARY), nhưng không phải trên MS Windows & OSX (vì chọn bất kỳ văn bản nào sẽ ghi đè lên bảng tạm của bạn).

Không +clipboard?

Vim yêu cầu +clipboardcờ tính năng cho bất kỳ thứ nào trong số này hoạt động; bạn có thể kiểm tra xem Vim của bạn có điều này hay không bằng cách sử dụng :echo has('clipboard')từ bên trong Vim (nếu đầu ra là 0, nó không có mặt, nếu là 1nó), hoặc kiểm tra đầu ra của vim --versionfor +clipboard.

Hầu hết các bản phân phối Linux đều có bản dựng Vim "tối thiểu" theo mặc định, không có +clipboard, nhưng bạn thường có thể cài đặt nó:

  • Debian & Ubuntu: Cài đặt vim-gtkhoặc vim-gnome.
  • Fedora: cài đặt vim-X11và chạy vimxthay vì vim( thông tin thêm ).
  • Arch Linux: cài đặt gvim(điều này cũng sẽ cho phép +clipboardbình thường vim).

Bạn cũng có thể sử dụng xclip, xcopyhoặc xselđể sao chép văn bản vào bảng tạm; xem các câu hỏi sau để có giải pháp:

SSH

Bạn cũng có thể sử dụng bảng tạm trên các máy từ xa nếu bạn bật chuyển tiếp X11 qua SSH. Điều này đặc biệt hữu ích với mẹo trên vì bạn có thể sử dụng xclipđể truy cập vào bảng tạm của máy tính để bàn. Vim trên máy bạn vẫn sẽ cần +clipboardtính năng này.

Điều này yêu cầu ForwardX11Trustedcài đặt và chỉ nên được thực hiện với các máy chủ đáng tin cậy , vì điều này mang lại cho máy chủ quyền kiểm soát gần như hoàn toàn đối với phiên X11 của bạn:

$ ssh -XY myhost

Để duy trì các cài đặt này liên tục (vì vậy bạn không cần phải thêm -XYmỗi lần), bạn có thể làm một cái gì đó như thế này trong ~/.ssh/config:

# Do **NOT** set this globally; it gives the server complete control over
# your X11 session.
Host myhost
    ForwardX11 yes
    ForwardX11Trusted yes

Neovim

Neovim tân trang lại hỗ trợ clipboard. Việc xây dựng trong giao diện đã được gỡ bỏ và thay thế bằng một hệ thống gọi một tiện ích bên ngoài như xclip, xselhoặc pbcopy/ pbpaste.

Nó sẽ tự động nhận các tiện ích này và sử dụng chúng. Trên OS X pbcopypbpastephải có sẵn theo mặc định, trên Linux bạn có thể muốn cài đặt xclip, vì đó là phiên bản có sẵn rộng rãi nhất (thực tế có hai phiên bản xselcờ không tương thích . Điều này thực sự ngu ngốc).

Cũng thấy :help clipboardtrong Neovim.


6
ssh -Y ngụ ý -X vì vậy -X có thể được bỏ qua.
hildred

Đối với một số bàn phím quốc tế, bạn có thể cần nhấn "<Space>để có được ". Vì vậy, trong những trường hợp bạn sẽ phải nhấn "<Space>+yhoặc "<Space>*ysao chép.
Arthur F

1
Một tác dụng phụ rất thú vị của việc học này (một vài năm trước) đối với tôi là việc nhận ra "có thể chọn nhiều thanh ghi có tên. "+không phải là phép thuật, nó chỉ là đăng ký +. Vì vậy, ví dụ, nếu bạn muốn sao chép ba điều cùng một lúc và dán từng người từng người một, bạn có thể "1y, "2y"3yvà sau đó "1p, "2p"3p. Điều này thực sự mạnh mẽ và không tồn tại trong hầu hết các trình soạn thảo khác. Một cách sử dụng thú vị khác là nhìn vào các macro được lưu trữ. Ví dụ: nếu bạn ghi lại qq, nhưng bạn nhận ra rằng bạn cần sửa nó, bạn có thể: trong một dòng tạm thời "qp, sửa nó và "qd.
Shahbaz

1
Chỉ cần một lưu ý: OS X có hai clipboard riêng biệt. Một cái được truy cập bằng Cmd-C và Cmd-V và cái còn lại sử dụng các phím bấm emacs Ctrl-K và Ctrl-Y.
BallpointBen

3
@shahbaz - có lẽ tốt hơn để sử dụng các thanh ghi thư cho mục đích như vậy, vì những cái được đánh số được thay đổi bất cứ khi nào văn bản bị xóa.
evilsoup

18

Các câu trả lời khác bao gồm cách sao chép văn bản từ bộ đệm của bạn vào bảng tạm hệ thống. Một hoạt động phổ biến khác là sao chép văn bản từ một thanh ghi khác vào clipboard. Ví dụ: nếu bạn đã kéo một số văn bản vào "(thanh ghi mặc định), bạn có thể muốn tải thanh ghi đó vào bảng tạm.

Bạn có thể làm điều này với :let:

  • let @+=@" - sao chép thanh ghi mặc định vào clipboard
  • let @*=@" - sao chép thanh ghi mặc định vào lựa chọn chính X11 ("bảng tạm chuột")
  • let @+=@a- sao chép từ đăng ký avào clipboard
  • Vân vân.

Lưu ý rằng điều này hoạt động cho các thanh ghi nói chung: let @a=@bbản sao đăng ký bđể đăng ký a.


17

Từ http://vim.wikia.com/wiki/Accessing_the_system_clipboard

set clipboard=unnamedplus

Điều này thay đổi thanh ghi Vim mặc định thành +thanh ghi, được liên kết với bảng tạm hệ thống. Từ :h clipboard-unnamedplus:

                                        clipboard-unnamedplus
unnamedplus     A variant of the "unnamed" flag which uses the
                clipboard register '+' (quoteplus) instead of
                register '*' for all yank, delete, change and put
                operations which would normally go to the unnamed
                register.  When "unnamed" is also included to the
                option, yank operations (but not delete, change or
                put) will additionally copy the text into register
                '*'.
                Only available with the +X11 feature.
                Availability can be checked with: 
                        if has('unnamedplus')

Tại sao điều này không hoạt động với tôi khi yank & dán giữa các phiên bản vim (mỗi trường hợp trong một thiết bị đầu cuối terminator riêng biệt)?
thinwybk

Nếu bạn đang dùng Linux và Vim đã được biên dịch với tính năng + X11 và bạn có bộ clipboard = unnamedplus, thì bạn có thể lấy một dòng trong một phiên bản của vim và dán nó vào một ví dụ khác của vim. Bạn cũng có thể dán nó vào bất kỳ ứng dụng nào khác bằng CTRL + V hoặc SHIFT + INSERT. Bạn có thể sử dụng :versiontrong Vim để xem + X11 có xuất hiện trong danh sách các tính năng được bao gồm không. Bạn cũng có thể kiểm tra xem tính năng 'unnamedplus' có khả dụng với :if has('unnamedplus')⏎ echo 'yes'⏎ endif Nếu bạn không có trên Linux thì bạn nên sử dụng chưa đặt tên thay vì không tên.
Quincy Bowers

10

Trên các bản dựng hỗ trợ nó, thanh ghi có tên *là bảng tạm hệ thống. Để sao chép văn bản từ Vim vào bảng tạm hệ thống, bạn có thể chọn văn bản bằng chế độ trực quan, sau đó nhấn "*yđể sao chép nó vào bảng tạm hệ thống.

Ngược lại, sử dụng "*pđể dán văn bản từ bảng tạm hệ thống vào Vim.


5

Tôi khuyên bạn nên sử dụng Gvim và thêm phần này vào .vimrc:

source $VIMRUNTIME/mswin.vim
behave mswin

Điều này cho phép hỗ trợ cho CtrlC, CtrlX, CtrlVnhư notepad trong Windows.

Lưu ý rằng điều này cũng sẽ thêm một số phím tắt phổ biến khác của Windows, như CtrlScho :w, CtrlAđể chọn tất cả, v.v.


0

Nếu vim của bạn không hỗ trợ, +clipboardbạn có thể sử dụng plugin fakeclip cho Linux, Mac, Windows, tmux, màn hình, ...


0

Mỗi câu trả lời khác đã bao gồm tất cả những điều quan trọng về các thanh ghi. Tôi muốn thêm một điều nữa mà tôi sử dụng.

Có một cách trong Vim để sao chép trực tiếp văn bản được chọn trực quan vào bảng tạm. Chỉ cần đặt nó trong tập tin vimrc của bạn :

set guioptions+=a

Và, với điều này bất cứ khi nào bạn trực quan chọn một số văn bản, nó sẽ được sao chép vào clipboard của bạn. Để biết thêm thông tin về điều này,:help guioptions

BTW, điều này chỉ dành cho gVim.


2
guioptions+=acũng được đề cập trong câu trả lời của Carpetsmoker.
muru

@muru Vâng, xin lỗi. Tôi đã không nhìn thấy điều đó trước đây. Tôi vừa thấy nó.
Durga Swaroop

0

Bạn cũng có thể sử dụng lệnh toàn cục để đặt một số mẫu cụ thể vào bảng tạm. Nó có thể hữu ích trong các tình huống mà bạn có thông tin nằm rải rác trong một tệp và việc đối phó thủ công dễ bị lỗi và mệt mỏi.

Đầu tiên làm sạch sổ đăng ký sẽ nhận được thông tin

:let @a=""

Sau đó sao chép tất cả các dòng chứa mẫu cho nó

:g/pattern/yank A

Cuối cùng tranfereing (sao chép) thông tin vào bảng tạm hệ thống

:let @+=@a

nếu bạn cố sao chép trực tiếp mọi dòng chứa "mẫu" vào bảng tạm thì nó sẽ không hoạt động vì bảng tạm không có khả năng nối thêm nội dung mới, do đó chúng tôi đang sử dụng ở đây một thanh ghi vim bình thường để lưu trữ tất cả các dòng có chứa mô hình cùng một lúc và sau đó đặt nó vào clipboard.

OBS: Cần phải ghi lại đăng ký trước khi sử dụng và việc sử dụng phiên bản UPPERCASE của đăng ký cho phép chúng tôi chắp thêm nội dung, nếu không nó cũng không hoạt động.


0

Nếu bạn không thể tìm ra cách để +clipboardlàm việc, mà tôi không thể vì một số lý do, thì bạn có thể làm điều này.

Giả sử bạn chỉ muốn sao chép một phần của tệp, tôi thực hiện shift+ vđể chuyển sang chế độ trực quan và chỉ làm nổi bật các dòng tôi muốn sao chép. Sau đó, tôi làm điều này.

# Linux Wayland
:'<,'>w !wl-copy

# Linux Xorg
:'<,'>w !xclip -selection clipboard

Giải trình

  • '<,'> - có nghĩa là bạn đã sử dụng chế độ trực quan để chọn một phạm vi (bạn không gõ này)
  • w !{cmd}- viết phạm vi cho stdin của cmd, xem thêm tại:help w_c
  • wl-copyxcliplà các chương trình mà bạn có thể dẫn văn bản đến và họ sẽ thêm nó vào bảng tạm hệ thống của bạn

Ngoài ra, một khi điều này là trong lịch sử của bạn, bạn không phải gõ lại toàn bộ. Chỉ cần chọn với chế độ trực quan, gõ wrồi nhấn lên và lệnh sẽ tự động hoàn tất. Ngoài ra, bạn cũng không phải sử dụng chế độ trực quan. Bạn có thể đặt bất kỳ phạm vi nào bạn muố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.