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.

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.


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".


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


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à.


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.


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".

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.