Coller plusieurs fois

93

Quelle est la meilleure façon de remplacer plusieurs lignes par le contenu du presse-papiers?

Le problème que j'ai, c'est que lorsque je tire une ligne et la colle sur une autre ligne, le "yank" est remplacé par la ligne que je viens de remplacer. Maintenant, si je veux remplacer une autre ligne par la même ligne, je dois remonter et la retirer à nouveau.

Il doit y avoir une meilleure façon de faire cela.

Jwerre
la source

Réponses:

108

J'ai ceci dans mon .vimrc:

xnoremap p pgvy

(note: cela ne fonctionnera qu'avec le registre par défaut, mais ce mappage est facile à retenir). Ecrire une version plus élaborée serait possible. En outre, vous pouvez toujours utiliser P pour obtenir l'ancien comportement.

Benoit
la source
28
Intelligent. 'p' pour coller, 'gv' pour resélectionner ce qui était initialement sélectionné. 'y' pour le copier à nouveau.
Amjith
@SibbsGambling, utilise probablement une version antérieure à Vim 7? Ensuite, mettez à jour Vim ou utilisez v au lieu de x ( vnoremap). Le fichier d'aide de Vim version7.txtindique que xmap et smap sont apparus dans cette version.
Benoit le
1
@Benoit Hmm, j'ai 7.4.52, mais ni xnoremapni vnoremapfonctionne
Sibbs Gambling
8
Pourquoi n'est-ce pas le comportement par défaut?
Seth
27

"0devrait avoir le contenu de votre yank. C'est un peu plus fastidieux à taper, mais "0pvous devez faire ce que vous voulez.

Sinon, ne sélectionnez pas et ne remplacez pas les anciennes lignes à l'avant. Si vous trouvez ces lignes avec une recherche, appuyez simplement à n.plusieurs reprises (après une initiale p), puis lorsqu'elles sont toutes collées, faites-le nddsuivi d'autant de n.s que nécessaire.

Le plus gros changement mental que j'ai dû faire lors du passage à Vim est de comprendre comment appliquer les modifications de groupe de manière séquentielle. C'est-à-dire que plutôt que de faire un tas de modifications sur une ligne puis de faire un tas des mêmes modifications sur une autre ligne, je ferai le premier montage sur un tas de lignes (en utilisant .à grand effet), puis le deuxième montage sur un tas de lignes, etc. Alternativement, l'utilisation de macros peut aider car elles sont fantastiques, mais parfois un peu plus fastidieuses pour travailler correctement avec des changements "complexes".

dash-tom-bang
la source
2
ressemble à un endroit où l'expression régulière avec :%s/.../.../gcles commandes de confirmation de type pourrait être plus proche de ce que vous voulez
Milimetric
@Milimetric +1 ne savait pas que vous pouviez confirmer comme ça.
1
Vote positif car les macros peuvent faire en sorte que cela ne pose pas de problème. 5@mm
Effectuez
Merci pour une excellente explication. Maintenant, j'utilise xnoremap p "0pdans mon ~ / .vimrc
nexayq
13

J'utilise souvent un autre registre, copiez la ligne dont vous avez besoin dans un registre nommé "ay, puis collez à partir de là"ap

Facundo Casco
la source
11

Lorsque vous collez une sélection dans Vim, il remplacera le registre par défaut par le contenu de la sélection. Si le fait de coller sur une sélection efface le contenu du registre du presse-papiers, il est fort probable que vous ayez la ligne suivante dans votre .vimrc

set clipboard=unnamed

Une option consiste à supprimer cela et à utiliser le registre du presse-papiers explicite "+

Une autre option consiste à utiliser l'un des autres registres explicitement nommés (az). Après la première pâte, retirez la ligne "cpar exemple, puis utilisez "cppour coller à partir de là.

JaredPar
la source
En fait, la valeur par défaut (ici, sur Ubuntu) était clipboard = autoselect; encore, merci pour la réponse la plus élégante à ce jour.
Tobu
8

utilisez npnest le nombre de fois que vous voulez coller les lignes, par exemple 3pcollera 3 lignes.

toopay
la source
7
Ne fonctionne pas lorsque vous souhaitez coller la même ligne sur des lignes non contiguës.
Tobu
@Tobu mais il répond au titre de cette question `` comment coller plusieurs fois ''
icc97
6

Au lieu d'utiliser le copier / coller, il est souvent préférable d'utiliser une commande d'objet texte telle que ciwpour changer le mot interne. Cette méthode a l'avantage d'être facilement répétable à l'aide de la .commande de répétition.

  1. yiw Coupez le mot intérieur (copiez le mot sous le curseur, dites «premier»).
  2. ... Déplacez le curseur sur un autre mot (dites «deuxième»).
  3. ciw<C-r>0 Changez «deuxième», en le remplaçant par «premier» (est Ctrl-R).
  4. ... Déplacez le curseur sur un autre mot (dites «troisième»).
  5. . Remplacez "troisième" par "premier".
jack guan
la source
1
ciw<C-r>0ne fonctionne pas dans mon cas. ciwpasse au mode d'insertion où <C-r>devient inutile. Y a-t-il une explication simple à cela? Cela pourrait-il avoir à voir avec l'éditeur de texte (je n'utilise pas pur VIM mais les liaisons de clavier VIM dans RStudio)
Bushroot
@Bushroot <C-r>est destiné à être utilisé en mode insertion, car c'est la façon dont vous collez à partir d'un registre sans quitter le mode insertion - dans Vim, c'est-à-dire; Je ne suis pas familier avec RStudio mais je suppose que vous avez raison et qu'ils n'ont pas implémenté cette liaison de clé particulière.
insectean
@Sean H: Oui. Ils n'ont pas implémenté la liaison de clé. Cela fonctionne très bien dans VIM et même avec des liaisons VIM dans d'autres programmes (par exemple Visual Studio Code).
Bushroot