VIM Remplacez le mot par le contenu du tampon de collage?

Je dois faire un tas de remplacements de mots 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 manière typique de remplacer le mot à la position actuelle du curseur: cw mais existe-t-il un moyen de le faire avec le contenu du registre non nommé comme texte de remplacement et sans écraser le registre?

Je pense par “coller” vous voulez dire le registre sans nom (yank / put / changer / supprimer / remplacer), non? (Comme c’est celui qui serait écrasé par la commande de modification.)

Les registres sont généralement spécifiés en tapant " puis le nom (caractère unique) du registre, comme "ay then "ap pour y entrer dans le registre, puis mettre le contenu du registre a . Même chose pour une commande change. Dans ce cas, si vous ne voulez pas que le texte que vous supprimez avec la commande change pour aller n’importe où, vous pouvez utiliser le registre de trous noirs "_ : "_cw . Une fois en mode insertion, vous pouvez "_cw -R suivi du registre souhaité (probablement " ) à mettre dans le contenu de ce registre.

  • "* – registre de sélection (pâte bouton moyenne)
  • "+ – registre de presse-papiers (probablement aussi accessible avec ctrl-shift-v via le terminal)
  • "" – registre de vim par défaut (sans nom), yank / put / change / delete / substitute.

Réponse courte: "_cw^R"

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

Vim remplit ces registres avec du texte à partir des commandes yank et delete.

Le registre numéroté 0 contient le texte de la commande yank la plus récente, à moins que la commande ne spécifie un autre registre avec [“x].

Le registre numéroté 1 contient le texte supprimé par la dernière commande de suppression ou de modification, sauf si la commande spécifie un autre registre ou que 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 } . Register “1 est toujours utilisé alors (ceci est compatible Vi). Le registre” est également utilisé si la suppression est dans une ligne.

A chaque suppression ou modification successive, Vim déplace le contenu précédent du registre 1 dans le registre 2, 2 en 3, et ainsi de suite, perdant le contenu précédent du registre 9.

En utilisant les informations de cet article, j’ai formé cette cartographie utile. J’ai choisi ‘cp’ car il signifie «change coller»

nmap cp "_cw"

MODIFIER:

J’ai également pris ceci plus loin et soutenu n’importe quelle motion.

Pour obtenir l’équivalent de la commande ci-dessus, cpw pour “changer le mot de cpw

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

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

Si votre curseur est 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 interne et p place le contenu du registre à sa place.

En pratique, lorsque je dois remplacer un mot (nom de la fonction, etc.) par un autre, je vais passer à celui qui sera utilisé en remplacement, yiw pour yiw le mot interne dans le registre sans nom, puis passer au mot I viwp remplace, et viwp pour le remplacer. Moyen assez rapide de substituer un mot à un autre. Si vous avez recherché ( / ) le mot que vous remplacez pour y accéder, vous pouvez simplement appuyer sur n pour accéder à la prochaine occurrence 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.

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

cwa

Qui remplacera le mot par le contenu du registre a . Autant que je cw , 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.

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, vous êtes bien et pouvez faire dw"+P" choisit un registre, et "+ est le tampon de collage du système.

Sinon, copiez dans le registre autre que celui par défaut en disant "ay à copier dans le registre a et ensuite à remplacer quelque chose dw"aP

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

Vous pouvez utiliser des registres pour cela:

placez d’abord le texte de remplacement dans le registre "ay

où est un nom de registre

alors vous pouvez utiliser ce registre en remplacement

ve"ap

Ou vous pouvez faire Shift + vp (sélectionner la ligne entière et coller à sa place)