Bagaimana saya bisa menyalin teks ke clipboard sistem dari Vim?

284

Apakah ada cara untuk menyalin blok teks ke clipboard sistem, jadi saya bisa menempelkannya di program lain?

thameera
sumber
12
Ini sudah ditanyakan dan dijawab pada SO. Anda dapat menemukan informasi yang lebih banyak dan berbeda di sana.
bsmith89
1
Saya telah menggunakan plugin ini di macvim christoomey / vim-system-copy dan sangat menyukainya. Ia bekerja sangat baik dengan gerakan cpip, cpi{.
Filype
2
Yang benar-benar Anda butuhkan adalah EasyClip . Itu akan melakukan hal itu dan banyak lagi ...
Scott Wade

Jawaban:

323

Untuk sistem berbasis X11 (mis. Linux dan sebagian besar sistem mirip UNIX lainnya ) ada dua clipboard yang tidak tergantung satu sama lain:

  • PRIMARY - Ini adalah copy-on-pilih, dan dapat ditempelkan dengan tombol tengah mouse.
  • CLIPBOARD - Ini disalin dengan (biasanya) ^C, dan ditempel dengan ^V(Ini seperti MS Windows).

Sistem OS X dan Windows hanya memiliki satu clipboard.

Untuk sistem X11 ada juga sejumlah alat yang menyinkronkan clipboard ini untuk Anda; jadi jika mereka tampak sama, Anda mungkin memiliki salah satunya berjalan.

Vim memiliki dua register khusus yang sesuai dengan clipboard ini:

  • *menggunakan PRIMARY; mnemonic: S tar adalah S terpilih (untuk copy-on s terpilih)
  • +menggunakan CLIPBOARD; mnemonic: CTRL PLUS C (untuk keybind umum)

Pada Windows & OS X tidak ada perbedaan antara +dan *, karena sistem ini hanya memiliki satu clipboard, dan kedua register merujuk pada hal yang sama (tidak masalah yang mana yang Anda gunakan).

Anda dapat menggunakan register ini sebagai register apa pun. Misalnya, menggunakan clipboard UTAMA *dengan ydan pperintah:

  • "*yy
  • "*p

Anda mungkin bisa menggunakan ini sebagai gantungan kunci yang lebih nyaman:

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

Jika Anda ingin "secara otomatis" berinteraksi dengan clipboard sistem alih-alih merujuk secara manual setiap saat, Anda dapat mengatur clipboardvariabel:

  • Atur unnameduntuk menggunakan *(PRIMARY, saat pilih)
  • Atur unnamedplusuntuk menggunakan +(CLIPBOARD, ^C)

Sekarang, hanya menggunakan yyakan pergi ke clipboard sistem, bukan register Vim yang tidak disebutkan namanya, dan pakan menempelkan clipboard sistem.

Anda juga dapat menetapkan untuk register ini seperti halnya register dengan let:

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

The clipboardPengaturan memiliki beberapa pilihan (seperti mengecualikan filter); tetapi ini adalah dasar-dasarnya. Lihat :help 'clipboard'cerita lengkapnya ;-)

gVim

Jika Anda menggunakan gVim, Anda bisa mendapatkan perilaku copy-on-pilih saat menggunakan :set guioptions+=a.
Ini diaktifkan secara default pada sistem X11 (salinan ke PRIMARY), tetapi tidak pada MS Windows & OSX (karena memilih teks apa pun akan menggantikan papan klip Anda).

Tidak ada +clipboard?

Vim membutuhkan tanda +clipboardfitur agar semua ini berfungsi; Anda dapat memeriksa apakah Vim Anda memiliki ini dengan menggunakan :echo has('clipboard')dari dalam Vim (jika output 0, itu tidak ada, jika itu 1, itu), atau memeriksa output vim --versionuntuk +clipboard.

Sebagian besar distribusi Linux dikirimkan dengan build Vim "minimal" secara default, yang tidak ada +clipboard, tetapi Anda biasanya dapat menginstalnya:

  • Debian & Ubuntu: Instal vim-gtkatau vim-gnome.
  • Fedora: instal vim-X11, dan jalankan vimxalih-alih vim( info lebih lanjut ).
  • Arch Linux: install gvim(ini akan memungkinkan +clipboarduntuk yang normal vimjuga).

Anda juga dapat menggunakan xclip,, xcopyatau xseluntuk menyalin teks ke clipboard; lihat pertanyaan berikut untuk solusi:

SSH

Anda juga dapat menggunakan clipboard pada mesin jarak jauh jika Anda mengaktifkan penerusan X11 melalui SSH. Ini sangat berguna dengan tip di atas karena Anda dapat menggunakannya xclipuntuk mengakses clipboard desktop Anda. Vim pada mesin yang Anda tuju masih membutuhkan +clipboardfitur tersebut.

Ini memerlukan ForwardX11Trustedpengaturan, dan hanya boleh dilakukan dengan server tepercaya , karena ini memberi server kontrol hampir penuh atas sesi X11 Anda:

$ ssh -XY myhost

Untuk membuat pengaturan ini tetap ada (jadi Anda tidak perlu menambahkan -XYsetiap waktu), Anda dapat melakukan sesuatu seperti ini di ~/.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 mengubah dukungan clipboard. Built-in antarmuka telah dihapus dan diganti dengan sistem yang memanggil utilitas eksternal seperti xclip, xselatau pbcopy/ pbpaste.

Seharusnya secara otomatis mengambil utilitas ini dan menggunakannya. Pada OS X pbcopy dan pbpasteharus tersedia secara default, di Linux Anda mungkin ingin menginstal xclip, karena itulah yang paling banyak tersedia (sebenarnya ada dua versi xseldengan flag yang tidak kompatibel . Ini benar-benar bodoh).

Lihat juga :help clipboarddi Neovim.

Martin Tournoij
sumber
6
ssh -Y menyiratkan -X sehingga -X dapat dihilangkan.
Hildred
Untuk beberapa keyboard internasional, Anda mungkin perlu menekan "<Space>untuk mendapatkan ". Jadi dalam hal ini Anda harus menekan "<Space>+yatau "<Space>*ymenyalin.
Arthur F
1
Efek samping yang sangat menarik dari mempelajari ini (beberapa tahun yang lalu) bagi saya adalah kesadaran yang "dapat memilih banyak register bernama. "+bukan sihir, hanya mendaftar +. Jadi misalnya, jika Anda ingin menyalin tiga hal pada saat yang sama dan paste masing-masing satu per satu, Anda bisa "1y, "2ydan "3ydan kemudian "1p, "2pdan "3p. Ini sangat kuat dan tidak ada di hampir semua editor lainnya. Penggunaan lain yang menarik adalah untuk melihat makro yang tersimpan. Misalnya, jika Anda merekam dengan qq, tetapi Anda menyadari bahwa Anda perlu memperbaikinya, Anda dapat: dalam baris temp "qp, memperbaikinya, dan "qd.
Shahbaz
1
Sekedar catatan: OS X memiliki dua clipboard terpisah. Satu diakses menggunakan Cmd-C dan Cmd-V dan yang lainnya menggunakan emacs keybindings Ctrl-K dan Ctrl-Y.
BallpointBen
3
@shahbaz - mungkin lebih baik menggunakan register surat untuk tujuan seperti itu, karena yang bernomor akan berubah setiap kali teks dihapus.
evilsoup
18

Jawaban lainnya mencakup cara menyalin teks dari buffer Anda ke clipboard sistem. Operasi umum lainnya adalah menyalin teks dari register lain ke clipboard. Misalnya, jika Anda sudah menarik beberapa teks ke dalam "(register default), Anda mungkin ingin memuat register itu ke clipboard.

Anda dapat melakukan ini dengan :let:

  • let @+=@" - menyalin register default ke clipboard
  • let @*=@" - menyalin register default ke dalam pemilihan utama X11 ("papan klip mouse")
  • let @+=@a- salin dari daftar ake clipboard
  • dll.

Perhatikan bahwa ini berfungsi untuk register secara umum: let @a=@bsalinan mendaftar buntuk mendaftar a.

wchargin
sumber
17

Dari http://vim.wikia.com/wiki/Accessing_the_system_clipboard

set clipboard=unnamedplus

Ini mengubah register Vim default ke +register, yang ditautkan ke clipboard sistem. Dari :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')
Quincy Bowers
sumber
Mengapa ini tidak berfungsi untuk saya ketika mencabut & rekatkan antara instance vim (masing-masing dalam terminal terminator terpisah)?
thinwybk
Jika Anda menggunakan Linux, dan Vim telah dikompilasi dengan fitur + X11, dan Anda memiliki set clipboard = unnamedplus, maka Anda harus dapat menarik garis dalam satu instance vim dan menempelnya di instance vim lainnya. Anda juga harus dapat menempelkannya ke aplikasi lain dengan CTRL + V atau SHIFT + INSERT. Anda dapat menggunakan :versiondalam Vim untuk melihat apakah + X11 muncul dalam daftar fitur yang disertakan. Anda juga dapat memeriksa apakah fitur 'unnamedplus' tersedia dengan :if has('unnamedplus')⏎ echo 'yes'⏎ endif Jika Anda tidak di Linux maka Anda harus menggunakan unnamedplus daripada unnamedplus.
Quincy Bowers
10

Pada build yang mendukungnya, register bernama *adalah clipboard sistem. Untuk menyalin teks dari Vim ke clipboard sistem, Anda dapat memilih teks menggunakan mode visual, lalu tekan "*yuntuk menyalinnya ke clipboard sistem.

Sebaliknya, gunakan "*puntuk menempelkan teks dari clipboard sistem ke Vim.

200_sukses
sumber
5

Saya sarankan Anda menggunakan Gvim, dan menambahkan ini ke .vimrc:

source $VIMRUNTIME/mswin.vim
behave mswin

Hal ini memungkinkan dukungan untuk CtrlC, CtrlX, CtrlVseperti notepad di Windows.

Perhatikan bahwa ini juga akan menambahkan beberapa cara pintas Windows umum lainnya, seperti CtrlSuntuk :w, CtrlAuntuk pilih semua, dll.

linrongbin
sumber
0

Jika vim Anda tidak mendukung, +clipboardAnda dapat menggunakan plugin fakeclip untuk Linux, Mac, Windows, tmux, layar, ...

laktak
sumber
0

Setiap jawaban lain telah membahas semua hal penting tentang register. Saya ingin menambahkan satu hal lagi yang saya gunakan.

Ada cara di Vim untuk secara langsung menyalin teks yang dipilih secara visual ke clipboard. Masukkan saja ini ke file vimrc Anda :

set guioptions+=a

Dan, dengan ini setiap kali Anda secara visual memilih beberapa teks akan disalin ke clipboard Anda. Untuk informasi lebih lanjut tentang ini,:help guioptions

BTW, ini hanya untuk gVim.

Durga Swaroop
sumber
2
guioptions+=ajuga disebutkan dalam jawaban Carpetsmoker.
muru
@uru Ya, maaf. Saya tidak melihat itu sebelumnya. Saya baru saja melihatnya.
Durga Swaroop
0

Anda juga dapat menggunakan perintah global untuk meletakkan beberapa pola tertentu di clipboard. Ini bisa berguna dalam situasi di mana Anda memiliki informasi yang tersebar di file dan secara manual mengatasi rentan terhadap kesalahan dan melelahkan.

Pertama bersihkan register yang akan menerima informasi

:let @a=""

Kemudian salin semua baris yang berisi pola itu

:g/pattern/yank A

Akhirnya mentransfer (menyalin) informasi ke clipboard sistem

:let @+=@a

jika Anda mencoba menyalin setiap baris yang berisi "pola" langsung ke clipboard, itu tidak akan berfungsi karena clipboard tidak memiliki kemampuan untuk menambahkan konten baru, jadi kami menggunakan di sini register vim normal untuk menyimpan semua baris yang mengandung pola sekaligus dan kemudian meletakkannya di clipboard.

OBS: Kita perlu mengkloning register sebelum menggunakannya, dan penggunaan versi UPPERCASE dari register memungkinkan kita untuk menambahkan konten, jika tidak maka tidak akan berfungsi baik.

SergioAraujo
sumber
0

Jika Anda tidak dapat menemukan cara untuk +clipboardbekerja, yang saya tidak dapat karena suatu alasan, maka Anda dapat melakukan ini.

Dengan asumsi Anda hanya ingin menyalin bagian dari file, saya lakukan shift+ vuntuk masuk ke mode visual dan hanya menyorot garis yang ingin saya salin. Lalu saya melakukan ini.

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

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

Penjelasan

  • '<,'> - berarti Anda menggunakan mode visual untuk memilih rentang (Anda tidak mengetik ini)
  • w !{cmd}- tulis rentang ke stdin cmd, lihat lebih lanjut di:help w_c
  • wl-copydan xclipmerupakan program yang dapat Anda gunakan untuk mengirim teks dan mereka akan menambahkannya ke clipboard sistem Anda

Juga, sekali ini dalam sejarah Anda, Anda tidak perlu mengetik semuanya lagi. Cukup pilih dengan mode visual, ketik wkemudian tekan ke atas dan perintah itu harus melengkapi otomatis. Juga, Anda tidak harus menggunakan mode visual. Anda dapat mengatur rentang apa pun yang Anda inginkan.

425nesp
sumber