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 manière typique de remplacer le mot à la position actuelle du curseur: cw<text><esc>
mais y a-t-il un moyen de le faire avec le contenu du registre sans nom comme texte de remplacement et sans écraser le registre?
110
12yl
de tirer 12 caractères et"_cw^r0
de remplacer un mot. J'ai ensuite pu utiliser la.
commande pour répéter le remplacement dans tout le fichier.Réponses:
Je pense que par "coller" vous entendez le registre sans nom (yank / put / change / delete / substitute), non? (Puisque c'est celui qui serait écrasé par la commande de changement.)
Les registres sont généralement spécifiés en tapant
"
ensuite le nom (caractère unique) du registre, comme"ay
ensuite"ap
pour yanker dans le registrea
, puis mettre le contenu du registrea
. Il en va de même pour une commande de changement. Dans ce cas, si vous ne voulez pas le texte que vous supprimez la commande de changement pour aller n'importe où, vous pouvez utiliser le registre de trou noir"_
:"_cw
. Puis une fois en mode insertion, vous pouvez appuyer sur ctrl-R suivi du registre que vous voulez (probablement"
) mettre dans le contenu de ce registre."*
- registre de sélection (pâte du bouton central)"+
- registre du presse-papiers (probablement également accessible avec ctrl-shift-v via le terminal)""
- registre par défaut (sans nom) de vim 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 mis votre texte dans le registre par défaut. Cependant, vous ne pensez pas toujours à cela en premier, il est donc agréable de faire une seule commande de changement sans l'effacer. Bien que ce ne soit pas totalement époustouflé. Il y a les registres numérotés à
"0
travers"9
:la source
:help registers
.En utilisant les informations de cet article, j'ai formé cette cartographie utile. J'ai choisi «cp» car cela signifie «modifier la pâte»
nmap <silent> cp "_cw<C-R>"<Esc>
ÉDITER:
J'ai également poussé cela plus loin et soutenu toute motion.
Pour obtenir l'équivalent de la commande ci-dessus, ce serait
cpw
pour "modifier le mot coller"la source
nmap <silent> cp :let g:currentRegister=v:register<cr>:set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c".getreg(g:currentRegister) endfunction
Vous pouvez utiliser le mode visuel de vim pour cela. par exemple, copiez un mot:
ye
puis écrasez-en un autre avec le mot copié:vep
la source
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 etp
remet le contenu du registre à sa place.En pratique, lorsque j'ai besoin de remplacer un mot (nom de fonction, etc.) par un autre, je passe à celui à utiliser en remplacement,
yiw
pour extraire le mot interne du registre sans nom, puis passer au mot I ' m le remplacer etviwp
le remplacer. Moyen assez rapide de remplacer un mot par un autre. Si vous avez recherché (/
) le mot que vous remplacez pour y accéder, vous pouvez simplement appuyer surn
pour accéder à l'occurrence suivante que vous devez remplacer. Évidemment, pas de substitut à l'utilisation:%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.la source
Si vous utilisez un registre nommé (c.-à-d. Utilisez
"ay
ou"ad
, etc., pour remplir votre registre de collage), vous pouvez faire quelque chose commecw<CTRL-R>a<esc>
Ce qui remplacera le mot par le contenu du registre
a
. Pour autant que je sache, vous ne pouvez pas utiliser le registre par défaut, carcw
il sera rempli avec le mot coupé par cette commande.la source
Voulez-vous dire le tampon de collage système ou le registre vi?
Si vous souhaitez utiliser le tampon de collage système, vous êtes bien et pouvez le faire
dw"+P
-"
choisit un registre et"+
est le tampon de collage système.Sinon, copiez dans le registre non par défaut avec dire
"ay
pour copier dans le registrea
, puis pour remplacer quelque chose fairedw"aP
la source
dw
supprime les espaces de fin après ce que je considérerais comme le «mot», alors quecw
ne change que le mot. Pour cette raison,dw
ne fonctionnera pas pour moi.de
devrait fonctionner pour vous - il supprimera à la fin de ce mot, tandis quedw
supprimera au début du mot suivant.Vous pouvez utiliser
yw
pour extraire le mot, puis vous pouvez changer le mot avec le mot tiré parvipw
pour extraire le mot et coller le mot précédemment retiré.la source
Vous pouvez utiliser des registres pour cela:
texte de remplacement de la première place dans le registre
<mark some text>"ay
où
a
est le nom du registrealors vous pouvez utiliser ce registre en remplacement
ve"ap
la source
.
, ce qui est une autre chose que je voulais faire. Merci quand même. Très appréciée.Ou vous pouvez faire Shift+ v- p(sélectionnez la ligne entière et collez à sa place)
la source