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

mode org agenda et regexp

11 réponses
Avatar
Camille Bourgoin
Bonjour !


Je vous écris suite à un petit soucis rencontré avec Emacs LISP. Je
cherche configurer "l'agenda" du mode org de la façon suivante :

Chercher dans les dossiers X et Y tous les fichiers en .org et .ORG et
l'ajouter à l'agenda org (la todo-list en gros).

Se qui se traduit par :

(setq org-agenda-file (list
(directory-files "~/.emacs.d/org/" t "\\.\\(org\\|ORG\\)$")
(directory-files "~/.emacs.d/org/administration/" t "\\.\\(org\\|ORG\\)$")
(directory-files "~/.emacs.d/org/cours/cnam/" t "\\.\\(org\\|ORG\\)$")
(directory-files "~/.emacs.d/org/logiciels/" t "\\.\\(org\\|ORG\\)$")
(directory-files "~/.emacs.d/org/logiciels/emacs/" t "\\.\\(org\\|ORG\\)$")
(directory-files "~/.emacs.d/org/materiel/" t "\\.\\(org\\|ORG\\)$")
(directory-files "~/.emacs.d/org/network/" t "\\.\\(org\\|ORG\\)$")
(directory-files "~/.emacs.d/org/programmation/" t "\\.\\(org\\|ORG\\)$")
(directory-files "~/.emacs.d/org/sites/" t "\\.\\(org\\|ORG\\)$")
))

Mais cette fonction renvoie une sortie de la forme :

(("/home/pomme/dapi/zoubida/blabla.org" "/home/pomme/dapi/zoubidabibi.org")
("/home/pomme/dapi/lavabo/loulou.org" etc.))

Alors que la fonction org-agenda-file attend une sortie de la forme :

("/home/pomme/dapi/zoubida/blabla.org" "/home/pomme/dapi/zoubidabibi.org"
"/home/pomme/dapi/lavabo/loulou.org" etc.)

J'ai rapidement parcourus le manuel Emacs Lisp pour essayer de trouver
une méthode de concaténation des listes, mais ça n'a rien donné.

Ne connaissant pas très bien Emacs LISP (juste les bases), j'avoue
avoir un tout petit besoin d'aide ;) Est-il besoin de préciser que la
solution du problème m'intéresse infiniment plus que sa résolution ?

Merci à vous !

--
www.jeanbaptiste-bourgoin.com (site perso)
www.actu-philosophia.com
mr.camille@im.apinc.org (jabber)

10 réponses

1 2
Avatar
Kojak
Le Thu, 12 Mar 2009 23:21:37 +0100,
Camille Bourgoin a écrit :

[...]
(setq org-agenda-file (list
(directory-files "~/.emacs.d/org/" t ".(org|ORG)$")
(directory-files "~/.emacs.d/org/administration/" t
[...] ))

Mais cette fonction renvoie une sortie de la forme :



Une liste de liste de chemin.


Alors que la fonction org-agenda-file attend une sortie de la forme :



Une liste de chemin.


[...]
avoir un tout petit besoin d'aide ;) Est-il besoin de préciser que la
solution du problème m'intéresse infiniment plus que sa ré solution ?



Bref, pour résumer ce que tu cherches a faire, c'est joindre dans
une liste commune tout les éléments de chacune des listes.

Voilà, j'ai tout dit.

Sinon, j'ai bien la solution, mais si je te la donne tu ne va pas
être content, oui, vraiment pas content. :-)

Cela dit, si tu ne trouves pas...

Cordialement,

--
Jacques.
Avatar
Vincent Belaïche
Kojak a écrit :

Bref, pour résumer ce que tu cherches a faire, c'est joindre dans
une liste commune tout les éléments de chacune des listes.

Voilà, j'ai tout dit.

Sinon, j'ai bien la solution, mais si je te la donne tu ne va pas
être content, oui, vraiment pas content. :-)

Cela dit, si tu ne trouves pas...

Cordialement,




Je ne résiste pas à la tentation de te lâcher la solution:

(append (list 1 2) (list 3 4))

renvoie (1 2 3 4)
Avatar
Camille Bourgoin
Kojak writes:

Le Thu, 12 Mar 2009 23:21:37 +0100,
Camille Bourgoin a écrit :

[...]
(setq org-agenda-file (list
(directory-files "~/.emacs.d/org/" t ".(org|ORG)$")
(directory-files "~/.emacs.d/org/administration/" t
[...] ))

Mais cette fonction renvoie une sortie de la forme :



Une liste de liste de chemin.


Alors que la fonction org-agenda-file attend une sortie de la forme :



Une liste de chemin.




En bon étudiant en philosophie que j'étais, je connais l'importance de
l'utilisation d'un vocabulaire précis et juste. Avant d'envoyer ce
message, il aurait été préférable que je vérifie celui que
j'emploie. Merci de me le rappeler !

[...]
avoir un tout petit besoin d'aide ;) Est-il besoin de préciser que la
solution du problème m'intéresse infiniment plus que sa résolution ?



Bref, pour résumer ce que tu cherches a faire, c'est joindre dans
une liste commune tout les éléments de chacune des listes.

Voilà, j'ai tout dit.

Sinon, j'ai bien la solution, mais si je te la donne tu ne va pas
être content, oui, vraiment pas content. :-)

Cela dit, si tu ne trouves pas...

Cordialement,

--
Jacques.




La réponse ayant été donnée juste après, je peux en effet dire que je
ne suis guère content de moi. Il me suffisait de lire sérieusement et
entièrement le chapitre 5 (5.4 pour être plus précis) du manuel !

--
www.jeanbaptiste-bourgoin.com (site perso)
www.actu-philosophia.com
(jabber)
Avatar
Camille Bourgoin
Vincent Belaïche writes:

Kojak a écrit :

Bref, pour résumer ce que tu cherches a faire, c'est joindre dans
une liste commune tout les éléments de chacune des listes.

Voilà, j'ai tout dit.

Sinon, j'ai bien la solution, mais si je te la donne tu ne va pas
être content, oui, vraiment pas content. :-)

Cela dit, si tu ne trouves pas...

Cordialement,




Je ne résiste pas à la tentation de te lâcher la solution:

(append (list 1 2) (list 3 4))

renvoie (1 2 3 4)



Merci beaucoup ! Je remarque au passage que la réponse était sous mon
nez, à la section 4 du cinquième chapitre du manuel de référence. Il
me suffisait de faire un tout petit effort.

Pour la peine, je m'engage à lire le fameux manuel dans son
intégralité très prochainement.

--
www.jeanbaptiste-bourgoin.com (site perso)
www.actu-philosophia.com
(jabber)
Avatar
Vincent Belaïche
Il y a aussi une notation plus concise que append.

Tu peux utiliser

`( ,@'(1 2) ,@'(3 4))

Ca s'évalue en :

(1 2 3 4)

Utilise ,@ au lieu de ,@' si tu veux que ce qui suit soit évalué:

`( ,@(list 1 2) ,@(list 3 4))

s'évalue donc en

(1 2 3 4)

Vincent

Camille Bourgoin a écrit :
Kojak writes:

Le Thu, 12 Mar 2009 23:21:37 +0100,
Camille Bourgoin a écrit :

[...]
(setq org-agenda-file (list
(directory-files "~/.emacs.d/org/" t ".(org|ORG)$")
(directory-files "~/.emacs.d/org/administration/" t
[...] ))

Mais cette fonction renvoie une sortie de la forme :


Une liste de liste de chemin.


Alors que la fonction org-agenda-file attend une sortie de la forme :


Une liste de chemin.




En bon étudiant en philosophie que j'étais, je connais l'importance de
l'utilisation d'un vocabulaire précis et juste. Avant d'envoyer ce
message, il aurait été préférable que je vérifie celui que
j'emploie. Merci de me le rappeler !

[...]
avoir un tout petit besoin d'aide ;) Est-il besoin de préciser que la
solution du problème m'intéresse infiniment plus que sa résolution ?


Bref, pour résumer ce que tu cherches a faire, c'est joindre dans
une liste commune tout les éléments de chacune des listes.

Voilà, j'ai tout dit.

Sinon, j'ai bien la solution, mais si je te la donne tu ne va pas
être content, oui, vraiment pas content. :-)

Cela dit, si tu ne trouves pas...

Cordialement,

--
Jacques.




La réponse ayant été donnée juste après, je peux en effet dire que je
ne suis guère content de moi. Il me suffisait de lire sérieusement et
entièrement le chapitre 5 (5.4 pour être plus précis) du manuel !

Avatar
Kojak
Le Sat, 14 Mar 2009 07:13:22 +0100,
Vincent Belaïche a écrit :

Il y a aussi une notation plus concise que append.
Tu peux utiliser

`( ,@'(1 2) ,@'(3 4))

Ca s'évalue en :

(1 2 3 4)

Utilise ,@ au lieu de ,@' si tu veux que ce qui suit soit évaluà ©:

`( ,@(list 1 2) ,@(list 3 4))

s'évalue donc en

(1 2 3 4)



Euh, ne va pas l'embrouiller avec tes macros, hein !

Sinon, concernant la concision, je ne veux pas dire, mais entre:

`( ,@'(1 2) ,@'(3 4))

et

(append '(1 2) '(3 4))

1 caractère de mieux. Faut pas pousser tout de même ! :-)

Maintenant, si c'est pour économiser... Vu que le tout venant à été
épuisé, on peut se risquer dans le bizarre en redéfinissant append :

(defmacro a (&rest arg)
`(let ((lst ()))
(loop
:for n in '(,@arg)
:do (setf lst (append lst n))
:finally (return lst))))

avec :

(a(1 2)(3 4))
=> (1 2 3 4)

soit 13 touches au lieu de 19 en écrivant au mieux (i.e en
éliminant toutes les espaces) :

`(,@'(1 2),@'(3 4))

Mais bon, à moins d'avoir un espace disque vraiment très limità ©,
voire un clavier en fin de vie... ;-)

Cordialement,

--
Jacques.
Avatar
Vincent Belaïche
Salut,

L'exemple que je donnais était à titre pédagogique et je ne prétendais pas que
c'était la meilleure façon de concaténer les listes (1 2) et (3 4).

D'ailleurs dans le cas de ces deux listes en particulier, il suffit pour les
concaténer d'écrire:

'(1 2 3 4)

ça ne fait que 10 caractères au lieu des 13 dans la solution que tu as
proposée ;-) ..., essaie de faire mieux puisque tu es si malin ;-) ...

Dans le cas cas qui nous intéressait les listes qui étaient à concaténer
résultaient d'expressions *à évaluer* telles que:

(directory-files "~/.emacs.d/org/" t ".(org|ORG)$")

donc ta macro n'est pas applicable telle quelle puisqu'elle n'évalue pas ses
arguments, et c'est plutôt toi qui embrouilles les choses. Par contre la
notation que je proposais fait parfaitement l'affaire:

(setq org-agenda-file `(
,@(directory-files "~/.emacs.d/org/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/administration/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/cours/cnam/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/logiciels/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/logiciels/emacs/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/materiel/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/network/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/programmation/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/sites/" t ".(org|ORG)$")
))

Mon but était seulement de montrer les possibilités de la notation en
contre-apostrophe. Quand j'écrivais que la contre-apostrophe pouvait permettre
d'être plus concis, c'était une affirmation de portée générale qui d'ailleurs
ne fait que reprendre ce qu'en dit le manuel d'Emacs lisp dont voici un extrait:


---8<------8<------8<------8<------8<------8<------8<------8<------8<---
The equivalent code without using ``' is often unreadable. Here are
some examples:

(setq some-list '(2 3))
=> (2 3)
(cons 1 (append some-list '(4) some-list))
=> (1 2 3 4 2 3)
`(1 ,@some-list 4 ,@some-list)
=> (1 2 3 4 2 3)

(setq list '(hack foo bar))
=> (hack foo bar)
(cons 'use
(cons 'the
(cons 'words (append (cdr list) '(as elements)))))
=> (use the words foo bar as elements)
`(use the words ,@(cdr list) as elements)
=> (use the words foo bar as elements)
---8<------8<------8<------8<------8<------8<------8<------8<------8<---

Vincent.



Kojak a écrit :
Le Sat, 14 Mar 2009 07:13:22 +0100,
Vincent Belaïche a écrit :

Il y a aussi une notation plus concise que append.
Tu peux utiliser

`( ,@'(1 2) ,@'(3 4))

Ca s'évalue en :

(1 2 3 4)

Utilise ,@ au lieu de ,@' si tu veux que ce qui suit soit évalué:

`( ,@(list 1 2) ,@(list 3 4))

s'évalue donc en

(1 2 3 4)



Euh, ne va pas l'embrouiller avec tes macros, hein !

Sinon, concernant la concision, je ne veux pas dire, mais entre:

`( ,@'(1 2) ,@'(3 4))

et

(append '(1 2) '(3 4))

1 caractère de mieux. Faut pas pousser tout de même ! :-)

Maintenant, si c'est pour économiser... Vu que le tout venant à été
épuisé, on peut se risquer dans le bizarre en redéfinissant append :

(defmacro a (&rest arg)
`(let ((lst ()))
(loop
:for n in '(,@arg)
:do (setf lst (append lst n))
:finally (return lst))))

avec :

(a(1 2)(3 4))
=> (1 2 3 4)

soit 13 touches au lieu de 19 en écrivant au mieux (i.e en
éliminant toutes les espaces) :

`(,@'(1 2),@'(3 4))

Mais bon, à moins d'avoir un espace disque vraiment très limité,
voire un clavier en fin de vie... ;-)

Cordialement,

Avatar
Kojak
Le Sat, 14 Mar 2009 23:19:20 +0100,
Vincent Belaïche a écrit :

L'exemple que je donnais était à titre pédagogique et je ne
prétendais pas que c'était la meilleure façon de concatà ©ner les
listes (1 2) et (3 4).
[...]



Hey, keep cool my friend !

Nous ne sommes pas là pour passer des examens, hein ! :-)

Ma réponse n'était en aucune manière une critique sur les ra isons
ou le contenu de ton intervention, mais juste un trait d'humour
faisant suite à la concision d'écriture que tu proposais. Dé solé
que tu l'aies mal pris, ou mal compris.

Bon dimanche,

--
Jacques.
Avatar
Jacques L'helgoualc'h
Le 14-03-2009, Vincent Belaïche a écrit :
Salut,



Ave, que St Ignucius te bénisse.

[...]
(setq org-agenda-file `(
,@(directory-files "~/.emacs.d/org/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/administration/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/cours/cnam/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/logiciels/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/logiciels/emacs/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/materiel/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/network/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/programmation/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/sites/" t ".(org|ORG)$")
))



Pourrait-on être plus concis en Elisp, cf. la commande

find ~/.emacs.d/org/ -iname *.org

?
--
Jacques L'helgoualc'h
Avatar
Camille Bourgoin
Jacques L'helgoualc'h <lhh+ writes:

Le 14-03-2009, Vincent Belaïche a écrit :
Salut,



Ave, que St Ignucius te bénisse.

[...]
(setq org-agenda-file `(
,@(directory-files "~/.emacs.d/org/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/administration/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/cours/cnam/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/logiciels/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/logiciels/emacs/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/materiel/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/network/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/programmation/" t ".(org|ORG)$")
,@(directory-files "~/.emacs.d/org/sites/" t ".(org|ORG)$")
))



Pourrait-on être plus concis en Elisp, cf. la commande

find ~/.emacs.d/org/ -iname *.org

?
--
Jacques L'helgoualc'h



Tout d'abord, merci à vous tous pour vos réponses passionnantes. Je
fus heureux de voir deux exemples d'utilisation des macros, que je
n'ai, vous vous en doutez, encore jamais vraiment pratiqué.

--
www.jeanbaptiste-bourgoin.com (site perso)
www.actu-philosophia.com
(jabber)
1 2