`add-to-list` : factorisation ?

Le
Denis Bitouzé
Bonsoir,

dans mon `.emacs`, j'ai quelque chose qui ressemble à ceci :

--8<cut herestart->8
(setq LaTeX-verbatim-environments-local '("truc"
"machin"
"bidule"
))

(with-eval-after-load "latex"
(add-to-list 'LaTeX-indent-environment-list '("truc" current-indentation))
(add-to-list 'LaTeX-indent-environment-list '("machin" current-indentatio=
n))
(add-to-list 'LaTeX-indent-environment-list '("bidule" current-indentatio=
n)))
--8<cut hereend>8

mais avec une liste beaucoup plus longue que seulement :

┌────
│ "truc"
│ "machin"
│ "bidule"
└────

Concernant `add-to-list`, y aurait-il moyen de factoriser la chose, de
sorte à ne répéter :

1. ni `'LaTeX-indent-environment-list '` ;
2. ni ` current-indentation` ?

L'idéal serait évidemment de ne pas avoir maintenir à deux e=
ndroits
différents la liste :

┌────
│ "truc"
│ "machin"
│ "bidule"
└────

Merci d'avance !
--
Denis
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
jj.retorre
Le #26546401
mer. 13 mai 2020, Denis Bitouzé
Bonsoir,
dans mon `.emacs`, j'ai quelque chose qui ressemble à ceci :
(setq LaTeX-verbatim-environments-local '("truc"
"machin"
"bidule"
))
(with-eval-after-load "latex"
(add-to-list 'LaTeX-indent-environment-list '("truc" current-indentatio n))
(add-to-list 'LaTeX-indent-environment-list '("machin" current-indentat ion))
(add-to-list 'LaTeX-indent-environment-list '("bidule" current-indentat ion)))
mais avec une liste beaucoup plus longue que seulement :
┌────
│ "truc"
│ "machin"
│ "bidule"
└────
Concernant `add-to-list`, y aurait-il moyen de factoriser la chose, de
sorte à ne répéter :
1. ni `'LaTeX-indent-environment-list '` ;
2. ni ` current-indentation` ?
L'idéal serait évidemment de ne pas avoir maintenir à deux endroits
différents la liste :
┌────
│ "truc"
│ "machin"
│ "bidule"
└────
Merci d'avance !

J'aurais proposé
(dolist (env LaTeX-verbatim-environments-local (add-to-list
'LaTeX-indent-environment-list (list env current-indentation))))
Ça me paraît vraiment trop simple...
--
JJR.
Denis Bitouzé
Le #26546445
Le 14/05/20 à 08h39, Jean-Jacques Rétorré a écrit :
J'aurais proposé
(dolist (env LaTeX-verbatim-environments-local (add-to-list
'LaTeX-indent-environment-list (list env current-indentation))))
Ça me paraît vraiment trop simple...

En effet. Lancer C-x C-e à la fin des 2 instructions suivantes :
(setq LaTeX-verbatim-environments-local '("truc"
"machin"
"bidule"
))
(dolist (env LaTeX-verbatim-environments-local (add-to-list
'LaTeX-indent-environment-list (list env current-indentation))))
conduit pour la 2e à :
┌────
│ Debugger entered--Lisp error: (void-variable current-indentatio n)
│ (list env current-indentation)
│ (let* ((x (list env current-indentation))) (if (member x LaTe X-indent-environment-list) LaTeX-indent-environment-list (setq LaTeX-indent -environment-list (cons x LaTeX-indent-environment-list))))
│ (let ((--dolist-tail-- LaTeX-verbatim-environments-local) env ) (while --dolist-tail-- (setq env (car --dolist-tail--)) (setq --dolist-ta il-- (cdr --dolist-tail--))) (setq env nil) (let* ((x (list env current-ind entation))) (if (member x LaTeX-indent-environment-list) LaTeX-indent-envir onment-list (setq LaTeX-indent-environment-list (cons x LaTeX-indent-enviro nment-list)))))
│ eval((let ((--dolist-tail-- LaTeX-verbatim-environments-local ) env) (while --dolist-tail-- (setq env (car --dolist-tail--)) (setq --doli st-tail-- (cdr --dolist-tail--))) (setq env nil) (let* ((x (list env curren t-indentation))) (if (member x LaTeX-indent-environment-list) LaTeX-indent- environment-list (setq LaTeX-indent-environment-list (cons x LaTeX-indent-e nvironment-list))))) nil)
│ elisp--eval-last-sexp(nil)
│ eval-last-sexp(nil)
│ funcall-interactively(eval-last-sexp nil)
│ call-interactively(eval-last-sexp nil nil)
│ command-execute(eval-last-sexp)
└────
Et, là, je dois dire que je n'y entrave que pouic...
Merci en tout cas.
--
Denis
jj.retorre
Le #26546449
jeu. 14 mai 2020, Denis Bitouzé
Le 14/05/20 à 08h39, Jean-Jacques Rétorré a écrit :
J'aurais proposé
(dolist (env LaTeX-verbatim-environments-local (add-to-list
'LaTeX-indent-environment-list (list env current-indentation))))
Ça me paraît vraiment trop simple...

En effet. Lancer C-x C-e à la fin des 2 instructions suivantes :
(setq LaTeX-verbatim-environments-local '("truc"
"machin"
"bidule"
))
(dolist (env LaTeX-verbatim-environments-local (add-to-list
'LaTeX-indent-environment-list (list env current-indentation))))
conduit pour la 2e à :
┌────
│ Debugger entered--Lisp error: (void-variable current-indentat ion)

Ça veut dire que current-indentation n'a pas de valeur connue : normal,
c'est une fonction et elle n'en a pas dans ce contexte.
J'avais juste oublié de quoter curent-indentation, J'ai pompé
honteusement sur ton code où ce n'est pas nécessaire, ça m'a vait enduit d'erreur...
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq LaTeX-verbatim-environments-local '("truc"
"machin"
"bidule"
))
(dolist (env LaTeX-verbatim-environments-local)
(add-to-list 'LaTeX-indent-environment-list (list env #'current-inden tation))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;
Cette fois j'ai testé (je ne l'avais pas fait honte à moi )
car ça m'avais paru trop facile, maintenant je comprends mieux ta dema nde.
Tu devrais t'initier à Elisp, c'est un langage très facile à apprendre
et l'environnement est très sympa : On peut exécuter du code en m ode pas
à pas et contrôler les variables en cours d'exécution. C'est très
pédagogique pour comprendre comment ça marche.
Par exemple, pour exécuter la deuxième forme (après avoir ex écuté la
première) il suffit, dans un buffer en mode elisp, (scratch par exempl e)
de placer le point n'importe où dans la forme et de taper C-u C-M x. Le
point se place au début de la forme et l'exécution avance avec la barre
d'espacement. En prenant des exemples simples et en les décortiquant de
cette façon on peut apprendre très rapidement, du moins si on a u n peu
de culture algorithmique... En plus, C-h f sur le nom d'une fonction
renvoie une aide sur la fonction et C-h v fait la même chose pour les
variables.
J'aimerais qu'il y ait un machin comme ça pour décortiquer le code
TeX...
Un peu hors sujet, le fichier d'initialisation conseillé maintenant
est .emacs.d/init.el. La nouvelle macro /use-package/ simplifie bien
l'écriture du fichier d'initialisation et le rend plus modulaire.
--
JJR.
Denis Bitouzé
Le #26546875
Le 18/05/20 à 18h08, Denis Bitouzé a écrit :
Le 14/05/20 à 19h36, Jean-Jacques Rétorré a écrit :
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq LaTeX-verbatim-environments-local '("truc"
"machin"
"bidule"
))
(dolist (env LaTeX-verbatim-environments-local)
(add-to-list 'LaTeX-indent-environment-list (list env #'current-in dentation))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;
Cette fois j'ai testé (je ne l'avais pas fait honte à moi ) ca r ça
m'avais paru trop facile, maintenant je comprends mieux ta demande.

Bon, finalement, ça marchait dans mon instance Emacs déjà ouverte, mais
le redémarrage plante.

En fait, je pense que Jean-Jacques avait, comme d'habitude, raison mais
qu'il a juste oublié une ligne dans son code (`(with-eval-after-load
"latex"`), ce qui expliquerait la parenthèse que je croyais
superfétatoire. Voici le code fonctionnel (réponse obtenue sur
) :
--8<---------------cut here---------------start------------->8---
(setq LaTeX-verbatim-environments-local '("truc"
"machin"
"bidule"
))
(with-eval-after-load "latex"
(dolist (env LaTeX-verbatim-environments-local)
(add-to-list 'LaTeX-indent-environment-list (list env #'current-indentati on))))
--8<---------------cut here---------------end--------------->8---
--
Denis
jj.retorre
Le #26546908
mer. 20 mai 2020, Denis Bitouzé
Le 18/05/20 à 18h08, Denis Bitouzé a écrit :
Le 14/05/20 à 19h36, Jean-Jacques Rétorré a écrit :
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq LaTeX-verbatim-environments-local '("truc"
"machin"
"bidule"
))
(dolist (env LaTeX-verbatim-environments-local)
(add-to-list 'LaTeX-indent-environment-list (list env #'current-i ndentation))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;
Cette fois j'ai testé (je ne l'avais pas fait honte à moi ) c ar ça
m'avais paru trop facile, maintenant je comprends mieux ta demande.

Bon, finalement, ça marchait dans mon instance Emacs déjà ouverte, mais
le redémarrage plante.

En fait, je pense que Jean-Jacques avait, comme d'habitude, raison mais
qu'il a juste oublié une ligne dans son code (`(with-eval-after-load
"latex"`), ce qui expliquerait la parenthèse que je croyais
superfétatoire. Voici le code fonctionnel (réponse obtenue sur
) :
(setq LaTeX-verbatim-environments-local '("truc"
"machin"
"bidule"
))
(with-eval-after-load "latex"
(dolist (env LaTeX-verbatim-environments-local)
(add-to-list 'LaTeX-indent-environment-list (list env #'current-indenta tion))))

Je pensais que ça allait de soi de placer le code dans un
eval-after-load. La question ne portait que sur la "mise en facteur" et
mon code le fait.
Pour ma part, je n'aurais pas fait ça, j'aurais utilisé la nouvel le
macro /use-package/ qui simplifie l'écriture des fichiers
d'initialisation et qui les rend plus modulaires.
J'ai mis la partie initialisation d'AUCTeX sur un pastebin pour ceux que
ça intéresse. J'ai pompé pas mal sur le web, mais certaines fonctions
sont de moi. Chez moi ça marche. Si ça ne marche pas ailleurs, me rci de
ne taper qu'avec modération.
Le code est placé dans mon bloc use-package dans la rubrique :config
d'après la doc, ce code s'exécute après le chargement du pac kage, donc
je pense qu'il fait la même chose que eval-after-load
,----
| http://ix.io/2mOu
`----
Le code est dans un bloc de code elisp du fichier init.org. La commande
org-babel-tangle se charge de confectionner le fichier init.el avec tous
les blocs de code emacs-lisp qui sont marqués pour ça. Ce qui fac ilite
la mise au point du fichier init, on peut même évaluer un à un les blocs
de code pour les tester.
La macro use-package est documentée soit sur le site
https://github.com/jwiegley/use-package/blob/master/use-package.org
--
JJR.
Publicité
Poster une réponse
Anonyme