Discussion:
`add-to-list` : factorisation ?
(trop ancien pour répondre)
Denis Bitouzé
2020-05-13 20:54:38 UTC
Permalink
Bonsoir,

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

--8<---------------cut here---------------start------------->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-indentation))
(add-to-list 'LaTeX-indent-environment-list '("bidule" current-indentation)))
--8<---------------cut here---------------end--------------->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 endroits
différents la liste :

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

Merci d'avance !
--
Denis
Jean-Jacques Rétorré
2020-05-14 06:39:55 UTC
Permalink
Post by Denis Bitouzé
Bonsoir,
(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-indentation))
(add-to-list 'LaTeX-indent-environment-list '("bidule" current-indentation)))
┌────
│ "truc"
│ "machin"
│ "bidule"
└────
Concernant `add-to-list`, y aurait-il moyen de factoriser la chose, de
1. ni `'LaTeX-indent-environment-list '` ;
2. ni ` current-indentation` ?
L'idéal serait évidemment de ne pas avoir maintenir à deux endroits
┌────
│ "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é
2020-05-14 16:05:21 UTC
Permalink
Post by Jean-Jacques Rétorré
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-indentation)
│ (list env current-indentation)
│ (let* ((x (list env current-indentation))) (if (member x LaTeX-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-tail-- (cdr --dolist-tail--))) (setq env nil) (let* ((x (list env current-indentation))) (if (member x LaTeX-indent-environment-list) LaTeX-indent-environment-list (setq LaTeX-indent-environment-list (cons x LaTeX-indent-environment-list)))))
│ eval((let ((--dolist-tail-- LaTeX-verbatim-environments-local) env) (while --dolist-tail-- (setq env (car --dolist-tail--)) (setq --dolist-tail-- (cdr --dolist-tail--))) (setq env nil) (let* ((x (list env current-indentation))) (if (member x LaTeX-indent-environment-list) LaTeX-indent-environment-list (setq LaTeX-indent-environment-list (cons x LaTeX-indent-environment-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
Jean-Jacques Rétorré
2020-05-14 17:36:34 UTC
Permalink
Post by Denis Bitouzé
Post by Jean-Jacques Rétorré
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...
(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))))
┌────
│ Debugger entered--Lisp error: (void-variable current-indentation)
Ç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'avait 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-indentation))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;


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 demande.

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 mode 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 exemple)
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 un 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é
2020-05-18 15:38:10 UTC
Permalink
Post by Jean-Jacques Rétorré
J'avais juste oublié de quoter curent-indentation, J'ai pompé
honteusement sur ton code où ce n'est pas nécessaire, ça m'avait 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-indentation))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 demande.
OK, merci ! Sauf qu'il y avait une parenthèse en trop : tout le charme
de elisp ! ;)
Post by Jean-Jacques Rétorré
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 mode
pas à pas et contrôler les variables en cours d'exécution. C'est très
pédagogique pour comprendre comment ça marche.
Hum ! J'avais essayé de comprendre tout seul comme un grand comment ça
marchait mais la page :

┌────
│ https://www.gnu.org/software/emacs/manual/html_node/elisp/Building-Lists.html
└────

m'a paru d'une décourageante obscurité...
Post by Jean-Jacques Rétorré
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
exemple) de placer le point n'importe où dans la forme et de taper C-u
C-M x.
Argh ! Je dois avoir un keybinding maison que fait que ça ne marche
pas... (C-M crée une nouvelle ligne).
Post by Jean-Jacques Rétorré
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 un 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.
OK, merci pour l'information.
Post by Jean-Jacques Rétorré
J'aimerais qu'il y ait un machin comme ça pour décortiquer le code
TeX...
Il me semble qu'il y a des choses un peu similaires, non ?
Post by Jean-Jacques Rétorré
Un peu hors sujet, le fichier d'initialisation conseillé maintenant
est .emacs.d/init.el.
Oui, c'est ce que j'utilise en fait mais n'avait parlé que de `.emacs`
car je ne savais pas si tout le monde était au courant.
Post by Jean-Jacques Rétorré
La nouvelle macro /use-package/
Comment cela s'utilise-t-il ?
Post by Jean-Jacques Rétorré
simplifie bien l'écriture du fichier d'initialisation et le rend plus
modulaire.
En fait, j'utilise essentiellement le monstre de `.init.el` qu'est celui
(ÀMHA très bien fait) de mon ami Fabrice Niessen :

┌────
│ https://github.com/fniessen/emacs-leuven
└────
--
Denis
Denis Bitouzé
2020-05-18 16:08:13 UTC
Permalink
Post by Jean-Jacques Rétorré
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 demande.
Bon, finalement, ça marchait dans mon instance Emacs déjà ouverte, mais
le redémarrage plante. Si je commente la ligne `(dolist ...)` puis
redémarre, Emacs se lance normalement et un C-x C-e en fin de cette
ligne me donne :

┌────
│ Debugger entered--Lisp error: (void-variable LaTeX-indent-environment-list)
│ (member x LaTeX-indent-environment-list)
│ (if (member x LaTeX-indent-environment-list) LaTeX-indent-environment-list (setq LaTeX-indent-environment-list (cons x LaTeX-indent-environment-list)))
│ (let* ((x (list env (function current-indentation)))) (if (member x LaTeX-indent-environment-list) LaTeX-indent-environment-list (setq LaTeX-indent-environment-list (cons x LaTeX-indent-environment-list))))
│ (while --dolist-tail-- (setq env (car --dolist-tail--)) (let* ((x (list env (function current-indentation)))) (if (member x LaTeX-indent-environment-list) LaTeX-indent-environment-list (setq LaTeX-indent-environment-list (cons x LaTeX-indent-environment-list)))) (setq --dolist-tail-- (cdr --dolist-tail--)))
│ (let ((--dolist-tail-- LaTeX-verbatim-environments-local) env) (while --dolist-tail-- (setq env (car --dolist-tail--)) (let* ((x (list env (function current-indentation)))) (if (member x LaTeX-indent-environment-list) LaTeX-indent-environment-list (setq LaTeX-indent-environment-list (cons x LaTeX-indent-environment-list)))) (setq --dolist-tail-- (cdr --dolist-tail--))))
│ eval((let ((--dolist-tail-- LaTeX-verbatim-environments-local) env) (while --dolist-tail-- (setq env (car --dolist-tail--)) (let* ((x (list env (function current-indentation)))) (if (member x LaTeX-indent-environment-list) LaTeX-indent-environment-list (setq LaTeX-indent-environment-list (cons x LaTeX-indent-environment-list)))) (setq --dolist-tail-- (cdr --dolist-tail--)))) 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)
└────

Pourtant, `C-h v RET LaTeX-indent-environment-list RET` donne :

┌────
│ LaTeX-indent-environment-list is a variable defined in ‘latex.el’.
│ Its value is shown below.

│ Documentation:
│ Alist of environments with special indentation.
│ The second element in each entry is the function to calculate the
│ indentation level in columns.

│ Environments present in this list are not filled by filling
│ functions, see ‘LaTeX-fill-region-as-paragraph’.

│ You can customize this variable.

│ Value:
│ (("sverbatim" current-indentation)
│ ("comment" current-indentation)
│ ("tikzpicture" current-indentation)
│ ("verbatim" current-indentation)
│ ("verbatim*" current-indentation)
│ ("filecontents" current-indentation)
│ ("filecontents*" current-indentation)
│ ("tabular" LaTeX-indent-tabular)
│ ("tabular*" LaTeX-indent-tabular)
│ ("align" LaTeX-indent-tabular)
│ ("align*" LaTeX-indent-tabular)
│ ("array" LaTeX-indent-tabular)
│ ("eqnarray" LaTeX-indent-tabular)
│ ("eqnarray*" LaTeX-indent-tabular)
│ ("displaymath")
│ ("equation")
│ ("equation*")
│ ("picture")
│ ("tabbing"))
│ Original value was
│ (("verbatim" current-indentation)
│ ("verbatim*" current-indentation)
│ ("filecontents" current-indentation)
│ ("filecontents*" current-indentation)
│ ("tabular" LaTeX-indent-tabular)
│ ("tabular*" LaTeX-indent-tabular)
│ ("align" LaTeX-indent-tabular)
│ ("align*" LaTeX-indent-tabular)
│ ("array" LaTeX-indent-tabular)
│ ("eqnarray" LaTeX-indent-tabular)
│ ("eqnarray*" LaTeX-indent-tabular)
│ ("displaymath")
│ ("equation")
│ ("equation*")
│ ("picture")
│ ("tabbing"))
└────

la différence entre les valeurs courantes et originales étant dues au
fait que `emacs-leuven` contient :

┌────
│ (add-to-list 'LaTeX-indent-environment-list '("tikzpicture" current-indentation))
│ (add-to-list 'LaTeX-indent-environment-list '("comment" current-indentation))
│ (add-to-list 'LaTeX-indent-environment-list '("sverbatim" current-indentation))
└────
--
Denis
Denis Bitouzé
2020-05-20 09:50:34 UTC
Permalink
Post by Denis Bitouzé
Post by Jean-Jacques Rétorré
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 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
***@gnu.org) :

--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-indentation))))
--8<---------------cut here---------------end--------------->8---
--
Denis
Jean-Jacques Rétorré
2020-05-20 16:04:47 UTC
Permalink
Post by Denis Bitouzé
Post by Denis Bitouzé
Post by Jean-Jacques Rétorré
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 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-indentation))))
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 nouvelle
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, merci 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 package, 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 facilite
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.

Loading...