Vim en WSL: ¿sincronizar el portapapeles del sistema? (establecer portapapeles ^ = sin nombre)?

12

Mientras uso WSL / Bash para Windows, quiero poder usarlo y yy 3yy de pla misma manera que siempre funcionan en vim, pero conectando al portapapeles del sistema compartido por todas las aplicaciones, no al portapapeles interno de vim ... Ya tengo lo mismo para administrar el portapapeles historia.

Parece que Vim ya tiene una opción integrada para sincronizar el búfer de copiar / pegar con el portapapeles del sistema ... Sin embargo, el problema al ejecutar WSL es que realmente necesita usar /mnt/c/Windows/System32/clip.exepara acceder al portapapeles ... Entonces, aunque me gustaría para poder usar:

set clipboard^=unnamed

Parece que todavía no tiene soporte para WSL.

Entiendo que los neovim tienen esto como una opción, pero realmente no quiero experimentar con neovim en este momento ...

Por ahora, lo más parecido a una solución alternativa que he encontrado es:

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>

Pero esta es una solución realmente horrible en mi opinión ... Hace que copiar un proceso de dos pasos ...

Por supuesto, puedo copiar y pegar con el mouse / shift + ins, pero creo que debe haber una manera de hacer que esta sincronización funcione correctamente en Vim.

Ryan Erwin
fuente
Recomendar esta solución superuser.com/a/1439881/711405
ephemerr

Respuestas:

10

Soy consciente de que esta es una pregunta muy antigua, pero recientemente encontré una buena solución. Después de mucha frustración, encontré estas formas de acceder al portapapeles del sistema de Windows copiando y pegando.

Al copiar, con la versión vim> = 8.0.1394, como se señaló en otra respuesta 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

Pegar, asignar a comandos de registro falsos, es decir, "= p o" + p o lo que sea.

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>

El pegado con el botón derecho funciona, pero no es satisfactorio si no desea usar el mouse

signo de interrogación
fuente
En WSL vihe agregadonnoremap <S-Insert> :r !powershell.exe -Command "& {Get-Clipboard}"<Enter>
Walter A
Gracias por la útil respuesta! Me preguntaba si sería posible utilizar también un registro falso para el comando yank. Algo así noremap "+y :exe 'norm a'.system('echo '.shellescape(join(v:event.regcontents, "\<CR>")).' | clip.exe')<CR>(que no funciona ...)
Tropilio
4

¿Qué hay de esto?

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

unamees un comando de terminal de Linux que devuelve información del sistema operativo, de modo que volverá Linuxpara WSL. Mientras que con el -rindicador, el comando devuelve información de lanzamiento del sistema operativo, por lo tanto, debe incluir "Windows".

TextYankPostes un evento vim (ver :h TextYankPosten vim), que detecta su actividad de extracción de texto.

clip.exees un comando del símbolo del sistema de Windows en WSL (consulte el CLIP /?símbolo del sistema) que copia texto regresa de un commandclipbord a través de text | clip.exeo command | clip.exe. Aquí clip.exese ejecuta desde vim por la función vim system.

aohmusi
fuente
en Neovim se puede usar en has('wsl')lugar de system('uname -r') =~ "Microsoft".
Justin M. Keyes
2

Hice un PR para el soporte de WSL para fakeclip hace algún tiempo.

Vea vimawesome sobre cómo instalarlo; help fakeclippara uso

laktak
fuente
¿Aún mantenido?
Chris