J'ai besoin de 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 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?VIM Remplacer le mot par le contenu du tampon de collage?
Répondre
Je pense par "coller" vous voulez dire le registre sans nom (yank/put/changer/supprimer/remplacer), non? (Puisque c'est celui qui obtiendriez écrasé par la commande de changement.)
Les registres sont généralement spécifiés en tapant "
alors le nom (caractère unique) du registre, comme "ay
puis "ap
Yank dans le registre a
, puis mettre le contenu du registre a
. Idem pour une commande de changement. 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
. Puis une fois en mode insertion, vous pouvez taper ctrl-R suivi du registre que vous voulez (probablement "
) pour mettre dans le contenu de ce registre.
"*
- registre de sélection (pâte bouton du milieu)"+
- registre de presse-papiers (probablement aussi accessible avec ctrl-shift-v via le terminal)""
- défaut de vim (sans nom) Yank/vente/changer/supprimer/remplacer le registre.
Réponse courte: "_cw^R"
Edit: comme d'autres ce qui suggère, vous pouvez bien sûr utiliser un autre registre pour le coup sec (ou autre) qui a obtenu votre texte dans le registre par défaut. Cependant, vous ne pensez pas toujours à cela, donc c'est bien de faire une seule commande de changement sans la faire disparaître. Bien que ce ne soit pas totalement époustouflé. Il y a les registres numérotés "0
par "9
:
remplit ces registres Vim avec le texte de Yank et supprimer des commandes.
Numéroté registre 0 contient le texte de la plus récente commande de copie, sauf si la commande spécifiée un autre registre avec [ "x].
registre Numéroté 1 contient le texte supprimé par le plus récent supprimer ou modifier la commande, à moins que la commande spécifiée d'un autre registre ou le texte est inférieure à une ligne (le petit registre d'effacement est utilisée alors) Une exception est faite pour l'opérateur de suppression avec ces commandes de mouvement.
%
,(
,)
,`
,/
,?
,n
, ,{
et}
Inscrivez-vous "1 is alw ays utilisé alors (ceci est compatible avec Vi). Le "- registre est également utilisé si la suppression est dans une ligneA chaque suppression ou modification successive, Vim déplace le contenu précédent du registre 1 dans le registre 2, 2 en 3, etc., perdant le précédent. contenu du registre 9.
D'accord, pense que j'ai déjà copié assez de docs sur les registres dans ma réponse? Tout est là sous ': registres d'aide ' – Cascabel
Si vous utilisez un registre nommé (c.-à-d.utiliser "ay
ou "ad
, etc., pour remplir votre registre de pâte), vous pouvez faire quelque chose comme
cw<CTRL-R>a<esc>
qui remplacera le mot avec 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.
Vous pouvez utiliser le registre par défaut! Consultez ma réponse – Cascabel
Vous pouvez utiliser les registres pour que:
premier texte de remplacement dans le registre <mark some text>"ay
où a
est d'enregistrer le nom
vous pouvez ensuite utiliser ce registre en remplacement
ve"ap
Malheureusement, je ne pouvais pas Répétez simplement la dernière opération de collage via '.', ce qui est une autre chose que je voulais faire.Merci, cependant.Merci apprécié – plong
Voulez-vous dire le syst em coller le tampon ou le registre vi?
Si vous souhaitez utiliser le tampon de collage du système, alors vous pouvez le faire et dw"+P
- "
choisit un registre et "+
est le tampon de collage du système.
copie Sinon dans le registre non par défaut avec "ay
dire à copier dans le registre a
puis de remplacer quelque chose faire dw"aP
Merci, Hamish .J'ai essayé, mais 'dw' supprime les espaces de fin après ce que je considère comme le "mot", alors que "cw" ne change que le mot.Pour cette raison, 'dw' ne fonctionnera pas pour moi – plong
Dans ce cas' de' devrait fonctionner pour vous - il va supprimer à la fin de ce mot, tandis que 'dw' va supprimer au début du mot suivant. –
Vous pouvez utiliser le mode visuel de vim pour cela. par exemple. copier un mot: ye
et puis remplacer un autre avec le mot copié: vep
Cela fonctionne, mais il convient également de noter que la pâte visuelle écrase le tampon Yank pour le texte nouvellement supprimé. –
@ ostler.c: 'xnoremap p pgvy' – Benoit
En utilisant les informations dans ce post, j'ai formé cette application utile. J'ai choisi « cp », car il signifie « pâte de changement »
nmap <silent> cp "_cw<C-R>"<Esc>
EDIT:
Je pris aussi un peu plus loin et soutenu tout mouvement.
Pour obtenir l'équivalent de commande ci-dessus, il serait cpw
pour « coller changement mot »
"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>[email protected]
function! ChangePaste(type, ...)
silent exe "normal! `[v`]\"_c"
silent exe "normal! p"
endfunction
Le
Le seul problème avec ceci est que vous ne pouvez pas choisir un registre pour coller avec ... mais dans ce cas, je suppose que vous pourriez juste cw et utiliser CTRL + R –
Il pourrait y avoir une meilleure façon d'ajouter un nom de registre mais ce qui suit fonctionne pour moi: 'nmap
Si votre curseur est sur le mot que vous voulez 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
met le contenu du registre à sa place. En pratique, quand j'ai besoin de remplacer un mot (nom de fonction, etc.) par un autre, je vais passer à celui à utiliser comme remplacement, yiw
pour taper le mot interne sur le registre sans nom, puis déplacer au mot que je 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 arriver à l'occurrence suivante que vous devez remplacer. Évidemment pas de substitut à l'utilisation :%s/find/replace/g
, mais pour quelques substitutions rapides, il peut être pratique, surtout si vous avez déjà le nouveau mot dans un registre.
Je suis surpris que ce soit 't la solution acceptée: tout ce qui précède, bien que plus souple dans certains cas de bord, est beaucoup plus verbeux pour simplement' échanger le registre non identifié actuel pour une sélection quelque part ', ce qui est la situation de l'original asker est venu ici pour. – ELLIOTTCABLE
Vous pouvez utiliser yw
pour taper le mot, alors vous pouvez changer le mot avec le mot saisi par vipw
pour yank mot et coller le mot précédemment tiré.
RÉSOLUTION: Pour mon besoin immédiat, j'ai utilisé 12yl pour 12 caractères et '_cw^r0' pour remplacer un mot, ce qui m'a permis d'utiliser la commande' .' pour répéter le remplacement dans tout le fichier. – plong