Vim trên WSL: đồng bộ hóa hệ thống clipboard? (đặt clipboard ^ = chưa đặt tên)?


12

Trong khi sử dụng WSL / Bash cho Windows, tôi muốn có thể sử dụng y yy 3ypgiống như cách chúng luôn hoạt động trong vim, nhưng kết nối với bảng tạm hệ thống được chia sẻ bởi tất cả các ứng dụng, không phải vào bảng tạm của vim ... Tôi đã có sẵn để quản lý clipboard lịch sử.

Có vẻ như Vim đã có sẵn tùy chọn tích hợp để đồng bộ hóa bộ đệm sao chép / dán với bảng tạm hệ thống ... Tuy nhiên, vấn đề khi chạy WSL là bạn thực sự cần sử dụng /mnt/c/Windows/System32/clip.exeđể truy cập vào bảng tạm ... Vì vậy, mặc dù tôi muốn để có thể sử dụng:

set clipboard^=unnamed

Dường như chưa có hỗ trợ WSL.

Tôi hiểu rằng neovim có tùy chọn này, nhưng tôi không thực sự muốn thử nghiệm với neovim ngay bây giờ ...

Hiện tại, điều gần nhất với cách giải quyết mà tôi đã tìm thấy là:

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>

Nhưng theo tôi đây là một giải pháp thực sự khủng khiếp ... Nó khiến việc sao chép một quá trình gồm hai bước ...

Tất nhiên tôi có thể thực hiện một số bản sao và dán bằng chuột / shift + in, nhưng tôi nghĩ rằng phải có cách để đồng bộ hóa này hoạt động chính xác trong Vim.


Đề xuất giải pháp này superuser.com/a/1439881/711405
ephemerr

Câu trả lời:


9

Tôi biết đây là một câu hỏi rất cũ nhưng gần đây tôi đã tìm thấy một giải pháp tốt. Sau nhiều thất vọng, tôi đã tìm ra những cách này để truy cập vào bảng tạm của hệ thống windows bằng cách sao chép và dán.

Bằng cách sao chép, với phiên bản vim> = 8.0.1394, như đã lưu ý trong câu trả lời khác 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

Dán, ánh xạ tới các lệnh đăng ký giả, tức là "= p hoặc" + p hoặc bất cứ điều gì.

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>

Nhấp chuột phải hoạt động, nhưng không thỏa mãn nếu bạn không muốn sử dụng chuột


Trên WSL vitôi đã thêmnnoremap <S-Insert> :r !powershell.exe -Command "& {Get-Clipboard}"<Enter>
Walter A

4

Cái này thì sao?

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

unamelà một lệnh đầu cuối Linux trả về thông tin hệ điều hành, sao cho nó sẽ trả về LinuxWSL. Trong khi với -rcờ, lệnh trả về thông tin phát hành của HĐH, do đó, nó sẽ bao gồm "Windows".

TextYankPostlà một sự kiện vim (xem :h TextYankPosttrong vim), phát hiện hoạt động yank văn bản của bạn.

clip.exelà một lệnh của dấu nhắc lệnh Windows trong WSL (xem CLIP /?trong dấu nhắc lệnh) sao chép texthoặc trả lại từ một commandclipbord thông qua text | clip.exehoặc command | clip.exe. Ở đây, clip.exeđược thực hiện từ vim bởi chức năng vim system.


trong Neovim người ta có thể sử dụng has('wsl')thay vì system('uname -r') =~ "Microsoft".
Justin M. Keyes

2

Tôi đã thực hiện PR cho hỗ trợ WSL cho fakeclip một thời gian trước đây.

Xem vimawgie về cách cài đặt nó; help fakeclipđể sử dụng.


Vẫn duy trì?
Chris
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.