Vim di WSL: sinkronisasi clipboard sistem? (atur clipboard ^ = tidak disebutkan namanya)?

12

Saat menggunakan WSL / Bash untuk Windows saya ingin dapat menggunakan y yy 3ydan pcara yang sama mereka selalu bekerja di vim, tetapi menghubungkan ke clipboard sistem yang dibagikan oleh semua aplikasi, bukan ke clipboard internal vim ... Saya sudah punya untuk mengelola clipboard sejarah.

Tampaknya Vim sudah memiliki opsi bawaan untuk menyinkronkan copy / paste buffer dengan clipboard sistem ... Namun masalah ketika menjalankan WSL adalah bahwa Anda benar-benar perlu menggunakan /mnt/c/Windows/System32/clip.exeuntuk mengakses clipboard ... Jadi meskipun saya ingin untuk dapat menggunakan:

set clipboard^=unnamed

Tampaknya belum memiliki dukungan WSL.

Saya mengerti neovim memang memiliki ini sebagai pilihan, tetapi saya tidak benar-benar ingin bereksperimen dengan neovim sekarang ...

Untuk saat ini, hal yang paling dekat dengan solusi yang saya temukan adalah:

nnoremap <silent> <leader>y :call system('/mnt/c/Windows/System32/clip.exe', @0)<CR>
vnoremap <silent> <leader>y :call system('/mnt/c/Windows/System32/clip.exe', @0)<CR>

Tapi ini adalah solusi yang benar-benar mengerikan menurut saya ... Itu membuat menyalin proses dua langkah ...

Tentu saja saya dapat melakukan beberapa copy dan paste dengan mouse / shift + in, namun saya pikir pasti ada cara untuk mendapatkan sinkronisasi ini agar berfungsi dengan baik di Vim.

Ryan Erwin
sumber
Rekomendasikan solusi ini superuser.com/a/1439881/711405
ephemerr

Jawaban:

10

Saya sadar ini adalah pertanyaan yang sangat lama tetapi saya baru-baru ini menemukan solusi yang baik. Setelah frustrasi, saya menemukan cara-cara ini untuk mengakses clipboard sistem windows dengan menyalin dan menempel.

Dengan menyalin, dengan versi vim> = 8.0.1394, seperti disebutkan dalam jawaban lain https://vi.stackexchange.com/a/15190

let s:clip = '/mnt/c/Windows/System32/clip.exe' 
if executable(s:clip)
    augroup WSLYank
        autocmd!
        autocmd TextYankPost * call system('echo '.shellescape(join(v:event.regcontents, "\<CR>")).' | '.s:clip)
    augroup END
end

Menempelkan, memetakan ke perintah registri palsu, yaitu "= p atau" + p atau apa pun.

map <silent> "=p :r !powershell.exe -Command Get-Clipboard<CR>
map! <silent> <C-r>= :r !powershell.exe -Command Get-Clipboard<CR>

" I thought this will be better :)
noremap "+p :exe 'norm a'.system('/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Command Get-Clipboard')<CR>

Menyisipkan klik kanan berfungsi, tetapi tidak memuaskan jika Anda tidak ingin menggunakan mouse

tanda tanya
sumber
Di WSL visaya telah menambahkannnoremap <S-Insert> :r !powershell.exe -Command "& {Get-Clipboard}"<Enter>
Walter A
Terima kasih atas jawaban bermanfaatnya! Saya bertanya-tanya apakah mungkin juga menggunakan register palsu untuk perintah yank. Sesuatu seperti noremap "+y :exe 'norm a'.system('echo '.shellescape(join(v:event.regcontents, "\<CR>")).' | clip.exe')<CR>(yang tidak berfungsi ...)
Tropilio
4

Bagaimana dengan ini?

if system('uname -r') =~ "Microsoft"
  augroup Yank
    autocmd!
    autocmd TextYankPost * :call system('clip.exe ',@")
  augroup END
endif

unameadalah perintah terminal Linux yang mengembalikan info OS, sehingga akan kembali Linuxuntuk WSL. Sedangkan dengan -rflag, perintah mengembalikan info rilis OS, sehingga harus menyertakan "Windows".

TextYankPostadalah acara vim (lihat :h TextYankPostdi vim), yang mendeteksi aktivitas penarikan teks Anda.

clip.exeadalah perintah command prompt Windows di WSL (lihat CLIP /?di command prompt) yang menyalin textatau kembali dari commandclipbord melalui text | clip.exeatau command | clip.exe. Di sini clip.exedijalankan dari fungsi vim demi vim system.

aohmusi
sumber
di Neovim satu dapat menggunakan has('wsl')bukan system('uname -r') =~ "Microsoft".
Justin M. Keyes
2

Saya telah membuat PR untuk dukungan WSL ke fakeclip beberapa waktu lalu.

Lihat vimawesome tentang cara menginstalnya; help fakeclipuntuk penggunaan.

laktak
sumber
Masih dipertahankan?
Chris