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.
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>
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
:
[~ # ~] 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"
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.
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
.
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é!
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:
export DISPLAY=localhost:0
dans votre WSL Bash.