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'habitués 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 appelées par la classe elle-même, donc je
n'ai à me préoccuper (dans ce fichier du moins) que des entêtes 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
commençant par une majuscule suivi de minuscules, et enfin une
parenthèse ouvrante.

Bon, je pourrais utiliser des trucs plus génériques que [a-z] mais
dans mon cas, j'ai que des lettres dans les noms, donc ça marche très
bien. De toute façon, ça n'est pas la recherche qui me pose problème.

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

J'ai bidouillé en plusieurs étapes, en considérant 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 idée de comment j'aurais pu faire mon
remplacement en une seule fois ?

Merci !
--
Rémi Moyen
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
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