Rémi Moyen
2009-02-25 15:44:25 UTC
Bonjour,
J'utilise Vim et j'essaye de trouver un motif de recherche qui
corresponde à toutes les définitions de fonctions dans un fichier de
code C++. Fondamentalement, c'est pas très dur, ce qui m'embête c'est
juste qu'à force d'ajouter des cas particuliers je suis en train de
copier toute la grammaire pour décider de ce qui peut être une
fonction ou pas...
Par exemple, j'avais commencé trivialement avec :
[^{]* {
Mais non seulement je matche aussi des lignes genre "if (...) {", mais
en plus je ne matche pas des définitions sur plusieurs lignes. Alors
j'ai rajouté des bouts, j'ai précisé des choses et en deux minutes
d'essais j'en arrive à :
\(\<\h\w*\>\s\+\)\=\(\<\h\w*\>::\)\=\<\h\w*\>(\n\=\(\s*\(const\s\+\)\=
\<\h\w*\>[&\*]\=\s*\<\h\w*\>,\=\|\n\)*\n\=)\s*\(const\)\=\s*{
Ce qui marche plutôt bien, sauf que non seulement ça commence à être
une usine à gaz incompréhensible, mais en plus ça ne matche toujours
pas tout (par exemple ça ne marche pas sur les constructeurs de
classes si il y a quelque chose entre ) et {, ou encore ça ne marche
pas si les arguments d'une fonction sont des pointeurs de pointeurs
(**), des réferences sur des pointeurs (*&), etc.).
Alors évidemment, je peux continuer à ajouter des choses pour tout ces
cas-là, mais je vais finir avec un truc immense et illisible.
D'où ma question : est-ce qu'il y a un moyen plus court de faire ça ?
J'imagine que dans tous les mappings/syntax highlighting/autres/... de
vim, je ne suis pas le premier à faire du C++ !
Accessoirement, est-ce qu'il y a un moyen simple de définir une sorte
de motif personnalisé que je puisse réutiliser ? Par exemple est-ce
que je peux dire que [une courte séquence de caractères de mon choix]
veut dire \<\h\w*\> ? Si j'utilise \1, \2 etc. je ne vais pas matcher
le motif de recherche, mais ce qui a déjà été matché par le n-ième
groupe.
Merci d'avance !
--
Rémi Moyen
J'utilise Vim et j'essaye de trouver un motif de recherche qui
corresponde à toutes les définitions de fonctions dans un fichier de
code C++. Fondamentalement, c'est pas très dur, ce qui m'embête c'est
juste qu'à force d'ajouter des cas particuliers je suis en train de
copier toute la grammaire pour décider de ce qui peut être une
fonction ou pas...
Par exemple, j'avais commencé trivialement avec :
[^{]* {
Mais non seulement je matche aussi des lignes genre "if (...) {", mais
en plus je ne matche pas des définitions sur plusieurs lignes. Alors
j'ai rajouté des bouts, j'ai précisé des choses et en deux minutes
d'essais j'en arrive à :
\(\<\h\w*\>\s\+\)\=\(\<\h\w*\>::\)\=\<\h\w*\>(\n\=\(\s*\(const\s\+\)\=
\<\h\w*\>[&\*]\=\s*\<\h\w*\>,\=\|\n\)*\n\=)\s*\(const\)\=\s*{
Ce qui marche plutôt bien, sauf que non seulement ça commence à être
une usine à gaz incompréhensible, mais en plus ça ne matche toujours
pas tout (par exemple ça ne marche pas sur les constructeurs de
classes si il y a quelque chose entre ) et {, ou encore ça ne marche
pas si les arguments d'une fonction sont des pointeurs de pointeurs
(**), des réferences sur des pointeurs (*&), etc.).
Alors évidemment, je peux continuer à ajouter des choses pour tout ces
cas-là, mais je vais finir avec un truc immense et illisible.
D'où ma question : est-ce qu'il y a un moyen plus court de faire ça ?
J'imagine que dans tous les mappings/syntax highlighting/autres/... de
vim, je ne suis pas le premier à faire du C++ !
Accessoirement, est-ce qu'il y a un moyen simple de définir une sorte
de motif personnalisé que je puisse réutiliser ? Par exemple est-ce
que je peux dire que [une courte séquence de caractères de mon choix]
veut dire \<\h\w*\> ? Si j'utilise \1, \2 etc. je ne vais pas matcher
le motif de recherche, mais ce qui a déjà été matché par le n-ième
groupe.
Merci d'avance !
--
Rémi Moyen