Vim sur WSL: synchroniser le presse-papiers du système? (définir le presse-papiers ^ = sans nom)?


12

En utilisant WSL / Bash pour Windows, je veux pouvoir utiliser y yy 3yet de pla même manière qu'ils fonctionnent toujours dans vim, mais en me connectant au presse-papiers du système partagé par toutes les applications, pas au presse-papiers interne de vim ... J'ai déjà idem pour gérer le presse-papiers histoire.

Il semble que Vim dispose déjà d'une option intégrée pour synchroniser le tampon copier / coller avec le presse-papiers du système ... Pourtant, le problème lors de l'exécution de WSL est que vous devez réellement utiliser /mnt/c/Windows/System32/clip.exepour accéder au presse-papiers ... Donc, même si je voudrais pouvoir utiliser:

set clipboard^=unnamed

Il ne semble pas encore avoir de support WSL.

Je comprends que le neovim a cette option, mais je ne veux pas vraiment expérimenter avec le neovim en ce moment ...

Pour l'instant, la chose la plus proche d'une solution de contournement que j'ai trouvée est:

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>

Mais c'est une solution vraiment horrible à mon avis ... Cela fait de la copie un processus en deux étapes ...

Bien sûr, je peux faire du copier-coller avec la souris / shift + ins, mais je pense qu'il doit y avoir un moyen pour que cette synchronisation fonctionne correctement dans Vim.


Recommander cette solution superuser.com/a/1439881/711405
ephemerr

Réponses:


10

Je sais que c'est une très vieille question, mais j'ai récemment trouvé une bonne solution. Après beaucoup de frustration, je suis tombé sur ces façons d'accéder au presse-papiers du système Windows en copiant et collant.

En copiant, avec la version vim> = 8.0.1394, comme indiqué dans une autre réponse 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

Coller, mapper sur de fausses commandes de registre, c'est-à-dire "= p ou" + p ou autre chose.

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>

Le collage avec le bouton droit fonctionne, mais n'est pas satisfaisant si vous ne souhaitez pas utiliser la souris


Sur WSL, vij'ai ajouténnoremap <S-Insert> :r !powershell.exe -Command "& {Get-Clipboard}"<Enter>
Walter A

Merci pour la réponse utile! Je me demandais s'il serait possible d'utiliser également un faux registre pour la commande yank. Quelque chose comme noremap "+y :exe 'norm a'.system('echo '.shellescape(join(v:event.regcontents, "\<CR>")).' | clip.exe')<CR>(qui ne fonctionne pas ...)
Tropilio

4

Et ça?

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

unameest une commande de terminal Linux qui renvoie des informations sur le système d'exploitation, de telle sorte qu'elle retournera Linuxpour WSL. Alors qu'avec le -rdrapeau, la commande retourne les informations de version du système d'exploitation, elle devrait donc inclure "Windows".

TextYankPostest un événement vim (voir :h TextYankPostdans vim), qui détecte votre activité de coup de texte.

clip.exeest une commande d'invite de commande Windows en WSL (voir CLIP /?dans l'invite de commande) qui copie textou retourne dans un commandclipbord via text | clip.exeou command | clip.exe. Ici, le clip.exeest exécuté à partir de vim par la fonction vim system.


dans Neovim on peut utiliser à la has('wsl')place de system('uname -r') =~ "Microsoft".
Justin M. Keyes

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.