Vous pouvez utiliser un dictionnaire:
:let replacements = {'a': 'b', 'b': 'c', 'c': 'a'}
:s/[abc]r\@!/\=replacements[submatch(0)]/g
Le r\@!
empêche la c
de cross
être changé.
Ajoutez un %
devant le s
si vous souhaitez le faire sur l'ensemble du fichier plutôt que sur la ligne en cours. Notez que cela changera TOUT «a», «b» ou «c» sur la ligne, y compris ceux dans les mots (par exemple, le c
dans cross
). Pour restreindre cela, vous pouvez changer le modèle à \<[abc]\>
, mais cela ne correspondrait pas à a2
, ce qui suggère: \<\([abc]\)\d*\>
(et remplacez le submatch(0)
par submatch(1)
.) Si vous voulez simplement faire correspondre le z
précédent, c'est facile:
:let replacements = {'a': 'b', 'b': 'c', 'c': 'a'}
:s/z\.\zs[abc]/\=replacements[submatch(0)]/g
Voir:
:help Dictionary
:help :substitute
:help :s\=
:help \@!
:help \zs
:help \(\)
:help \<
Le 'r \ @<' 'devrait juste être r \ @', et félicitations sur le badge vim d'argent!! –
Ah oui, bon spot: je vais le corriger (et merci pour les félicitations!) – DrAl