Dans vim, j'ai parfois l'occasion de remplacer les premières occurrences d'un match sur une ligne, mais pas tout le monde le g
voudrait. par exemple:
a a a a a
à
b b b a a
Je sais que je pourrais utiliser :s/a/b/[enter]:[up][enter]:[up][enter]
, mais c'est assez fastidieux à trois répétitions, j'ai des lignes avec potentiellement plus de 10 substitutions.
J'ai essayé:
:s/a/b/3g
: vim s'est plaint de caractères de fin.:s/a/b/3
: modifie la première occurrence sur cette ligne et les deux lignes suivantes.3:s/a/b
: identique à la précédente.:s/a/b/g3
: change toutes les occurrences sur cette ligne et les deux suivantes.:3s/a/b
: modifie la première occurrence sur la ligne 3.:/a/,3/a/s/a/b
: change la première occurrence sur chaque ligne entre la suivantea
et la troisième ligne contenanta
dans le fichier (invite à inverser si nécessaire).:/a/,/\([^a]*a\)\{3\}/s/a/b/
: modifie la première occurrence sur chaque ligne entre celle-ci et la suivante avec 3a
s dessus (et cela n'aurait pas été facilement extensible à une recherche à plusieurs caractères).
Et divers autres modèles d'adressage, dont aucun n'a fonctionné. Je dois dire que j'ai beaucoup appris sur la :s
commande essayant de trouver une réponse à ce problème, mais je ne l'ai toujours pas résolu.
Quelqu'un sait-il comment faire ça?
(points bonus pour une plage spécifique, par exemple de la deuxième à la quatrième occurrence)
n
et.
, même si je ne pensais pas les utiliser ici. Certainement une amélioration, merci.s/a/=something/
devrait faire l'affaire (:help sub-replace-=
). Je ne parle pas assez bien à Vim pour écriresomething
dès le départ.:[up][enter]
peut être remplacé par&
, ce qui n'est toujours pas idéal mais au moins est moins douloureux.Réponses:
En s'appuyant sur l'
:s/pattern/replacement/gc
idée de Samus_ (qui semble être le moyen le plus simple d'assurer un fonctionnement correct lorsque le modèle est contenu dans la chaîne de remplacement), pour remplacer les 2e à 4e occurrences sur une seule ligne:feedkeys()
est une fonction qui place la chaîne d'entrée dans la file d'attente d'entrée du clavier. Le but est de faire le décompte à l'avance afin de ne pas avoir à vous soucier de perdre le décompte ou d'être interrompu.Pour un cas plus général, pour remplacer les Mth à Nth occurrences sur une seule ligne pour N supérieur ou égal à un très grand M :
Remplacez M et N par les valeurs que vous voulez (vous pouvez même laisser
vim
faire l'arithmétique mentale triviale si vous ne voulez pas le faire vous-même). Notez qu'il.
s'agit de l'opérateur de concaténation de chaînes de VimL. Évidemment , cela ne sauve que les frappes de grande M . Si vous utilisez fréquemment cette fonctionnalité, cela peut vous faire gagner du temps pour mettre ce qui précède dans une commande ou une fonction personnalisée, car elle est assez longue à taper.la source
Pour la première question que je ferais:
La seconde est plus délicate, je ne sais pas comment le faire automatiquement mais vous pouvez faire en sorte que vim vous invite à chaque match comme ceci:
Ensuite, vous répondez «non» aux n premières correspondances et «oui» aux autres.
la source
c
, cela pourrait être la meilleure solution proposée à ce jour. Je devrais toujours compter, mais je pense que c'est la première option qui fonctionnerait avec les remplacements qui contiennent la chaîne de recherche.la source
Je pense que cela pourrait fonctionner, remplacez d'abord, puis répétez 2 fois:
la source