Je cherche comment =E9crire une regexp sous Vim pour reformater un bout
de code source et je n'arrive pas trop =E0 m'en sortir. J'ai mis un x-
post sur fco.unix parce que je sais que pas mal d'habitu=E9s y trainent,
mais le suivi est sur fca.editeurs-de-texte.
J'ai un fichier de code source en C++, o=F9 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=E9es par la classe elle-m=EAme, donc je
n'ai =E0 me pr=E9occuper (dans ce fichier du moins) que des ent=EAtes de
fonction, pas des appels.
Pour identifier ces lignes, je peux faire une recherche comme =E7a (j'ai
rajout=E9 des espaces pour rendre les choses lisibles, mais je ne les
mets =E9videmment pas en vrai) :
/:: \([a-z]\+\) \( \([A-Z]\) \([a-z]\+\) \) (
Je cherche :: suivi d'un mot en minuscule puis de au moins un mot
commen=E7ant par une majuscule suivi de minuscules, et enfin une
parenth=E8se ouvrante.
Bon, je pourrais utiliser des trucs plus g=E9n=E9riques que [a-z] mais
dans mon cas, j'ai que des lettres dans les noms, donc =E7a marche tr=E8s
bien. De toute fa=E7on, =E7a n'est pas la recherche qui me pose probl=E8me.
Par contre, pour le remplacement, je s=E8che un peu sur l'aspect
groupements imbriqu=E9s. Je ne sais pas comment r=E9cup=E9rer tous les bloc=
s
de \( \([A-Z]\) \([a-z]\+\) \)\+ : \1 contient tout le bloc externe
(le dernier mot), \2 contient la derni=E8re majuscule, \3 les minuscules
du dernier mot, mais comment faire pour avoir les autres mots ?
J'ai bidouill=E9 en plusieurs =E9tapes, en consid=E9rant d'abord que je n'a=
i
qu'un seul mot =E0 remplacer (::parExemple() devenant ::par_exemple()) :
:.s/::\([a-z]\+\)\([A-Z]\)\([a-z]\+\)(/::\1_\l\2\3(/g
Puis en prenant deux mots =E0 remplacer :
:.s/::\([a-z]\+\)\([A-Z]\)\([a-z]\+\)\([A-Z]\)\([a-z]\+\)(/::\1_\l\2\3_
\l\4\5(/g
etc.
Comme dans mon cas je ne vais pas au del=E0 de 3 mots, =E7a n'a pas =E9t=E9
trop compliqu=E9, mais je suis un peu vex=E9 de ne pas avoir trouv=E9
comment faire une expression unique.
Est-ce que quelqu'un =E0 une id=E9e de comment j'aurais pu faire mon
remplacement en une seule fois ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Rémi Moyen
On Oct 11, 11:58 am, Rémi Moyen wrote:
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
On Oct 11, 11:58 am, Rémi Moyen <rmo...@gmail.com> wrote:
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
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