OVH Cloud OVH Cloud

[DEV]: Question simple (?)

18 réponses
Avatar
Xavier Maillard
Bonsoir,

Petite question de dev.

Je veux me créer un widget (au sens emacs) qui ne soit rien de
plus qu'une liste qui serait créée « dynamiquement » à chaque
lancement du mode customize.

La construction consisterait à lister les fichiers d'un
répertoire et de concaténer le nom de fichier à une chaîne
quelconque comme "foo" par exemple.

Ainsi l'utilisateur, lorsqu'il lancerait le customize du mode,
n'aurait qu'à choisir/cocher l'option qui va bien dans la liste
et Emacs se chargerait du reste.

Donc pour résumer:

dans un rep "toto", j'ai les fichiers "a", "b" et "c". Je veux
qu'un widget propose comme choix une liste contenant: "foo-a",
"foo-b" et "foo-c".

J'espère que j'ai été claire :)
--
Hito no kokoro wa kawareru mono

10 réponses

1 2
Avatar
Matthieu Moy
Xavier Maillard writes:

Bonsoir,



[...]

Je veux me créer un widget (au sens emacs) qui ne soit rien de plus
qu'une liste qui serait créée « dynamiquement » à chaque lancement
du mode customize.



A mon avis, customize et « dynamiquement » ne vont pas trop ensembles.
Je ferais plutôt un buffer dédié, a base de menu ou de ewoc.el, mais
il y a peut être mieux.

--
Matthieu
Avatar
Xavier Maillard
On 21 déc 2004, Matthieu Moy wrote:

Xavier Maillard writes:

> Bonsoir,

[...]

> Je veux me créer un widget (au sens emacs) qui ne soit rien
> de plus qu'une liste qui serait créée « dynamiquement » à
> chaque lancement du mode customize.

A mon avis, customize et « dynamiquement » ne vont pas trop



QUand je pensais dynamisme, c'était plus quelque chose du genre,
quand je le lance, la liste est mise à jour. Pas forcément à
chaque ajout/suppression d'entrée dans le répertoire. Je ne sais
pas à quel point on peut jouer à ça. Je continue à chercher.

ensembles. Je ferais plutôt un buffer dédié, a base de menu ou
de ewoc.el, mais il y a peut être mieux.



ewoc.el je ne le connais que de nom (parce que j'utilise xtla qui
roxor des ours ©). Pour le buffer dédié, ça ne cadre pas avec une
demande d'amélioration d'un de mes paquets. La personne m'a
ouvert un « bogue » pour que j'utilise les widgets customize
alors j'étudie la possibilité/faisabilité de le faire :p
--
Xavier MAILLARD (GnuPG: 1024D/1E028EA5)
EmacsOS user (http://emacsfr.org)
APRIL (http://www.april.org)
Avatar
drkm
Xavier Maillard writes:

Donc pour résumer:

dans un rep "toto", j'ai les fichiers "a", "b" et "c". Je veux
qu'un widget propose comme choix une liste contenant: "foo-a",
"foo-b" et "foo-c".



Pour commencer, je préciserai que je ne connais pas Widget. J'y ai
jeté un oeil, et en me basant sur le widget « file », j'ai écris
ceci :

(defun string-is-prefix-p (pre str)
"FIXME<docstring>: ..."
(condition-case nil
(equal pre (substring str 0 (length pre)))
(args-out-of-range nil)))

(defvar my-file:values ()
"FIXME<docstring>: ...")

(defvar my-file:dir "~/tmp"
"FIXME<docstring>: ...")

(defvar my-file:prefix "foo-"
"FIXME<docstring>: ...")

(defun my-file-customize-hook ()
"FIXME<docstring>: ..."
(setq my-file:values
(mapcar (lambda (x)
(concat my-file:prefix x))
(directory-files my-file:dir nil "^[^.]"))))

(add-hook 'custom-mode-hook 'my-file-customize-hook)

(defun my-file-validate (widget)
"FIXME<docstring>: ..."
(unless (member (widget-value widget) my-file:values)
(widget-put widget :error "Value is not correct.")
widget))

(defun my-file-complete ()
"FIXME<docstring>: ..."
(interactive)
(let* ((end (point))
(beg (save-excursion
(skip-chars-backward "^ tn")
(point)))
(prefix (buffer-substring beg end))
(completions (remove* prefix my-file:values
:test-not 'string-is-prefix-p)))
(cond ((null completions)
(message "Can't find completion for "%s"" prefix)
(ding))
((null (cdr completions))
(unless (equal prefix (car completions))
(delete-region beg end)
(insert (car completions))))
((member prefix completions)
(message "Complete but not unique..."))
(t
(with-output-to-temp-buffer "*Completions*"
(display-completion-list completions))))))

(defun my-file-prompt-value (widget prompt default unbound)
"FIXME<docstring>: ..."
(completing-read prompt my-file:values nil t nil nil default))

(define-widget 'my-file 'string
"FIXME<docstring>: ..."
:validate 'my-file-validate
:complete-function 'my-file-complete
:prompt-value 'my-file-prompt-value
:format "%{%t%}: %v"
:tag "My-file")

Cela t'aide-t-il ?

--drkm
Avatar
drkm
drkm writes:

(defvar my-file:values ()
(defvar my-file:dir "~/tmp"
(defvar my-file:prefix "foo-"



Tiens, je ne sais pas pourquoi j'ai utilisé un ':' dans le nom de
ces variables. Je l'utilise dans mes packages pour séparer le préfixe
(un peu comme un préfixe d'espace de noms), mais ici, je ne sais pas
pourquoi je n'ai pas utilisé un '-' comme dans le reste du code.

À considérer comme un bug et à corriger, évidemment.

--drkm
Avatar
Pascal Bourguignon
drkm writes:

drkm writes:

> (defvar my-file:values ()
> (defvar my-file:dir "~/tmp"
> (defvar my-file:prefix "foo-"

Tiens, je ne sais pas pourquoi j'ai utilisé un ':' dans le nom de
ces variables. Je l'utilise dans mes packages pour séparer le préfixe
(un peu comme un préfixe d'espace de noms), mais ici, je ne sais pas
pourquoi je n'ai pas utilisé un '-' comme dans le reste du code.

À considérer comme un bug et à corriger, évidemment.



Pourquoi? : et :: sont utilisés en Common Lisp pour séparer le nom du
package et le nom du symbole. Comme emacs les traite comme des
caractères normaux, on peut trés bien les utiliser avec la même
convention.

Le seul problème que ça peut poser c'est si on essaye de lire ces
sexps emacs lisp avec Common Lisp. On peut l'éviter avec:

(when (fboundp 'kill-emacs)
(defmacro defpackage (name &rest args) nil))

(defpackage my-file
(:export :values :dir :prefix))

(defvar my-file:values () ...)
(defvar my-file:dir "~/tmp" ...)
(defvar my-file:prefix "foo-" ...)


--
__Pascal Bourguignon__ http://www.informatimago.com/

There is no worse tyranny than to force a man to pay for what he does not
want merely because you think it would be good for him. -- Robert Heinlein
Avatar
Xavier Maillard
On 21 déc 2004, drkm wrote:

Xavier Maillard writes:

> Donc pour résumer:

> dans un rep "toto", j'ai les fichiers "a", "b" et "c". Je
> veux qu'un widget propose comme choix une liste contenant:
> "foo-a", "foo-b" et "foo-c".

Pour commencer, je préciserai que je ne connais pas Widget. J'y
ai jeté un oeil, et en me basant sur le widget « file », j'ai
écris ceci :



[ ... ]

Cela t'aide-t-il ?



C'est un début. Il faut encore que je teste tout ça mais ça me
donne dès à présent quelques idées :)

Merci.

--
GNUSFR.ORG http://gnusfr.org/
EMACSFR.ORG http://emacsfr.org/
Xavier Maillard Tel: +33 6 68 04 64 37
Avatar
Xavier Maillard
On 21 déc 2004, Pascal Bourguignon wrote:

Le seul problème que ça peut poser c'est si on essaye de lire
ces sexps emacs lisp avec Common Lisp. On peut l'éviter avec:



[ ... ]

Excellente astuce que je m'empresse de recopier :).

--
"sometimes i feel like we're making emacs better and better because we don't
know what to do with emacs once it is finished."

-- AlexSchroeder on #emacs @OPN
Avatar
drkm
Pascal Bourguignon writes:

drkm writes:

drkm writes:

> (defvar my-file:values ()
> (defvar my-file:dir "~/tmp"
> (defvar my-file:prefix "foo-"

Tiens, je ne sais pas pourquoi j'ai utilisé un ':' dans le nom de
ces variables. Je l'utilise dans mes packages pour séparer le préfixe
(un peu comme un préfixe d'espace de noms), mais ici, je ne sais pas
pourquoi je n'ai pas utilisé un '-' comme dans le reste du code.

À considérer comme un bug et à corriger, évidemment.



Pourquoi? : et :: sont utilisés en Common Lisp pour séparer le nom du
package et le nom du symbole. Comme emacs les traite comme des
caractères normaux, on peut trés bien les utiliser avec la même
convention.



Oui. Et comme je l'ai dit plus haut, c'est effectivement ce que
j'utilise, avec '::' pour les symboles privés. Ce que je considère
comme un bug, c'est d'avoir utilisé ':' pour ces trois variables, et
'-' dans les autres symboles que j'ai défini.

Et lorsque je parlais de « corriger », je ne pensais pas
particulièrement à remplacer les ':' par des '-' (plutôt le contraire,
d'ailleurs).

--drkm
Avatar
Matthieu Moy
Pascal Bourguignon writes:

Pourquoi? : et :: sont utilisés en Common Lisp pour séparer le nom du
package et le nom du symbole. Comme emacs les traite comme des
caractères normaux, on peut trés bien les utiliser avec la même
convention.



Cela dit, on « peut », mais ce n'est pas la convention en Emacs Lisp
(c'est plutôt dommage en fait).

--
Matthieu
Avatar
drkm
Matthieu Moy writes:

Cela dit, on « peut », mais ce n'est pas la convention en Emacs Lisp
(c'est plutôt dommage en fait).



D'autant que si le code Lisp de la distribution d'Emacs avait suivit
cette convention, on pourrait facilement ajouter un support de package
dans Emacs. ÀMHA, ce support a moins d'intérêt aux yeux des
développeurs d'Emacs de par le fait que ce n'est pas la convention
suivie.

Au fait, il me semble avoir entendu parler d'une implémentation
d'Emacs interprétant du Common Lisp, mais je n'arrive pas à remettre
la main dessus. Quelqu'un connait-il ce programme ? Quel est l'état
du projet ?

Quelqu'un utilise-t-il également Emacs Common Lisp ? Quel est
l'état du projet ?

--drkm
1 2