2010-10-28 15 views

Répondre

7

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 \< 
+0

Le 'r \ @<' 'devrait juste être r \ @', et félicitations sur le badge vim d'argent!! –

+0

Ah oui, bon spot: je vais le corriger (et merci pour les félicitations!) – DrAl

0

Que diriez-vous ce one-liner

%s/\.a/*b*/g | %s/\.b/*c*/g | %s/\.c/*a*/g | %s/\*a\*/.a/g | %s/\*b\*/.b/g | %s/\*c\*/.c/g 
0

Rechercher: z\.(a)(2)=cross\(z\.(b), (z\.c)\)\(z\.b(1), (z\.c1)\);

Remplacer par: z.$3$2=cross($4, z.$1)($6, z.$1$5);