web-dev-qa-db-fra.com

VIM Remplacer Word par le contenu du tampon de collage?

J'ai besoin de faire un tas de remplacements Word dans un fichier et je veux le faire avec une commande vi, pas une commande EX telle que :%s///g. Je sais que c'est la façon typique de remplacer le mot à la position actuelle du curseur: cw<text><esc> mais existe-t-il un moyen de le faire avec le contenu du registre sans nom comme texte de remplacement et sans écraser le registre?

108
plong

Je pense que par "coller" vous voulez dire le registre sans nom (yank/put/change/delete/substitute), non? (Puisque c'est celui qui serait écrasé par la commande change.)

Les registres sont généralement spécifiés en tapant " puis le nom (caractère unique) du registre, comme "ay puis "ap pour extraire dans le registre a, puis mettre le contenu du registre a. Il en va de même pour une commande de changement. Dans ce cas, si vous ne voulez pas que le texte que vous supprimez avec la commande change, vous pouvez utiliser le registre des trous noirs "_: "_cw. Ensuite, une fois en mode insertion, vous pouvez appuyer sur ctrl-R suivi du registre souhaité (probablement ") pour mettre le contenu de ce registre.

  • "* - registre de sélection (coller du bouton central)
  • "+ - registre du presse-papiers (probablement aussi accessible avec ctrl-shift-v via le terminal)
  • "" - le registre par défaut (sans nom) de vim yank/put/change/delete/substitute register.

Réponse courte: "_cw^R"

Edit: comme d'autres le suggèrent, vous pouvez bien sûr utiliser un registre différent pour le coup sec (ou autre) qui a placé votre texte dans le registre par défaut. Vous ne pensez pas toujours à cela en premier, cependant, il est donc agréable de faire une seule commande de changement sans la souffler. Bien que ce ne soit pas totalement époustouflé. Il y a les registres numérotés "0 à travers "9:

Vim remplit ces registres avec le texte des commandes yank et delete.

Le registre numéroté 0 contient le texte de la commande yank la plus récente, sauf si la commande a spécifié un autre registre avec ["x].

Le registre numéroté 1 contient le texte supprimé par la commande de suppression ou de modification la plus récente, sauf si la commande a spécifié un autre registre ou si le texte est inférieur à une ligne (le petit registre de suppression est alors utilisé). Une exception est faite pour l'opérateur de suppression avec ces commandes de mouvement: %, (, ), `, /, ?, n, N, { et }. Le registre "1 est alors toujours utilisé (il est compatible Vi). Le registre" - est également utilisé si la suppression se trouve dans une ligne.

À chaque suppression ou modification successive, Vim décale le contenu précédent du registre 1 dans le registre 2, 2 en 3, etc., perdant ainsi le contenu précédent du registre 9.

122
Cascabel

En utilisant les informations de ce post, j'ai formé cette cartographie utile. J'ai choisi 'cp' car cela signifie "changer de pâte"

nmap <silent> cp "_cw<C-R>"<Esc>

MODIFIER:

Je suis également allé plus loin et j'ai appuyé toute motion.

Pour obtenir l'équivalent de la commande ci-dessus, ce serait cpw pour "changer coller Word"

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>g@
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction
47
ostler.c

Vous pouvez utiliser le mode visuel de vim pour cela. par exemple. copier un mot: ye puis en écraser un autre avec le mot copié: vep

27
Ste

Si votre curseur se trouve sur le mot que vous souhaitez remplacer par le contenu du registre sans nom, vous pouvez utiliser viwp. v passe en mode visuel, iw sélectionne le mot intérieur et p place le contenu du registre à sa place.

En pratique, lorsque je dois remplacer un mot (nom de fonction, etc.) par un autre, je vais passer à celui à utiliser comme remplacement, yiw pour placer le mot intérieur dans le registre sans nom, puis passez au mot que je remplace et viwp pour le remplacer. Un moyen assez rapide de remplacer un mot par un autre. Si vous avez recherché (/) pour le mot que vous remplacez pour y accéder, vous pouvez simplement appuyer sur n pour accéder à l'occurrence suivante que vous devez remplacer. Évidemment, rien ne remplace l'utilisation de :%s/find/replace/g, mais pour quelques substitutions rapides, cela peut être pratique, surtout si vous avez déjà le nouveau mot dans un registre.

21
Travis Northcutt

Si vous utilisez un registre nommé (par exemple, utilisez "ay ou "ad, etc., pour remplir votre registre de pâte), vous pouvez faire quelque chose comme

cw<CTRL-R>a<esc>

Ce qui remplacera le Word par le contenu du registre a. Pour autant que je sache, vous ne pouvez pas utiliser le registre par défaut car lorsque vous cw il sera rempli avec le mot qui a été coupé par cette commande.

5
Daniel Vandersluis

Voulez-vous dire le tampon de collage du système ou le registre vi?

Si vous voulez utiliser le tampon de collage du système, alors tout va bien et vous pourriez faire dw"+P - " choisit un registre et "+ est le tampon de collage du système.

Sinon, copiez dans le registre non par défaut avec say "ay pour copier dans le registre a puis pour remplacer quelque chose, faites dw"aP

2
Hamish Downer

Vous pouvez utiliser yw pour extraire le mot, puis vous pouvez changer le mot avec le mot extrait par vipw pour extraire Word et coller le mot précédemment extrait.

1
YevgenyYork

Ou vous pourriez faire Shift+v-p (sélectionnez toute la ligne et collez à sa place)

0
elimirks

Vous pouvez utiliser des registres pour cela:

placez le texte de remplacement dans le registre <mark some text>"ay

a est le nom du registre

alors vous pouvez utiliser ce registre en remplacement

ve"ap

0
lollinus