Comment remplacer plusieurs caractères sans entrer en mode insertion

12

J'ai un fichier avec une ligne qui ressemble à ceci:

foofoo.xy.barbar

Je veux changer le xyen gh. J'ai essayé de faire 2r-> gh, mais évidemment cela n'a pas fonctionné, car il a remplacé le xyavec ggpuis 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/)?

durron597
la source
2
Rentre en mode de remplacement. :help replace-modepour plus d'informations.
alxndr
J'ai essayé vt.rgh. Mais le résultat était le même que le vôtre, sauf pour la position du curseur.
Gonçalo Ribeiro
2
Pourquoi ne voulez-vous pas entrer en mode insertion? Quelque chose comme ça cwgh<esc>marcherait bien.
Poignée de porte
1
@ durron597 Je ne sais pas si minimize-keystrokesune 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?
Martin Tournoij

Réponses:

19

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 le x, 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 cpeut ê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 usage c, par exemple: avec le curseur entre le .et x, ct.ABCEscapedit 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.

alxndr
la source
2
Cela fonctionne pour ce cas. Et si vous vouliez remplacer ces 2 caractères par, disons, 3 caractères?
Gonçalo Ribeiro
1
Bonne question; modifié pour inclure un moyen de gérer le texte de longueur différente.
alxndr
Ouais, je sais de cette façon. Mais de cette façon, vous entrez en mode Insertion et j'étais curieux de voir s'il y avait un moyen de ne pas utiliser le mode Insertion dans ce cas. Non pas que je pense que c'est très utile (et pourtant je peux me tromper).
Gonçalo Ribeiro
1
Préfixez avec un chiffre npour remplacer jusqu'à la n-ème occurrence du personnage cible. Ceci est utile pour remplacer des parties d'étiquettes par le format w_x_y_zet a-b-c-d. Utilisez fau lieu de tpour supprimer également le caractère limitant.
pkfm
5

Il y a plusieurs façons de le faire, mais la plus simple à laquelle je peux penser est:

TL; DR

fxcw<REPLACEMENT TEXT>

Explication

  • fxvous saute sur le x (voir help *f*)
  • cwdit de changer le mot (voir :h *c*,, :help *w*et :help cwpour plus d'informations), en supprimant le texte "xy" et en passant en mode insertion, vous permettant de mettre ce que vous voulez là.
  • Le <TEXTE DE REMPLACEMENT> correspond à tout ce que vous souhaitez remplacer par - "gh" dans votre exemple.

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 cwfonctionne 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-objectspour plus d'informations ciwet les objets texte en général.

Cody Poll
la source
cela ne le placera-t-il pas en mode insertion?
elyashiv
1
Ah - n'a pas saisi cette partie de sa question. Dans ce cas, oui - R est la solution la plus appropriée.
Cody Poll
3

Mode de remplacement:

Rgh<Esc>

est la solution la plus évidente si le remplacement est de la même longueur que l'original mais vous pouvez également faire:

2sgh<Esc>

ou:

cegh<Esc>
romainl
la source