Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problemes avec flush-lines et regexp - bug?

1 réponse
Avatar
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 "^\\(> \n\\)*> foo\n\\(\n?> .*\\)*")
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 "\n" 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 "^\\(> \n\\)*> foo$\\(\n> .*\\)*")

n'a aucun effet. Pourtant, le "$" fonctionne bien. Par exemple,

(flush-lines "^\\(> \n\\)*> 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 "^\\(> \n\\)*> foo\\(\\(\n> .*\\)+\\|$\\)")

semble bien fonctionner, mais pas:

(flush-lines "^\\(> \n\\)*> foo\\($\\|\\(\n> .*\\)+\\)")

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)

1 réponse

Avatar
Vincent Lefevre
Après messages dans les listes @gnu.org:

Dans l'article <20070114224513$,
Vincent Lefevre <vincent+ écrit:

J'utilise actuellement (flush-lines "^(> n)*> foon(n?> .*)*")
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:


[...]
C'est à cause du "n" 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).



C'est effectivement la doc qui n'est pas très bonne.

Je me suis dit alors: il n'y a qu'à utiliser le "$". Mais

(flush-lines "^(> n)*> foo$(n> .*)*")

n'a aucun effet.



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 `|'.

(flush-lines "^(> n)*> foo((n> .*)+|$)")

semble bien fonctionner, mais pas:

(flush-lines "^(> n)*> foo($|(n> .*)+)")



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 - Web: <http://www.vinc17.org/&gt;
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/&gt;
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)