J'ai un fichier avec une ligne qui ressemble à ceci:
foofoo.xy.barbar
Je veux changer le xy
en gh
. J'ai essayé de faire 2r-> gh, mais évidemment cela n'a pas fonctionné, car il a remplacé le xy
avec gg
puis a déplacé mon curseur d'un endroit vers la gauche.
Existe-t-il un moyen de le faire sans entrer en mode d'insertion, ou sans utiliser beaucoup plus de touches (par exemple :s/xy/gh/)?
replace
repeated-commands
durron597
la source
la source
R
entre en mode de remplacement.:help replace-mode
pour plus d'informations.vt.rgh
. Mais le résultat était le même que le vôtre, sauf pour la position du curseur.cwgh<esc>
marcherait bien.minimize-keystrokes
une bonne étiquette, il est généralement pas vraiment ce que la question est à propos , en tant que telle. (J'ai rejeté vos modifications proposées) ... Peut-être que vous devriez discuter à la méta?Réponses:
Si le nouveau texte est de la même longueur que l'ancien texte, le mode de remplacement de Vim est une option. Du mode normal, R(c'est un "r" majuscule) vous amène en mode de remplacement. Ceci est similaire à "écraser" dans certains autres éditeurs de texte: au lieu d'insérer de nouveaux caractères comme en mode insertion, la frappe remplacera le caractère sous le curseur, puis passera au curseur suivant. (Pensez-y comme en minuscules
r
, mais pour plus qu'un simple caractère à la fois.) Trouvez la documentation pour le mode de remplacement avec:help replace-mode
.Dans votre cas: avec le curseur entre le
.
et lex
, accédez au mode de remplacement en appuyant sur R. Maintenant, lorsque vous tapez, gil remplace le "x" et passe au caractère suivant, vous pouvez donc taper hpour remplacer le "y". Votre édition est maintenant terminée, donc Escapepour revenir au mode normal.(Cela fonctionne lorsque votre texte de remplacement est de la même longueur que l'ancien texte, mais si votre remplacement est plus long ou plus court, il
c
peut être tout ce dont vous avez besoin: il remplacera 1 le texte dans un mouvement, par le texte que vous tapez ensuite. Il y a plusieurs façons de faire usagec
, par exemple: avec le curseur entre le.
etx
, ct.ABC
Escapedit c hangement le texte (jusqu'à ' t il le prochain.
) avec « ABC »).1 Il tirera le texte du mouvement dans le nom /
"
registre , puis passera en mode insertion, de sorte que vous puissiez taper quelque chose pour le remplacer, puis Escaperevenir en mode normal.la source
n
pour remplacer jusqu'à lan
-ème occurrence du personnage cible. Ceci est utile pour remplacer des parties d'étiquettes par le formatw_x_y_z
eta-b-c-d
. Utilisezf
au lieu det
pour supprimer également le caractère limitant.Il y a plusieurs façons de le faire, mais la plus simple à laquelle je peux penser est:
TL; DR
fxcw<REPLACEMENT TEXT>
Explication
fx
vous saute sur le x (voirhelp *f*
)cw
dit de changer le mot (voir:h *c*
,,:help *w*
et:help cw
pour plus d'informations), en supprimant le texte "xy" et en passant en mode insertion, vous permettant de mettre ce que vous voulez là.Un avantage de cette approche est qu'elle utilise des commandes de manipulation de texte et de navigation très utilisées. Un autre est que "xy" pourrait être de n'importe quelle longueur, et cela fonctionnerait toujours.
Cela
cw
fonctionne parce que votre objet texte est entouré de points (.
), qui agissent comme une limite au mot.Si votre curseur est déjà sur le caractère "y" (ou n'importe quel caractère dans le texte à remplacer), vous pouvez utiliser
ciw<REPLACEMENT TEXT>
. Cela indique à vim de changer le mot dans lequel vous vous trouvez, même si vous n'en êtes pas au début. Voir:help text-objects
pour plus d'informationsciw
et les objets texte en général.la source
Mode de remplacement:
est la solution la plus évidente si le remplacement est de la même longueur que l'original mais vous pouvez également faire:
ou:
la source