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

Comment blinder defcustom

3 réponses
Avatar
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

3 réponses

Avatar
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
Avatar
JJ. Rétorré
Olve disait le 12/25/11 que :

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
Avatar
Olve
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