68 votes

Comment remplacer-coller du texte arraché dans vim sans arracher les lignes supprimées ?

Je me retrouve donc généralement à copier du texte d'un point à un autre tout en écrasant l'ancien texte là où le nouveau est collé :

blah1
newtext
blah2
wrong1
blah3
wrong2
blah4

Supposons que je marque visuellement newtext y y ank it. Maintenant, je sélectionne wrong1 (qui peut être n'importe quoi, pas nécessairement un mot) et p aste le newtext . Cependant, si je fais maintenant la même chose avec wrong2 il sera remplacé par wrong1 au lieu de newtext .

Comment éviter que le texte qui se trouve dans la mémoire tampon ne soit échangé avec le texte que je suis en train d'écraser ?

Edit 1

Bien que j'aime beaucoup les suggestions de registres (je pense que je vais commencer à utiliser les registres plus souvent, maintenant que j'ai découvert l'option :dis ), j'opte pour une modification de la commande jinfield Je n'ai pas répondu à cette question, car je n'utilise pas le mode de permutation.

vnoremap p "0p
vnoremap P "0P
vnoremap y "0y
vnoremap d "0d

fait parfaitement l'affaire.

Edit 2

J'étais trop rapide ; romainl La solution de l'entreprise est précisément ce que je cherchais, sans le piratage de l'internet. Edit 1 .
En fait, vnoremap p "_dP est suffisant !
Donc, changement de réponse accepté.

42voto

Craig McQueen Points 13194

J'ai ces mappings dans mon .vimrc :

" delete without yanking
nnoremap <leader>d "_d
vnoremap <leader>d "_d

" replace currently selected text with default register
" without yanking it
vnoremap <leader>p "_dP

"_ est le "registre des trous noirs", selon :help "_ :

" Lorsqu'on écrit dans ce registre, rien ne se passe. Ceci peut être utilisé pour supprimer du texte sans affecter les registres normaux. Lors de la lecture de ce registre, rien n'est renvoyé. {pas dans Vi}"

17voto

Tradsud Points 453

En plus du tampon standard, vous pouvez transférer du texte dans des tampons nommés, et ensuite l'insérer à partir de ces tampons nommés. Il y a jusqu'à 26 tampons nommés que vous pouvez utiliser (un pour chaque lettre). Utilisez des guillemets et une lettre pour accéder à un tampon nommé. Exemples :

"dyy - Déposer la ligne actuelle dans la mémoire tampon d.
"a7yy - Extraire les sept lignes suivantes dans le tampon a.
"dP - Mettre le contenu de la mémoire tampon d devant le curseur.
"ap - Mettre le contenu du tampon a après le curseur

Un autre truc sympa, si vous utilisez une majuscule au lieu d'une minuscule, par exemple "Dyy la ligne courante sera ajoutée à la mémoire tampon au lieu de la remplacer. Plus de détails dans le livre de O`Reilly : http://docstore.mik.ua/orelly/unix/vi/ch04_03.htm

9voto

jinfield Points 431

Lorsque vous utilisez put en mode visuel, le texte que vous remplacez, wrong1 est écrasé par le contenu du registre "sans nom".

Cela fonctionne en fait en "plaçant" le registre après la sélection, puis en supprimant la sélection. Le problème est que cette suppression est maintenant stockée dans le registre unnamed et sera utilisé pour le prochain put action.

La solution, selon :h v_p est de brancher dans un registre nommé, tel que "0y puis coller en utilisant "0p autant de fois que nécessaire. Il peut être utile de cartographier <leader>y y <leader>p d'utiliser un registre nommé, si c'est quelque chose que vous faites fréquemment.

:map <leader>y "0y
:map <leader>p "0p

pour plus d'aide, voir :

:help v_p
:help map

5voto

Unnati Gutpa Points 11

Lorsque vous tirez le texte dans le registre sans nom*, une copie est également placée dans le registre 0. Chaque fois que vous remplacez le texte sélectionné, vous pouvez simplement coller à partir du registre 0. Voir

:help registers

En outre, si vous remplacez un certain nombre de mots par le même mot, vous pouvez simplement vous déplacer au début du mot à remplacer et taper . . Cela répétera la dernière opération d'édition. Voir

:help single-repeat

* Les emplacements de stockage dans lesquels vous entrez et sortez sont appelés registres. Un tampon est la chose que vous éditez, généralement une copie d'un fichier à partir du disque.

5voto

optus Points 185

Collage à partir de "0 Le registre est important à connaître, mais vous voulez souvent le remplacer plusieurs fois. Si vous en faites une action répétable, vous pouvez utiliser la fonction . opérateur, comme l'a mentionné garyjohn. C'est expliqué sur le wiki de vim :

yiw     yank inner word (copy word under cursor, say "first". Same as above).
...     Move the cursor to another word (say "second").
ciw<C-r>0   select "second", then replace it with "first" If you are at the start of the word then cw<C-r>0 is sufficient.
...     Move the cursor to another word (say "third").
.   select "third", then replace it with "first".

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X