Comment copier du texte dans le presse-papiers du système à partir de Vim?

284

Existe-t-il un moyen de copier un bloc de texte dans le Presse-papiers du système pour que je puisse le coller dans un autre programme?

thameera
la source
12
Cela a déjà été demandé et répondu sur SO. Vous pouvez y trouver des informations plus nombreuses et différentes.
bsmith89
1
J'ai utilisé ce plugin sur macvim christoomey / vim-system-copy et je l'aime vraiment. Il fonctionne très bien avec des mouvements cpip, cpi{.
Filype
2
Ce dont vous avez vraiment besoin, c'est EasyClip . Il fera exactement cela et bien plus encore ...
Scott Wade

Réponses:

324

Pour les systèmes basés sur X11 (c'est-à-dire Linux et la plupart des systèmes similaires à UNIX ), il existe deux presse-papiers indépendants l'un de l'autre:

  • PRIMAIRE - Ceci est une copie sur sélection, et peut être collé avec le bouton central de la souris.
  • CLIPBOARD - Ceci est copié avec (généralement) ^C, et collé avec ^V(c'est comme MS Windows).

Les systèmes OS X et Windows ne possèdent qu'un seul presse-papiers.

Pour les systèmes X11, de nombreux outils synchronisent ces presse-papiers à votre place. alors, si elles semblent être les mêmes, vous pouvez en avoir un en cours d'exécution.

Vim a deux registres spéciaux correspondant à ces presse-papiers:

  • *utilise PRIMARY; mnémonique: S goudron est S élu (pour copie sur des élus)
  • +utilise CLIPBOARD; mnémonique: CTRL PLUS C (pour le keybind commun)

Sous Windows et OS X, il n'y a pas de différence entre +et *, car ces systèmes ne possèdent qu'un seul presse-papiers et que les deux registres font référence à la même chose (peu importe celui que vous utilisez).

Vous pouvez utiliser ces registres comme n'importe quel registre. Par exemple, en utilisant le presse-papiers PRIMARY *avec les commandes yet p:

  • "*yy
  • "*p

Vous pourriez peut-être utiliser ceci comme une liaison plus pratique:

noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p

Si vous souhaitez "automatiquement" vous connecter au presse-papiers du système au lieu de le consulter manuellement tout le temps, vous pouvez définir la clipboardvariable:

  • Réglez-le à unnamedutiliser *(PRIMARY, on select)
  • Réglez-le à unnamedplusutiliser +(CLIPBOARD, ^C)

Maintenant, simplement utiliser yyira dans le presse-papiers du système, au lieu du registre sans nom de Vim, et pcollera le presse-papiers du système.

Vous pouvez aussi assigner à ces registres comme n'importe quel registre avec let:

  • :let @+=42
  • :let @*=42

Le clipboardparamètre comporte quelques options supplémentaires (telles que les filtres d’exclusion); mais ce sont les bases. Voir :help 'clipboard'pour l'histoire complète ;-)

gVim

Si vous utilisez gVim, vous pouvez obtenir un comportement de copie sur sélection lors de l'utilisation :set guioptions+=a.
Cette option est activée par défaut sur les systèmes X11 (copies sur PRIMARY), mais pas sur MS Windows et OSX (car la sélection de texte remplacerait le presse-papiers).

Non +clipboard?

Vim a besoin de l' +clipboardindicateur de fonctionnalité pour que cela fonctionne; vous pouvez vérifier si votre Vim a cela en utilisant :echo has('clipboard')depuis Vim (si la sortie est 0, elle n'est pas présente, si c'est le cas 1) ou en vérifiant la sortie de vim --versionpour +clipboard.

La plupart des distributions Linux sont livrées avec une version "minimale" de Vim par défaut +clipboard, mais vous pouvez généralement l'installer:

  • Debian et Ubuntu: Installez vim-gtkou vim-gnome.
  • Fedora: installer vim-X11et exécuter à la vimxplace de vim( plus d'infos ).
  • Arch Linux: installer gvim(cela +clipboardactivera vimaussi normalement ).

Vous pouvez également utiliser xclip, xcopyou xselpour copier du texte dans le presse-papiers; voir les questions suivantes pour des solutions:

SSH

Vous pouvez également utiliser un presse-papiers sur des ordinateurs distants si vous activez le transfert X11 via SSH. Ceci est particulièrement utile avec l’astuce ci-dessus puisque vous pouvez ensuite utiliser xclippour accéder au Presse-papiers de votre bureau. Le Vim sur la machine à laquelle vous êtes connecté aura toujours besoin de cette +clipboardfonctionnalité.

Cela nécessite la ForwardX11Trustedconfiguration et ne devrait être effectué qu'avec des serveurs de confiance , car cela donne au serveur un contrôle presque complet sur votre session X11:

$ ssh -XY myhost

Pour rendre ces paramètres persistants (vous n'avez donc pas besoin d'ajouter à -XYchaque fois), vous pouvez faire quelque chose comme ceci dans votre ~/.ssh/config:

# Do **NOT** set this globally; it gives the server complete control over
# your X11 session.
Host myhost
    ForwardX11 yes
    ForwardX11Trusted yes

Neovim

Neovim a réorganisé le support du presse-papiers. L'interface intégrée a été retiré et remplacé par un système qui appellent un utilitaire externe tel que xclip, xselou pbcopy/ pbpaste.

Il devrait automatiquement ramasser ces utilitaires et les utiliser. Sous OS X pbcopy et pbpastedevrait être disponible par défaut, sous Linux, vous voudrez probablement l'installer xclip, car c'est la version la plus largement disponible (il existe en fait deux versions xselavec des indicateurs incompatibles . C'est vraiment stupide).

Voir aussi :help clipboarddans Neovim.

Martin Tournoij
la source
6
ssh -Y implique -X, donc -X peut être omis.
hildred
Pour certains claviers internationaux, vous devrez peut-être appuyer sur "<Space>pour obtenir un ". Donc, dans ce cas, vous devrez appuyer "<Space>+you "<Space>*ycopier.
Arthur F
1
Un effet secondaire très intéressant de cet apprentissage (il y a quelques années) a été pour moi la réalisation qui "permet de sélectionner de nombreux registres nommés. "+n'est pas magique, il suffit de vous inscrire +. Ainsi , par exemple, si vous voulez copier trois choses en même temps et coller chacun d'eux un par un, vous pouvez "1y, "2yet "3yplus tard "1p, "2pet "3p. C'est vraiment puissant et inexistant dans presque tous les autres éditeurs. Une autre utilisation intéressante est de regarder les macros stockées. Par exemple, si vous enregistrez avec qq, mais que vous réalisez que vous devez le réparer, vous pouvez: dans une ligne temporaire "qp, le corriger, et "qd.
Shahbaz
1
Juste une note: OS X a deux presse-papiers séparés. L'un est accessible à l'aide de Cmd-C et Cmd-V et l'autre à l'aide des raccourcis clavier emacs Ctrl-K et Ctrl-Y.
BallpointBen
3
@shahbaz - il est probablement préférable d'utiliser les registres de lettres à cette fin, car les registres numérotés sont modifiés chaque fois que du texte est supprimé.
Evilsoup
18

Les autres réponses expliquent comment copier du texte de votre tampon dans le presse-papiers du système. Une autre opération courante consiste à copier du texte d'un autre registre dans le presse-papiers. Par exemple, si vous avez déjà inséré du texte dans "(le registre par défaut), vous pouvez charger ce registre dans le presse-papiers.

Vous pouvez le faire avec :let:

  • let @+=@" - copie le registre par défaut dans le presse-papier
  • let @*=@" - copie le registre par défaut dans la sélection primaire X11 ("presse-papiers de la souris")
  • let @+=@a- copie du registre adans le presse-papier
  • etc.

Notez que cela fonctionne pour les registres en général: les let @a=@bcopies s'enregistrent bpour s'enregistrer a.

wchargin
la source
17

De http://vim.wikia.com/wiki/Accessing_the_system_clipboard

set clipboard=unnamedplus

Cela change le registre Vim par défaut en +registre, qui est lié au presse-papiers du système. De :h clipboard-unnamedplus:

                                        clipboard-unnamedplus
unnamedplus     A variant of the "unnamed" flag which uses the
                clipboard register '+' (quoteplus) instead of
                register '*' for all yank, delete, change and put
                operations which would normally go to the unnamed
                register.  When "unnamed" is also included to the
                option, yank operations (but not delete, change or
                put) will additionally copy the text into register
                '*'.
                Only available with the +X11 feature.
                Availability can be checked with: 
                        if has('unnamedplus')
Quincy Bowers
la source
Pourquoi cela ne fonctionne-t-il pas pour moi quand je crie et colle entre les instances de vim (chacune dans un terminal de terminaison distinct)?
thinwybk
Si vous êtes sous Linux et que Vim a été compilé avec la fonctionnalité + X11, et que vous avez clipboard = unnamedplus set, vous devriez être en mesure de tirer une ligne dans une instance de vim et de la coller dans une autre instance de vim. Vous devriez également pouvoir le coller dans une autre application avec CTRL + V ou SHIFT + INSERT. Vous pouvez utiliser :versionVim pour voir si + X11 apparaît dans la liste des fonctionnalités incluses. Vous pouvez également vérifier si la fonctionnalité 'unnamedplus' est disponible avec :if has('unnamedplus')⏎ echo 'yes'⏎ endif Si vous n'êtes pas sous Linux, vous devez utiliser unnamed au lieu de unnamedplus.
Quincy Bowers
10

Sur les versions qui le prennent en charge, le registre nommé *est le presse-papiers du système. Pour copier du texte de Vim dans le presse-papiers du système, vous pouvez sélectionner le texte en mode visuel, puis appuyer sur "*ypour le copier dans le presse-papiers du système.

Inversement, utilisez "*ppour coller du texte du presse-papiers du système dans Vim.

200_success
la source
5

Je vous recommande d'utiliser Gvim et de l'ajouter à votre .vimrc:

source $VIMRUNTIME/mswin.vim
behave mswin

Cela permet le support pour CtrlC, CtrlX, CtrlVcomme le bloc - notes dans Windows.

Notez que cela ajoutera également d’autres raccourcis Windows courants, tels que CtrlSpour :w, CtrlApour tout sélectionner, etc.

linrongbin
la source
0

Si votre vim ne supporte pas, +clipboardvous pouvez utiliser le plugin fakeclip pour Linux, Mac, Windows, tmux, screen, ...

laktak
la source
0

Chaque autre réponse a couvert toutes les choses importantes concernant les registres. J'aimerais ajouter une dernière chose que j'utilise.

Il existe un moyen dans Vim de copier directement le texte sélectionné visuellement dans le presse-papiers. Il suffit de mettre ceci dans votre fichier vimrc :

set guioptions+=a

Et, avec cela, chaque fois que vous sélectionnez visuellement du texte, il sera copié dans votre presse-papiers. Pour plus d'informations à ce sujet,:help guioptions

BTW, ceci est seulement pour gVim.

Durga Swaroop
la source
2
guioptions+=aest également mentionné dans la réponse de Carpetsmoker.
Muru
@muru Ouais, désolé. Je n'ai pas vu ça avant. Je l'ai juste vu.
Durga Swaroop
0

Vous pouvez également utiliser une commande globale pour mettre un motif spécifique dans le presse-papiers. Cela peut être utile dans les cas où vous avez des informations dispersées dans un fichier et que le traitement manuel est sujet aux erreurs et à la fatigue.

Commencez par nettoyer le registre qui recevra les informations

:let @a=""

Puis copiez toutes les lignes contenant le motif

:g/pattern/yank A

Enfin, transférer (copier) les informations dans le presse-papiers du système

:let @+=@a

si vous essayez de copier chaque ligne contenant un "motif" directement dans le presse-papier, cela ne fonctionnera pas car le presse-papier n'a pas la capacité d'ajouter un nouveau contenu. Nous utilisons donc ici un registre vim normal pour stocker toutes les lignes contenant le motif à la fois et ensuite le mettre sur le presse-papiers.

OBS: Il est nécessaire de nettoyer le registre avant de l'utiliser et l'utilisation de la version UPPERCASE du registre nous permet d'ajouter du contenu, sinon il ne fonctionnera pas non plus.

SergioAraujo
la source
0

Si vous ne savez pas comment vous rendre +clipboardau travail, ce que je ne pouvais pas pour une raison quelconque, vous pouvez le faire.

En supposant que vous souhaitiez uniquement copier une section du fichier, je shift+ vpasse en mode visuel et ne met en évidence que les lignes que je souhaite copier. Alors je fais ça.

# Linux Wayland
:'<,'>w !wl-copy

# Linux Xorg
:'<,'>w !xclip -selection clipboard

Explication

  • '<,'> - signifie que vous avez utilisé le mode visuel pour sélectionner une plage (vous ne tapez pas ceci)
  • w !{cmd}- écrivez la plage au stdin de cmd, voyez plus à:help w_c
  • wl-copyet xclipsont des programmes que vous pouvez diriger du texte vers et ils vont l'ajouter à votre presse-papiers système

En outre, une fois que cela est dans votre histoire, vous n'avez pas à taper à nouveau le tout. Il suffit de sélectionner avec le mode visuel, tapez wpuis appuyez sur et la commande doit compléter automatiquement. De plus, vous n’avez pas à utiliser le mode visuel. Vous pouvez définir ce que vous voulez.

425nesp
la source