Copiez toutes les lignes dans le presse-papiers

565

Existe-t-il un moyen de copier toutes les lignes du fichier ouvert dans le presse-papiers dans l'éditeur de VI. J'ai essayé yGmais il n'utilise pas le presse-papiers pour stocker ces lignes.

Est-ce donc possible?

Xinus
la source
1
Si vous êtes sous Windows et que yank ne fonctionne pas, consultez la 17e réponse depuis le haut: stackoverflow.com/questions/1620018/…
Noumenon

Réponses:

636

Vous devez extraire le texte des registres* ou :+

gg"*yG

Explication:

  • gg pour amener le curseur sur le premier caractère du fichier
  • "*ypour lancer une commande yank dans le registre à *partir de la première ligne, jusqu'à ce que ...
  • G aller à la fin du fichier
CMS
la source
6
Comment marquez-vous le texte pour qu'il ressemble à des clés? Je n'ai pas encore vu ça sur SO.
jergason
10
Bonjour ... cela ne fonctionne pas? Les données du presse-papiers restent inchangées. quand je tape gg, le curseur va à la première ligne ... mais quand je tape "* yG ..cpu émet un bip à * ... alors est-ce normal ou un problème avec mon vim? Je suis sur Ubuntu ..
Xinus
1
Avez-vous activé Deadkeys? (Par exemple, lorsque vous appuyez sur 'a, vous obtenez á) Si c'est le cas, vous devez appuyer sur espace après ".
Tordek
144
Vim ne peut accéder au presse-papiers du système que s'il est compilé avec xterm_clipboard activé. Pour savoir si vous disposez de cette fonctionnalité, exécutez :versiondans vim et recherchez l' +xterm_clipboardindicateur. S'il est précédé d'un signe moins, vous n'aurez pas cette fonctionnalité. Si tel est le cas, vous voudrez peut-être compiler vim vous-même ou exécuter gvim qui a généralement cette fonctionnalité activée.
nelstrom
9
Le problème avec cette approche est qu'elle déplace le curseur et fait défiler la fenêtre. Deux fois. L' autre réponse a beaucoup moins de touches et d' inconvénients :)
sehe
696

Utilisation:

:%y+

pour tirer toutes les lignes.

Explication:

  • % faire référence à la commande suivante pour travailler sur toutes les lignes
  • y pour arracher ces lignes
  • + copier dans le presse-papiers du système

NB : sous Windows, +et *sont équivalents voir cette réponse .

Tour
la source
19
De plus, il ne changera pas l'emplacement du curseur.
nperson325681
1
@guangnan: Ces registres n'existent pas dans vi; uniquement dans vim. Essayez de taper :helppour vous assurer que vous êtes bien dans vim.
Comppicuous Compiler
6
J'en avais besoin set clipboard=unnamed, mais cela a très bien fonctionné!
cdunn2001
235
Vim dit E850: Invalid register name:(
lony
23
Cette solution ne fonctionne que si vim a été compilé avec l'option clipboard (vim --version affichera + clipboard dans ce cas). Sinon, la solution de Brian (:% w! Pbcopy) est une solution pour Mac. Des alternatives sont disponibles pour d'autres systèmes d'exploitation (par exemple xclip).
yaccob
90

sur Mac

  • copier la partie sélectionnée: sélectionner visuellement le texte (taper vou Ven mode normal) et taper:w !pbcopy

  • copier tout le fichier :%w !pbcopy

  • passé du presse-papiers :r !pbpaste

Brian
la source
6
Fonctionne en douceur. Une explication des commandes serait vraiment sympa.
Vlad Manuel Mureșan
5
@Geo pbcopyest un utilitaire Mac. Sous Linux, xselpeut fonctionner à la place ou clipsous Windows.
David Lord
1
Cela ne fonctionnera pas si le fichier est plus long que la hauteur de votre terminal.
Sridhar Sarnobat
1
@SridharSarnobat :%w !pbcopyfonctionne toujours si le fichier est plus long que la hauteur du terminal.
Adrian Schmidt
Oh désolé, je voulais dire sur ssh où le client est un Mac et le serveur est Linux (ce que je supposais être ce que l'OP recherchait mais maintenant que j'y pense, c'est un problème sans rapport). Pour ma défense, j'éviterais vim pour copier et coller des fichiers locaux, mais c'est mon goût personnel. Bons conseils.
Sridhar Sarnobat
56

Le presse-papiers est un tampon +. Pour copier dans le presse-papiers, faites "+yet [mouvement].

Donc, gg"+yGcopiera tout le fichier.

De même, pour coller à partir du presse-papiers, "+p

Tordek
la source
4
Juste pour ajouter à cela (4 ans plus tard ...), cela a un léger inconvénient en ce que la position de votre curseur sautera en haut du fichier. Pour éviter cela (par exemple, si vous mappez ceci à un raccourci dans votre vimrc), vous pouvez faire quelque chose comme: mqgg "+ yG`q
Tom Lord
46

Un autre moyen simple de copier l'intégralité du fichier si vous rencontrez des problèmes avec VI, consiste simplement à taper "cat filename". Il fera écho du fichier à l'écran, puis vous pouvez simplement faire défiler vers le haut et vers le bas et copier / coller.

Zack
la source
1
E603:: attraper sans: essayer
Paul Chris Jones
2
Et si vous voulez faire cela sans quitter vim, vous pouvez exécuter la commande suivante: :!cat %. Et pour copier le contenu du fichier par programme dans le presse-papiers sur Mac OS::!cat % | pbcopy
TanguyP
Nécessaire pour copier le fichier d'Ubuntu VM sur Windows vers Debian dans GCP ouvert dans la fenêtre du navigateur ...: / Les variations de vim yanking n'ont pas fonctionné, cela a fonctionné pour coller sur Windows puis télécharger le fichier sur GCP.
frmbelz
31

Voici ce que je fais pour arracher tout le fichier:

ggVGy
EmilianoGNFNR
la source
12
Je crains que cela ne réponde pas à la question, car vous tirez sur le registre par défaut, pas sur le presse-papiers.
Compilateur remarquable
2
@ConspicuousCompiler, il le ferait s'il avait le clipboardjeu pour copier le texte retiré +.
TankorSmash
@TankorSmash n'est pas la méthode la plus rapide (:% y) ni la plus soignée (au moins ggyG est mieux).
pedroapero
@ConspicuousCompiler quelle est la différence entre le registre par défaut et le presse - papiers ?
nilon
17

Vous pouvez utiliser la commande "cat" pour ouvrir le fichier et utiliser la souris pour copier

Pham Luan
la source
5
Mais ce ne sera pas la façon "vi", si le fichier est énorme, alors ce sera aussi un problème ... Cela pourrait fonctionner mais pas une manière suggérée ...
Aditya
1
resetle terminal au préalable, puis sélectionnez tout et copiez. Cela fonctionne par sshsession.
arcol
Moyen le plus rapide pour les fichiers volumineux (moins de 10 000 lignes) dans différents serveurs distants si xterm_clipboard n'est pas disponible
Matias Haeussler
10

(en réponse à @rshdev, et pour éviter d'avoir à recompiler vim avec + xterm_clipboard par @nelstrom dans les commentaires sur OP)

il y a un programme appelé xclip qui fonctionne comme putclip sur Ubuntu 11:

:%!xclip -sel clip
u

il n'est pas installé par défaut. pour installer, utilisez:

sudo apt-get install xclip
Ragoût
la source
10

Sur Ubuntu 12

vous pouvez essayer d'installer le vim-gnomepackage:

sudo apt-get install vim-gnome

Je l'ai essayé, car il vim --versionm'a dit que le drapeau xterm_clipboard serait désactivé (indiqué par - ), ce qui est nécessaire pour utiliser la fonctionnalité du presse-papiers.

-> l'installation du paquet vim-gnome sur Ubuntu 12 a également installé une version console de vim, qui a cette option activée (indiquée par un + avant l'indicateur xterm_clipboard)

Sur Arch Linux

vous pouvez installer vim-clipboardpour la même raison.

Si vous exécutez neovim, vous devez installer xclip(comme expliqué par help clipboard-tool)

Arch Linux Tux
la source
1
unix.stackexchange.com/questions/25965/… y a-t-il une autre option que quelqu'un connaît?
Sandip Pingle
6

Si vous utilisez Vim en mode visuel, les touches standard de copier-coller s'appliquent également, au moins avec Windows.

  • CTRLA signifie "Marquer le fichier entier.
  • CTRLC signifie "Copier la sélection.
  • ESC signifie "Désélectionner, donc votre prochaine pression de touche ne remplacera pas le fichier entier :-)

Sous le terminal Ubuntu (Gnome) au moins, la copie standard fonctionne également ( CTRLSHIFTC, bien qu'il ne semble pas y avoir de raccourci clavier standard pour select all(autre que ALTEsuivi par A).

paxdiablo
la source
6
Mais si vous n'utilisez pas mswin.vim, alors ctrl-a incrémente le nombre suivant sur la ligne actuelle.
Mark Rushakoff
@Mark, ce comportement provient d'une installation standard de Vim, donc je suppose que c'est la valeur par défaut. Tous les paris sont désactivés si l'environnement est configuré différemment, mais si tel était le cas, je pense que l'OP saurait ce qu'ils font :-) Dans les deux cas, OP a déclaré dans un commentaire qu'ils étaient sur Ubuntu, donc la partie Windows de ma réponse ne s'applique probablement pas. Le truc du terminal Gnome le ferait.
paxdiablo
5

vous pouvez appuyer sur gg pour localiser votre curseur au début du fichier, puis appuyez sur yG pour copier tout le contenu du début à la fin (G situé) dans buffer.good luck!

gameboy90
la source
4

J'ai essayé quelques-unes des commandes que les gens ont mentionnées ci-dessus. Aucun n'a fonctionné. Ensuite, je me suis emparé du plus simple de tous.

Étape 1: vi <filename>
Étape 2: Faites un clic droit sur la barre de titre de la fenêtre Putty
Étape 3: Sélectionnez "Effacer le défilement" (pour éviter de copier le reste de votre session SSH)
Étape 4: Cliquez de nouveau avec le bouton droit et sélectionnez "Copier tout dans le presse-papiers".

Abhinav Deshpande
la source
1
Pour le fichier de 15 000 lignes, cela n'a pas tout saisi. J'avais besoin d'augmenter mon Putty's Window > Settings > lines of scrollbackà 40000 (également disponible en cliquant avec le bouton droit sur la barre de titre). Il est également utile d'utiliser catau lieu de vi, car cela fait défiler tout le texte.
Noumenon du
1
J'ai fini par perdre toujours les lignes du haut et du bas du fichier de cette façon. Ce que je fais maintenant, c'est chat, puis cliquez avec le bouton du milieu au début et à la fin du fichier pour étendre la sélection.
Noumenon
Quand j'ai essayé cela, je n'ai eu que les 111 lignes à l'écran mais il y a 174 lignes dans mon fichier, donc la réponse de chat de Noumenon a fonctionné pour moi
seizethecarp
3

:%y aCopie tout le contenu dans le tampon de vim, en appuyant sur pen mode commande, le contenu copié sera collé après la ligne sur laquelle se trouve votre curseur.

Ma'moon
la source
3

gVim:

:set go=a

ggVG

Voir :help go-a:

'a' Autoselect:  If present, then whenever VISUAL mode is started,
 or the Visual area extended, Vim tries to become the owner of
 the windowing system's global selection.  This means that the
 Visually highlighted text is available for pasting into other
 applications as well as into Vim itself.  When the Visual mode
 ends, possibly due to an operation on the text, or when an
 application wants to paste the selection, the highlighted text
 is automatically yanked into the "* selection register.
 Thus the selection is still available for pasting into other
 applications after the VISUAL mode has ended.
     If not present, then Vim won't become the owner of the
 windowing system's global selection unless explicitly told to
 by a yank or delete operation for the "* register.
 The same applies to the modeless selection.
kev
la source
3

Eh bien, toutes ces approches sont intéressantes, mais en tant que programmeur paresseux, j'utilise yank all line en utilisant une combinaison de nombre + y

par exemple, vous avez un fichier de code source avec un total de 78 lignes, vous pouvez faire comme ci-dessous:

  1. gg pour obtenir le curseur à la première ligne
  2. insérer 78 + y -> il tire 78 lignes sous votre curseur et la ligne actuelle
arfo
la source
2

Il n'y avait pas de concept de "presse-papiers" dans Bill Joy's vi, donc je ne pense pas qu'il y ait une manière intégrée de le faire.

La fonction de copie automatique de tout ce qui est mis en surbrillance dans le presse-papiers de gVim est la plus simple ou utilisez un programme externe via:!

Pour le vim de Cygwin, j'utilise

:%!putclip
u

Peut-être qu'Ubuntu a une application CLI comme putclip ??

rshdev
la source
grande suggestion, merci! il existe un tel programme, appelé xclip. pour plus de détails, j'ai posté une réponse séparée (cela aurait été trop déroutant de lire un commentaire, sans les nouvelles lignes supplémentaires et la mise en forme du code).
Ragoût
2

Si vos doigts par défaut CTRL-A CTRL-C, essayez les mappages depuis $VIMRUNTIME/mswin.vim.

" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y

" CTRL-A is Select all
noremap <C-A> gggH<C-O>G
inoremap <C-A> <C-O>gg<C-O>gH<C-O>G
cnoremap <C-A> <C-C>gggH<C-O>G
onoremap <C-A> <C-C>gggH<C-O>G
snoremap <C-A> <C-C>gggH<C-O>G
xnoremap <C-A> <C-C>ggVG

Je les ai mappés à <Leader><C-a>et <Leader><C-c>.

go2null
la source
2

Copiez tout le fichier à l'intérieur du vim ou de ses onglets

y G 

puis passez à un onglet et collez par

p

et pour couper l'utilisation du fichier entier

d G
Abdul Basit
la source
2

J'ai ajouté la ligne suivante à mon .vimrc

nnoremap <F5> :%y+<CR>

Cela me permet de copier tout le texte de Vim dans le presse-papiers en appuyant sur F5(en mode commande).

aks
la source
1

Voici une commande de carte pour tout sélectionner dans le presse-papiers à l'aide de CTRL+ a:

"
" select all with control-a
"
nnoremap <C-a> ggmqvG"+y'q

Ajoutez-le à votre .vimrc et vous êtes prêt à partir ...

jahroy
la source
1

Je sais que dix ans devraient être réglés, mais les deux premières réponses n'ont pas fonctionné pour moi, alors j'ai continué à creuser. Sur un Redhat (serveur distant) - Windows 10 (machine locale), si vous ne pouvez pas sélectionner le tout avec une souris, vous êtes bloqué car les copies habituelles ne fonctionnent pas entre la télécommande et les presse-papiers de la machine locale.

Donc, pour copier sur le Linux distant et coller sur le Windows local, spécifiez le tampon primaire avec le *et faites un joli double tirage

Utilisez gg" * yy.

Lefty G Balogh
la source
0

J'ai créé une fonction pour effectuer cette action, placez-la sur votre ~/.vimrc.

fun! CopyBufferToClipboard()
    %y+
endfun
nnoremap <Leader>y :call CopyBufferToClipboard()<CR>
command! -nargs=0 CopyFile :call CopyBufferToClipboard()

OBS: Si vous utilisez neovim, vous avez également besoin d'un gestionnaire de presse-papiers comme xclip. pour plus d'informations sur neovim:h checkhealth

Il est également important de mentionner que pas toujours simple ycopie dans le presse papier, afin de faire tous les aliments de copie +Wich est « Presse - papiers Enregistrer » essayer de définir: :set clipboard=unnamed,unnamedplus. Pour mor informations , voir: :h unnamed.

Voici plus d'informations sur vim wikia.

SergioAraujo
la source
0

Vous pouvez utiliser un raccourci, comme celui-ci:

noremap <F6> :%y+<CR>

Cela signifie que lorsque vous appuyez sur F6 en mode normal, il copie l'intégralité du fichier et l'ajoute au presse-papiers. Ou vous pouvez simplement taper en mode normal, :%y+puis appuyer sur Enter.

Nicolas Pardo
la source
-1

Cliquez avec le bouton gauche de la souris, faites glisser sur la section que vous souhaitez copier et libérer. Le code est automatiquement copié dans le presse-papiers.

Kapeel Kokane
la source
3
Le fichier peut être énorme, et faire glisser le texte entier avec une souris n'est pas productif (ni un vimoyen).
Dr Beco
1
En fait, c'est une bonne réponse et ça marche pour moi. Dans mon système, l'environnement est très restrictif. Je dois afficher la sortie sur l'écran, puis utiliser la souris pour faire glisser, sélectionner et relâcher .. puis je copie dans le Bloc-notes Windows ++ .. et fonctionne très bien. Rien d'autre ne fonctionne.
Apurva Singh
-1

Je n'ai pas pu copier les fichiers en utilisant les réponses ci-dessus mais j'ai du mastic et j'ai trouvé une solution de contournement sur Quora.

  1. Modifiez les paramètres de votre session PuTTY, accédez à la journalisation et modifiez-la en "caractères imprimables". Définissez le fichier journal
  2. Faites un chat du fichier respectif
  3. Accédez au fichier que vous avez défini à l'étape 1 et vous aurez votre contenu dans le fichier journal.

Remarque: il copie tous les caractères imprimés de cette session dans le fichier journal, de sorte qu'il deviendra éventuellement grand. Dans ce cas, supprimez le fichier journal et cat le fichier cible afin que le contenu de ce fichier particulier soit copié sur votre ordinateur.

thewhitetulip
la source