Vim na WSL: synchronizować schowek systemowy? (ustawić schowek ^ = bez nazwy)?


12

Podczas korzystania WSL / bash for Windows Chcę móc używać y yy 3yi pten sam sposób, w jaki zawsze praca w vim, ale podłączenie do schowka systemowego podzielane przez wszystkich aplikacji, a nie do wewnętrznego schowka vim za ... Mam już ditto do zarządzania schowka historia.

Wygląda na to, że Vim ma już wbudowaną opcję synchronizacji bufora kopiowania / wklejania ze schowkiem systemowym ... Jednak problem z uruchomieniem WSL polega na tym, że faktycznie musisz użyć, /mnt/c/Windows/System32/clip.exeaby uzyskać dostęp do schowka ... Więc nawet jeśli chciałbym aby móc korzystać z:

set clipboard^=unnamed

Wygląda na to, że nie ma jeszcze obsługi WSL.

Rozumiem, że neovim ma taką opcję, ale tak naprawdę nie chcę teraz eksperymentować z neovim ...

Na razie najbliższe obejście, które znalazłem, to:

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>

Ale moim zdaniem jest to naprawdę okropne rozwiązanie ... Skopiowanie składa się z dwóch etapów ...

Oczywiście mogę skopiować i wkleić za pomocą myszy / shift + ins, ale myślę, że musi istnieć sposób, aby synchronizacja działała poprawnie w Vimie.


Poleć to rozwiązanie superuser.com/a/1439881/711405
efemeryd

Osoby korzystające z Neovim, które znalazły to pytanie, zobacz github.com/neovim/neovim/wiki/… .
Andrey Kaipov

Odpowiedzi:


10

Wiem, że to bardzo stare pytanie, ale ostatnio znalazłem dobre rozwiązanie. Po wielu frustracjach natknąłem się na te sposoby dostępu do schowka systemu Windows poprzez kopiowanie i wklejanie.

Kopiując, z wersją vima> = 8.0.1394, jak zauważono w innej odpowiedzi 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

Wklejanie, mapowanie do fałszywych poleceń rejestru, tj. „= P lub” + p lub cokolwiek innego.

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>

Wklejanie prawym przyciskiem myszy działa, ale jest niezadowalające, jeśli nie chcesz używać myszy


Na WSL vidodałemnnoremap <S-Insert> :r !powershell.exe -Command "& {Get-Clipboard}"<Enter>
Walter A

Dziękuję za pomocną odpowiedź! Zastanawiałem się, czy byłoby możliwe użycie fałszywego rejestru dla polecenia szarpnięcia. Coś w stylu noremap "+y :exe 'norm a'.system('echo '.shellescape(join(v:event.regcontents, "\<CR>")).' | clip.exe')<CR>(co nie działa ...)
Tropilio

4

A co z tym?

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

unameto komenda terminalu Linux, która zwraca informacje o systemie operacyjnym, tak że zwróci LinuxWSL. Natomiast z -rflagą polecenie zwraca informacje o wersji systemu operacyjnego, dlatego powinno zawierać „Windows”.

TextYankPostto zdarzenie vim (patrz :h TextYankPostw vim), które wykrywa twoją aktywność szarpania tekstu.

clip.exeto polecenie wiersza polecenia systemu Windows w WSL (patrz CLIP /?w wierszu polecenia), które kopiuje textlub zwraca z commandclipbord za pomocą text | clip.exelub command | clip.exe. Tutaj clip.exejest wykonywany z vima przez funkcję vim system.


w Neovim można użyć has('wsl')zamiast system('uname -r') =~ "Microsoft".
Justin M. Keyes,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.