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.


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


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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.