Regexp Vim

Le
Rémi Moyen
Bonjour,

Je cherche comment crire une regexp sous Vim pour reformater un bout
de code source et je n'arrive pas trop m'en sortir. J'ai mis un x-
post sur fco.unix parce que je sais que pas mal d'habitus y trainent,
mais le suivi est sur fca.editeurs-de-texte.

J'ai un fichier de code source en C++, o les noms de fonction sont du
type Classe::nomDeFonction() et je veux le reformater en
Classe::nom_de_fonction(). Il se trouve que les fonctions de cette
classe ne sont presque pas appeles par la classe elle-mme, donc je
n'ai me proccuper (dans ce fichier du moins) que des enttes de
fonction, pas des appels.

Pour identifier ces lignes, je peux faire une recherche comme a (j'ai
rajout des espaces pour rendre les choses lisibles, mais je ne les
mets videmment pas en vrai) :
/:: ([a-z]+) ( ([A-Z]) ([a-z]+) ) (
Je cherche :: suivi d'un mot en minuscule puis de au moins un mot
commenant par une majuscule suivi de minuscules, et enfin une
parenthse ouvrante.

Bon, je pourrais utiliser des trucs plus gnriques que [a-z] mais
dans mon cas, j'ai que des lettres dans les noms, donc a marche trs
bien. De toute faon, a n'est pas la recherche qui me pose problme.

Par contre, pour le remplacement, je sche un peu sur l'aspect
groupements imbriqus. Je ne sais pas comment rcuprer tous les bloc=
s
de ( ([A-Z]) ([a-z]+) )+ : 1 contient tout le bloc externe
(le dernier mot), 2 contient la dernire majuscule, 3 les minuscules
du dernier mot, mais comment faire pour avoir les autres mots ?

J'ai bidouill en plusieurs tapes, en considrant d'abord que je n'a=
i
qu'un seul mot remplacer (::parExemple() devenant ::par_exemple()) :
:.s/::([a-z]+)([A-Z])([a-z]+)(/::1_l23(/g
Puis en prenant deux mots remplacer :
:.s/::([a-z]+)([A-Z])([a-z]+)([A-Z])([a-z]+)(/::1_l23_
l45(/g
etc.

Comme dans mon cas je ne vais pas au del de 3 mots, a n'a pas t
trop compliqu, mais je suis un peu vex de ne pas avoir trouv
comment faire une expression unique.

Est-ce que quelqu'un une ide de comment j'aurais pu faire mon
remplacement en une seule fois ?

Merci !
--
Rmi Moyen
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Rémi Moyen
Le #22666661
On Oct 11, 11:58 am, Rémi Moyen
Pour identifier ces lignes, je peux faire une recherche comme ça (j'ai
rajouté des espaces pour rendre les choses lisibles, mais je ne les
mets évidemment pas en vrai) :
/::    ([a-z]+)    (  ([A-Z])    ([a-z]+)  )    (



Évidemment, j'ai réussi à me planter dans mes copier/coller de mon
historique de vi... Il manque un + à la fin (sinon ça ne marche que
si il y a une seule majuscule dans le nom). J'aurais dû mettre :
/::    ([a-z]+)    (  ([A-Z])    ([a-z]+)  )+    (

Ça ne change rien au reste de ma question. Désolé pour l'erreur...
--
Rémi Moyen
Publicité
Poster une réponse
Anonyme