52 votes

Windows Subsystem Linux - Faire en sorte que VIM utilise le presse-papiers ?

Pour clarifier les choses dès maintenant et éviter toute confusion ... Ceci concerne Linux qui fonctionne sous Windows 10 (Ubuntu), également connu sous le nom de WSL. Ce n'est pas la même chose que cygwin et Windows ou Linux autonome. C'est une bête à part.

Donc, s'il vous plaît gardez cela à l'esprit avant de me renvoyer à tous les articles que j'ai déjà lus ou de commenter que cela a déjà été demandé auparavant.

Est-ce que quelqu'un sait comment faire fonctionner la copie et le collage à partir du presse-papiers Windows OU de l'émulation Linux Ubuntu WSL? J'utilise clipboard=unnamedplus. Ça ne fonctionne pas, peu importe les combinaisons que j'essaie comme yy, "+yy, etc.

Oui, c'est vim-gtk avec le support +xterm_clipboard.

1voto

dhaupin Points 373

Il y a beaucoup de bizarreries avec le terminal WSL, mais l'utilisation du copier/coller croisé Vim est le plus grand agacement à mon sens. Rien de ce que j'ai essayé jusqu'en avril 2018 n'a fonctionné pour coller dans Vim ou dans d'autres zones (en utilisant la sagesse normale), donc essayons de contourner le problème, et d'autres liés comme le tampon, pour l'instant. Ce n'est pas une solution directe WSL, mais plutôt une solution de contournement en utilisant un terminal de meilleure qualité + SSH jusqu'à ce que Microsoft fournisse un correctif.

Putty, ou sa version étendue Kitty, offrent un terminal plus robuste que WSL. Nous pouvons nous connecter au WSL (ou à n'importe lequel de vos autres serveurs) en utilisant SSH via localhost, en utilisant un port personnalisé, et obtenir un terminal plus complet, incluant presque toutes les capacités de Vim pour le copier/coller bidirectionnel, le scroll, etc. [Vous pourriez devoir ajuster la configuration de Vim pour déclencher toutes les capacités].

Putty/Kitty nécessitent un serveur SSH disponible dans le WSL, sur un port localhost personnalisé. Si vous n'avez pas déjà configuré un serveur SSH localhost sur votre WSL, voici un bref aperçu de la procédure :

Étape 1) Ouvrez le terminal Ubuntu WSL, faites un sudo su pour vous authentifier en tant que root, exécutez vim /etc/ssh/sshd_config pour ouvrir la configuration du serveur SSH.

Étape 2) Cherchez "Port" près des premières lignes. Il peut être réglé sur 22. Nous devons définir un port personnalisé pour notre SSH WSL qui ne soit pas en collision. Appuyez sur i pour éditer. Utilisons par exemple le port 9977.

Étape 3) Si vous êtes un développeur, ou autrement n'avez pas besoin de vous embêter avec des clés pour votre SSH localhost WSL, cherchez l'authentification par mot de passe. Vous pouvez définir PasswordAuthentication yes. Sinon, les clés et une sécurité plus élevée, ou l'accès public via des pare-feu sur le WSL, dépassent le cadre de cette réponse.

Étape 4) Lorsque vous avez fini d'éditer, appuyez sur échap pour quitter le mode édition, puis enregistrez et quittez le fichier avec :wq. Redémarrez le service SSH en utilisant service ssh restart. Laissez le WSL ouvert à ce stade comme une console principale.

Étape 5) Créez une nouvelle session Putty/Kitty, connectez-vous en localhost, en utilisant votre port personnalisé (9977 dans notre exemple). Connectez-vous avec vos identifiants WSL, faites un sudo su si vous avez besoin des droits root. Vous devriez maintenant avoir un shell beaucoup plus robuste à disposition. Répétez ou utilisez screen autant de vues que nécessaire.

Je sais que ce n'est pas une réponse directe, mais au moins c'est une solution pour l'instant :)

1voto

Grisotto Points 111

Vous pouvez ouvrir la distribution wsl depuis le Terminal Windows, puis appuyez sur Ctrl + Maj + V.

Ouvrez le Terminal Windows, puis cliquez sur la "flèche vers le bas" entrer la description de l'image ici

Ouvrez vim et allez en mode Insertion puis appuyez sur Ctrl + Maj + V

Si vous le souhaitez, vous pouvez obtenir du contenu depuis le registre "+" et ensuite coller avec < leader > p

 " Copier dans le presse-papiers
 vnoremap  y  "+y
 nnoremap  y  "+y

" " Coller depuis le presse-papiers
 nnoremap p "+p
 vnoremap p "+p

0voto

MerryDan Points 1

Vous pourriez utiliser xclip ou win32yank.exe. Pour une raison quelconque, parfois dans WSL1, mon clip.exe et win32yank.exe semblent avoir une erreur d'exécution, donc j'utilise principalement xclip local avec un xserver en cours d'exécution. Modifié à partir de quelques autres exemples, y compris un presse-papier neovim .vim

Vous pourriez simplement utiliser la section supérieure pour ajouter ctrl-c ctrl-x (pas encore ctrl-v!) sans affecter le fonctionnement de vim, ou ajouter la section inférieure pour yanker vers le presse-papier de Windows mais avoir la suppression fonctionner normalement en utilisant le tampon vim (donc en appuyant sur x, etc., fonctionne rapidement et comme prévu)

set clipboard=unnamedplus
if system('uname -a | egrep [Mm]icrosoft') != ''
 let g:lastyank = 'y'
 if executable('win32yank.exe')
    let g:copy = 'win32yank.exe -i --crlf'
    let g:paste = 'win32yank.exe -o --lf'
 elseif exists('$DISPLAY') && executable('xclip')
    let g:copy = 'xclip -i -selection clipboard'
    let g:paste = 'xclip -o -selection clipboard'
 else
    let g:copy = 'clip.exe'
    let g:paste = 'powershell.exe Get-Clipboard'
 endif
 augroup myYank
    autocmd!
    autocmd TextYankPost * if v:event.operator == 'y' | call system(g:copy, @") | let g:lastyank='y' | else | let g:lastyank='' | endif
    "autocmd TextYankPost * if v:event.operator ==# 'y' | call system(g:copy, @") | endif
    "autocmd TextYankPost * call system(g:copy, @")
 augroup END
 function! Paste(mode)
    if g:lastyank == 'y'
     let @" = system(g:paste)
    endif
    return a:mode
 endfunction
 map  p Paste('p')
 map  P Paste('P')
 " map Ctrl-c and Ctrl-x as expected
 func! GetSelectedText()
    normal gv"xy
    let result = getreg("x")
    return result
 endfunc
 noremap  :call system(g:copy, GetSelectedText())
 noremap  :call system(g:copy, GetSelectedText())gvx
endif

0voto

Anthony Naddeo Points 113

Beaucoup de suggestions pour la copie mais je n'ai réussi à en faire fonctionner aucune pour coller. J'ai juste opté pour cela dans mon vimrc

nmap PP :r!powershell.exe -command "Get-Clipboard"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X