Vim no WSL: sincronizar a área de transferência do sistema? (definir área de transferência ^ = sem nome)?

12

Enquanto estiver usando WSL / Bash para Windows Eu quero ser capaz de usar y yy 3ye pda mesma forma que sempre trabalho no vim, mas a conexão com a área de transferência compartilhada por todos os aplicativos, não para área de transferência interna de vim ... Eu já tenho ditto para gerenciar área de transferência história.

Parece que o Vim já possui uma opção integrada para sincronizar o buffer de copiar / colar com a área de transferência do sistema ... No entanto, o problema ao executar o WSL é que você realmente precisa usar /mnt/c/Windows/System32/clip.exepara acessar a área de transferência ... Então, mesmo que eu queira para poder usar:

set clipboard^=unnamed

Ainda não parece ter suporte para WSL.

Entendo que o neovim tem isso como uma opção, mas não quero experimentar o neovim agora ...

Por enquanto, a coisa mais próxima de uma solução alternativa que eu encontrei é:

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>

Mas, na minha opinião, essa é uma solução realmente horrível ... Torna a cópia um processo de duas etapas ...

Claro que posso copiar e colar com o mouse / shift + ins, mas acho que deve haver uma maneira de fazer com que essa sincronização funcione corretamente no Vim.

Ryan Erwin
fonte
Recomende esta solução superuser.com/a/1439881/711405
ephemerr 21/12/19

Respostas:

10

Estou ciente de que esta é uma pergunta muito antiga, mas recentemente encontrei uma boa solução. Após muita frustração, me deparei com essas maneiras de acessar a área de transferência do sistema Windows, copiando e colando.

Copiando, com a versão vim> = 8.0.1394, conforme observado em outra resposta 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

Colagem, mapeamento para comandos de registro falsos, ou seja, "= p ou" + p ou o que for.

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>

Colar com o botão direito do mouse funciona, mas é insatisfatório se você não quiser usar o mouse

ponto de interrogação
fonte
Na WSL vieu adicioneinnoremap <S-Insert> :r !powershell.exe -Command "& {Get-Clipboard}"<Enter>
Walter A
Obrigado pela resposta útil! Eu queria saber se seria possível também usar um registro falso para o comando yank. Algo como noremap "+y :exe 'norm a'.system('echo '.shellescape(join(v:event.regcontents, "\<CR>")).' | clip.exe')<CR>(o que não funciona ...)
Tropilio 21/04
4

Que tal isso?

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

unameé um comando de terminal do Linux que retorna informações do sistema operacional, de forma que ele retornará Linuxpara o WSL. Enquanto que com o -rsinalizador, o comando retorna as informações de liberação do SO, portanto deve incluir "Windows".

TextYankPosté um evento vim (veja :h TextYankPostem vim), que detecta sua atividade de arrancamento de texto.

clip.exeé um comando do prompt de comando do Windows na WSL (veja CLIP /?no prompt de comando) que copia textou retorna de um commandpara o clipbord via text | clip.exeou command | clip.exe. Aqui, a função clip.exeé executada do vim pela vim system.

aohmusi
fonte
no Neovim pode-se usar em has('wsl')vez de system('uname -r') =~ "Microsoft".
Justin M. Keyes
2

Fiz um PR para o suporte da WSL para falsificar há algum tempo.

Veja o vimawesome sobre como instalá-lo; help fakeclippara uso.

Laktak
fonte
Ainda mantida?
Chris