problemes avec flush-lines et regexp - bug?
Le
Vincent Lefevre
Bonjour,
Je veux pouvoir effacer les signatures en citation. Dans les exemples
ci-dessous, j'ai remplacé "-- " par "foo" pour pouvoir les utiliser plus
facilement par copier-coller (il n'y a aucune espace en fin de ligne).
J'ai fait mes tests avec GNU Emacs 22.0.50.1 sous Mac OS X (MacPorts)
et avec GNU Emacs 22.0.92.1 sous Linux (Debian, paquet emacs-snapshot).
J'utilise actuellement (flush-lines "^\\(> \\)*> foo\\(?> .*\\)*")
mais en pratique, lorsqu'il y a une signature vide après le séparateur,
cela efface une ligne blanche après la signature citée. Par exemple, sur
le fichier suivant:
--
> test 1
> foo
blah
> test 2
> foo
> foobar
blah
--
le test 1 correspond à une signature vide (la citation se termine juste
après le séparateur de signature "foo"). J'obtiens alors:
--
> test 1
blah
> test 2
blah
--
au lieu de:
--
> test 1
blah
> test 2
blah
--
C'est à cause du "" après "> foo" dans l'expression rationnelle (la
doc de flush-lines ferait croire à un bug, mais je pense qu'il s'agit
plutôt d'une imprécision de la doc). Je me suis dit alors: il n'y a
qu'à utiliser le "$". Mais
(flush-lines "^\\(> \\)*> foo$\\(> .*\\)*")
n'a aucun effet. Pourtant, le "$" fonctionne bien. Par exemple,
(flush-lines "^\\(> \\)*> foo$")
efface bien les deux lignes "> foo", et seulement celles-ci. Il
semble que dès qu'il y a quelque chose à matcher après le "$", ça
ne fonctionne plus. Donc
(flush-lines "^\\(> \\)*> foo\\(\\(> .*\\)+\\|$\\)")
semble bien fonctionner, mais pas:
(flush-lines "^\\(> \\)*> foo\\($\\|\\(> .*\\)+\\)")
J'ai testé sur:
--
> test 1
> foo
blah
> test 2
> foo
> bar
> foobar
blah
> test 3
> foobar
blah
--
Le premier donne bien:
--
> test 1
blah
> test 2
blah
> test 3
> foobar
blah
--
alors que le second n'efface que les deux lignes "> foo".
S'agit-il d'un bug ou y a-t-il une subtilité que je n'ai pas vue?
--
Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Je veux pouvoir effacer les signatures en citation. Dans les exemples
ci-dessous, j'ai remplacé "-- " par "foo" pour pouvoir les utiliser plus
facilement par copier-coller (il n'y a aucune espace en fin de ligne).
J'ai fait mes tests avec GNU Emacs 22.0.50.1 sous Mac OS X (MacPorts)
et avec GNU Emacs 22.0.92.1 sous Linux (Debian, paquet emacs-snapshot).
J'utilise actuellement (flush-lines "^\\(> \\)*> foo\\(?> .*\\)*")
mais en pratique, lorsqu'il y a une signature vide après le séparateur,
cela efface une ligne blanche après la signature citée. Par exemple, sur
le fichier suivant:
--
> test 1
> foo
blah
> test 2
> foo
> foobar
blah
--
le test 1 correspond à une signature vide (la citation se termine juste
après le séparateur de signature "foo"). J'obtiens alors:
--
> test 1
blah
> test 2
blah
--
au lieu de:
--
> test 1
blah
> test 2
blah
--
C'est à cause du "" après "> foo" dans l'expression rationnelle (la
doc de flush-lines ferait croire à un bug, mais je pense qu'il s'agit
plutôt d'une imprécision de la doc). Je me suis dit alors: il n'y a
qu'à utiliser le "$". Mais
(flush-lines "^\\(> \\)*> foo$\\(> .*\\)*")
n'a aucun effet. Pourtant, le "$" fonctionne bien. Par exemple,
(flush-lines "^\\(> \\)*> foo$")
efface bien les deux lignes "> foo", et seulement celles-ci. Il
semble que dès qu'il y a quelque chose à matcher après le "$", ça
ne fonctionne plus. Donc
(flush-lines "^\\(> \\)*> foo\\(\\(> .*\\)+\\|$\\)")
semble bien fonctionner, mais pas:
(flush-lines "^\\(> \\)*> foo\\($\\|\\(> .*\\)+\\)")
J'ai testé sur:
--
> test 1
> foo
blah
> test 2
> foo
> bar
> foobar
blah
> test 3
> foobar
blah
--
Le premier donne bien:
--
> test 1
blah
> test 2
blah
> test 3
> foobar
blah
--
alors que le second n'efface que les deux lignes "> foo".
S'agit-il d'un bug ou y a-t-il une subtilité que je n'ai pas vue?
--
Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Poser une question


Dans l'article Vincent Lefevre
[...]
C'est effectivement la doc qui n'est pas très bonne.
C'est dans le manuel elisp (Node "Regexp Special"):
For historical compatibility reasons, `$' can be used only at the
end of the regular expression, or before `)' or `|'.
En fait si. Comme le $ matche la fin de la ligne, les lignes "> ..."
suivantes ne sont pas effacées. C'est donc bien
(flush-lines "^\(> n\)*> foo\(\(n> .*\)+\|$\)")
qu'il faut que j'utilise, afin que la regexp "\(n> .*\)+" soit
essayée avant le "$".
--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)