web-dev-qa-db-fra.com

Comment "copier dans le presse-papiers" dans Vim de Bash sous Windows?

J'avais l'habitude d'utiliser "+y pour copier du texte dans le presse-papiers du système, mais cela ne fonctionne pas dans Vim de Bash sous Windows.

16
nbystndr

Puisque ni "* y ni" + y (...) ne fonctionne, une alternative est la suivante:

Ajoutez ceci à votre .vimrc et créez un fichier appelé ~/.vimbuffer

" copy (write) highlighted text to .vimbuffer
vmap <C-c> y:new ~/.vimbuffer<CR>VGp:x<CR> \| :!cat ~/.vimbuffer \| clip.exe <CR><CR>
" paste from buffer
map <C-v> :r ~/.vimbuffer<CR>

Mettez en surbrillance n'importe quel texte à l'aide de visual ou visual-block et appuyez sur ctrl-c. Collez le texte copié en dehors de votre terminal à l'aide de la méthode habituelle ou collez le texte copié dans n'importe quel volet Vim à l'aide de ctrl-v en mode normal ou visuel.

Ctrl-c arrache le texte sélectionné, écrase ~/.vimbuffer avec le texte sélectionné, exécute une commande UNIX pour diriger les données de ~/.vimbuffer à clip.exe.

Toute autre amélioration (par exemple: rendre la commande silencieuse) est très appréciée!

Edit: La commande peut désormais copier des chaînes de n'importe quelle longueur, pas seulement des lignes entières. Ancienne commande:

vmap <C-c> :w! ~/.vimbuffer \| !cat ~/.vimbuffer \| clip.exe <CR><CR>

20
davidanderle

Pour copier dans le presse-papiers depuis vim dans Bash sous Windows 10, maintenez Shift et faites glisser le curseur sur le texte. puis appuyez sur enter

Une sélection devrait ressembler à ceci avant d'appuyer sur enter:

Selection should look like this before pressing ENTER

[~ # ~] modifier [~ # ~] : Cela ne fonctionne qu'avec du texte qui tient à l'écran en une seule fois; il ne peut pas être utilisé pour copier des blocs de texte qui s'étendent sur de nombreux "écrans"

8
ifconfig

Si vous ne souhaitez pas configurer de serveur X, cette méthode vous permettra de copier le texte sélectionné dans votre presse-papiers à l'aide de clip.exe programme fourni avec Windows.

Les extraits de code ci-dessous peuvent être placés dans votre .vimrc fichier.

Créez d'abord une fonction d'assistance qui renverra le texte actuellement sélectionné sous forme de chaîne. Nous pouvons utiliser cette fonction pour diriger le texte en surbrillance dans clip.exe:

func! GetSelectedText()
    normal gv"xy
    let result = getreg("x")
    return result
endfunc

La fonction system nous permettra d'y appeler des programmes natifs et des paramètres de canal. L'extrait ci-dessous définit deux mappages clés; la première ligne permettra Ctrl+C à utiliser pour copier du texte et le second permettra Ctrl+X pour couper du texte:

noremap <C-C> :call system('clip.exe', GetSelectedText())<CR>
noremap <C-X> :call system('clip.exe', GetSelectedText())<CR>gvx

Après avoir enregistré les modifications dans votre .vimrc fichier, vous devriez être prêt à partir.

Si vous allez utiliser votre .vimrc sur plusieurs systèmes, je suggère d'encapsuler ces mappages dans une instruction if pour vérifier si clip.exe existe réellement:

if !has("clipboard") && executable("clip.exe")
    noremap <C-C> :call system('clip.exe', GetSelectedText())<CR>
    noremap <C-X> :call system('clip.exe', GetSelectedText())<CR>gvx
endif

Ce qui précède permettra également à Vim d'ignorer ces raccourcis clavier s'il a un accès direct au presse-papiers du système.

Vous pouvez également ajouter des raccourcis clavier lorsque vim a accès au presse-papiers, comme ceci:

if has("clipboard")
    vnoremap <C-X> "+x
    vnoremap <S-Del> "+x

    vnoremap <C-C> "+y
    vnoremap <C-Insert> "+y

    map <C-V>       "+gP
    map <S-Insert>      "+gP

    cmap <C-V>      <C-R>+
    cmap <S-Insert>     <C-R>+
endif

Ce qui vous sera utile si vous utilisez Vim nativement sous Windows ou utilisez vim-gtk sur un système Linux.

5
Top Cat

Si vous ne vous souciez que de copier des lignes complètes, vous pouvez utiliser la capacité de Vim pour diriger le contenu du fichier vers un programme externe. Vous pouvez donc faire

:w !clip.exe

à diriger dans clip.exe. Si vous avez besoin de lignes spécifiques, disons 2 à 10, vous pouvez simplement faire :2,10w !clip.exe.

Voir Piping buffer vers commande externe dans Vim

1
Mitchell P

En combinant les informations ci-dessus, il est possible de copier du texte simple de n'importe quel registre vers un presse-papiers sans utiliser de raccourci clavier (ce qui peut être plus pratique dans certains cas). Par exemple, si vous souhaitez copier le dernier texte retiré dans le presse-papiers de Windows, entrez la commande suivante (commencez à taper):

:call system('clip.exe', '

Maintenant, appuyez sur Ctrl+r, suivi d'un registre +. Il collera un texte du registre spécifié. Ensuite, fermez le guillemet simple et les parenthèses. La commande ressemblera à:

:call system('clip.exe', 'a text from 0 register')

Presse Enter, terminé!

0
Pavel Sapehin

Si vous souhaitez utiliser vim fourni dans WSL, vous ne pouvez utiliser que le Presse-papiers fourni par vim lui-même, ce qui signifie que vous ne pouvez copier et coller que dans vim uniquement.

Ou, vous pouvez essayer:

  1. Installez VcXsrv et exécutez-le.
  2. export DISPLAY=localhost:0 dans votre WSL Bash.
  3. Exécutez vim-gtk ou vim-gnome (ou toute autre application graphique) et essayez Clipboard sur Linux et Windows.
0
reker