Comment blinder defcustom

Le
JJ. Rétorré
Bonjour,

J'ai commis un ajout à ses.el (Simple Emacs Spreadsheet) pour exporter
une partie d'un tableau en LaTeX. Le code se trouve sur

http://forum.mathematex.net/latex-f6/les-tableaux-faciles-avec-auctex-t13870.html

Je voudrais blinder les defcustom pour que ne soient acceptées que des
valeurs précises, par exemple "tabular" "tabularx" "tabulary" pour le
type de tableau reconnu.
Pour l'instant, j'ai mis

(defcustom ses-export-latex-tabtype "tabular"
"Type de tableau (tabular, tabularx, tabulary etC.)"
:group 'ses-export
:type '(choice string
(list :tag "Parenthesized string" string)
function))

Il n'y a aucun contrôle de la valeur de la variable, ce qui peut être
ennuyeux, les différents types de tableaux devant faire l'objet d'un
traitement différent.

J'avoue ne pas tout comprendre les options, j'ai bêtement pompé dans
ses.el, et pour mon usage personnel, ça marche, je sais ce que le code
peut traiter.
Si quelqu'un pouvait m'éviter de RTFM que je ne comprends pas, un
exemple serait bienvenu.

--
JJR
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olve
Le #24104151
Bonjour,

Voici un exemple extrait de pari.el :
------------------------------------------------
(defcustom gp-shift-alist '()
"See `sli-shift-alist'."
:type '(repeat (cons (vector string string) sexp))
:initialize 'custom-initialize-default
:set 'gp-set-and-recompute-indentation
:group 'gp-indentation)

(defcustom gp-no-heredity-list '()
"See `sli-no-heredity-alist'."
:type '(repeat (cons (vector string string) sexp))
:initialize 'custom-initialize-default
:set 'gp-set-and-recompute-indentation
:group 'gp-indentation)

;; Relevant functions

(defun gp-set-and-recompute-indentation (sym val)
(set sym val)
(save-current-buffer
(mapcar
(lambda (bf)
(set-buffer bf)
(when (eq major-mode 'gp-script-mode)
(gp-learns-indentation)))
(buffer-list))))

(defun gp-learns-indentation nil
(require 'sli-tools)
(sli-tools gp-structures gp-shift-alist gp-separators
'sli-is-a-separatorp-default
gp-fixed-keys-alist
"\(^/\*--+--\*/\|^}[ t]*\)"
gp-keys-with-newline nil gp-add-to-key-alist
'("//" "\\") gp-no-heredity-list)
(setq sli-more-maidp gp-more-maidp
sli-tab-always-indent gp-tab-always-indent))

-----------------------------------------------------------

Attention, elisp 20 avait un petit bug à mon sens : il fallait
absolument indiquer
:initialize 'custom-initialize-default
dès que :set est utilisé.

Je peux commenter plus, mais je pense que cet exemple est assez
clair. Je vais continuer à lire ce groupe quelques jours.
Amitiés,
Olivier
JJ. Rétorré
Le #24124941
Olve
Bonjour,

Voici un exemple extrait de pari.el :
------------------------------------------------
(defcustom gp-shift-alist '()
"See `sli-shift-alist'."
:type '(repeat (cons (vector string string) sexp))
:initialize 'custom-initialize-default
:set 'gp-set-and-recompute-indentation
:group 'gp-indentation)

(defcustom gp-no-heredity-list '()
"See `sli-no-heredity-alist'."
:type '(repeat (cons (vector string string) sexp))
:initialize 'custom-initialize-default
:set 'gp-set-and-recompute-indentation
:group 'gp-indentation)

;; Relevant functions

(defun gp-set-and-recompute-indentation (sym val)
(set sym val)
(save-current-buffer
(mapcar
(lambda (bf)
(set-buffer bf)
(when (eq major-mode 'gp-script-mode)
(gp-learns-indentation)))
(buffer-list))))

(defun gp-learns-indentation nil
(require 'sli-tools)
(sli-tools gp-structures gp-shift-alist gp-separators
'sli-is-a-separatorp-default
gp-fixed-keys-alist
"\(^/\*--+--\*/\|^}[ t]*\)"
gp-keys-with-newline nil gp-add-to-key-alist
'("//" "\\") gp-no-heredity-list)
(setq sli-more-maidp gp-more-maidp
sli-tab-always-indent gp-tab-always-indent))

-----------------------------------------------------------

Attention, elisp 20 avait un petit bug à mon sens : il fallait
absolument indiquer
:initialize 'custom-initialize-default
dès que :set est utilisé.

Je peux commenter plus, mais je pense que cet exemple est assez
clair. Je vais continuer à lire ce groupe quelques jours.
Amitiés,
Olivier




Merci pour ces exemples, mais ce n'est pas forcément très simple à
comprendre.
Je vais essayer de m'en inspirer.

--
JJR
Olve
Le #24125631
Ils ne sont peut être pas adaptés.
En voici un autre :

(defcustom ses-export-latex-tabtype 'tabular
"Best to re-start your emacs session if you change this value."
:type '(choice (const tabularx) (const tabulary) (const tabular))
:group 'ses-export)

La valeur sera alors un symbole.

Plus compliqué :

(defcustom ses-export-latex-tabtype 'tabular
"Type de tableau (tabular, tabularx, tabulary)"
:type '(choice (const tabularx) (const tabulary) (const tabular))
:set (lambda (sym val) (ses-export-select-latex-tabtype val))
:initialize 'custom-initialize-set
;;if you use :set, you should specify:initialize!
:group 'ses-export)

(defun ses-export-select-latex-tabtype (val)
(cond
((eq val 'tabular) blablabla)
((eq val 'tabulary) bloblo)
((eq val 'tabularx) ouin)
(t (error "Untreated value of ses-export-latex-tabtype"))))

Je n'ai pas vérifié ce code. En ce moment, je suis plutôt en
perl / php et css qu'en lisp, il peut y avoir des couacs
non-négligeables !
Amitiés,
Olivier
Publicité
Poster une réponse
Anonyme