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

Écriture d'une fonction lisp dans ~/.emacs

28 réponses
Avatar
Jean-Claude Marques
Bonjour à tous.

Néophyte complet en Emacs-Lisp, j'ai souvent à écrire \og{} ... \fg{}
(LaTeX) et j'ai tenté d'écrire une fonction Lisp pour qu'Emacs le fasse
à ma place. J'ai inséré dans le ~/.emacs le code ci-dessous :

(defun tex-insert-og-fg nil
(insert "\\og{}" )
(save-excursion
(insert "\\fg{}"))
)

(define-key LaTeX-mode-map [C-f6] 'tex-insert-og-fg)

Lors de C-f6, j'ai le message :
Wrong type argument: commandp, tex-insert-og-fg


Par M-x tex-TAB, la fonction tex-insert-og-fg n'apparaît pas dans la
liste (alors qu'une autre commençant par la même chaîne de caractères
apparaît).

Il y a donc un bug, mais je ne le vois pas.
Si quelqu'un a une idée (et je n'en doute pas !)
En attendant vos réponses, je vous souhaite à tous une bonne et heureuse
nouvelle année !

JC

10 réponses

1 2 3
Avatar
Ralf Angeli
* JJ. Rétorré (2010-12-31) writes:

Denis Bitouzé disait le 12/31/10 que :

Je regrette d'ailleurs que ceci ne fonctionne qu'avec l'option frenchb
de babel car je recommande plutôt de recourir à l'option de classe
french.



Il suffit peut-être de se bricoler un
french.el à la façon du frenchb.el
et de le mettre dans ses fichiers de style personnels ?



... ou télécharger la version développement d'AUCTeX.

--
Ralf
Avatar
Denis Bitouzé
Le vendredi 31/12/10 à 11h59,
JJ. Rétorré <jj.r&torr&@gmail.com> a écrit :

Il suffit peut-être de se bricoler un
french.el à la façon du frenchb.el
et de le mettre dans ses fichiers de style personnels ?

(TeX-add-style-hook
"french"
(lambda ()
....
(setq TeX-quote-language
`("french" "og "
(lambda ()
(concat "fg"
(unless (member "xspace" TeX-active-styles)
"{}"))) ,TeX-quote-after-quote))
(run-hooks 'TeX-language-fr-hook)))



En fait, je me suis souvenu que j'avais exposé ce problème sur la liste
AucTeX :

http://thread.gmane.org/gmane.emacs.auctex.general/3654

mais n'avais pas eu le temps de tester la solution proposée par Ralf
Angeli, à savoir le french.el contenant :

(TeX-add-style-hook
"french"
(lambda ()
(when (and (member "babel" TeX-active-styles)
(not (member "frenchpro" TeX-active-styles))
(not (member "frenchle" TeX-active-styles))
(not (member "mlp" TeX-active-styles)))
(TeX-run-style-hooks "frenchb"))))

Malheureusement, tant ta solution que celle de Ralf, placée dans un
fichier french.el copié dans le répertoire :

/usr/share/emacs/site-lisp/auctex/style/

ne donne satisfaction sur un fichier tel que le suivant :

documentclass{article}
usepackage[french]{babel}
begin{document}

end{document}

Peut-être ai-je oublié de lancer une action type mktexlsr pour LaTeX.

Par ailleurs, verrais-tu un moyen de faire en sorte que ceci fonctionne
non seulement sur le .tex précédent, mais aussi sur le suivant :

documentclass[french]{article}
usepackage{babel}
begin{document}

end{document}

Merci !
--
Denis
Avatar
Stéphane Dutailly
Bonjour à tous,

J'ai essayé mais j'ai un problème avec le raccourci: si je mets

(define-key LaTeX-mode-map [C-f6] 'tex-insert-og-fg)

j'obtiens une erreur:

Symbol's value as variable is void: LaTeX-mode-map

alors que si je mets:

(global-set-key [C-f6] 'tex-insert-og-fg)

alors tout va bien.

Voyez-vous d'où viens le problème?
Merci d'avance et bon réveillon.

Stéphane



Le 31/12/2010 09:21, Erwan David a écrit :
Jean-Claude Marques écrivait :

Bonjour à tous.

Néophyte complet en Emacs-Lisp, j'ai souvent à écrire og{} ... fg{}
(LaTeX) et j'ai tenté d'écrire une fonction Lisp pour qu'Emacs le
fasse à ma place. J'ai inséré dans le ~/.emacs le code ci-dessous :

(defun tex-insert-og-fg nil
(insert "og{}" )
(save-excursion
(insert "fg{}"))
)

(define-key LaTeX-mode-map [C-f6] 'tex-insert-og-fg)

Lors de C-f6, j'ai le message :
Wrong type argument: commandp, tex-insert-og-fg


Par M-x tex-TAB, la fonction tex-insert-og-fg n'apparaît pas dans la
liste (alors qu'une autre commençant par la même chaîne de caractères
apparaît).

Il y a donc un bug, mais je ne le vois pas.
Si quelqu'un a une idée (et je n'en doute pas !)
En attendant vos réponses, je vous souhaite à tous une bonne et
heureuse nouvelle année !



Il faut déclarer ta fonction comme interactive. Il est aussi boon de
mettre une chaine de commentaire qui te facilitera la vie quand
quelqu'un d'autre utilisera ta fonction (ou toi dans 6 mois...)


(defun tex-insert-og-fg nil
"Insert pair of french guillemets"
(interactive)
(insert "og{}" )
(save-excursion
(insert "fg{}"))
)



Avatar
Jean-Claude Marques
Stéphane Dutailly a écrit :
Bonjour à tous,

J'ai essayé mais j'ai un problème avec le raccourci: si je mets

(define-key LaTeX-mode-map [C-f6] 'tex-insert-og-fg)

j'obtiens une erreur:

Symbol's value as variable is void: LaTeX-mode-map


Environnement : Auctex + major mode LaTeX
extrait du ~/.emacs:
[SNIP]
(require 'tex-site)
[SNIP]

Cette variable est définie dans le latex.el.

Cordialement

JC

alors que si je mets:

(global-set-key [C-f6] 'tex-insert-og-fg)

alors tout va bien.

Voyez-vous d'où viens le problème?
Merci d'avance et bon réveillon.

Stéphane

Avatar
Lucas Levrel
Le 31 décembre 2010, Stéphane Dutailly a écrit :

Bonjour à tous,

J'ai essayé mais j'ai un problème avec le raccourci: si je mets

(define-key LaTeX-mode-map [C-f6] 'tex-insert-og-fg)

j'obtiens une erreur:

Symbol's value as variable is void: LaTeX-mode-map

alors que si je mets:

(global-set-key [C-f6] 'tex-insert-og-fg)

alors tout va bien.

Voyez-vous d'où viens le problème?



De ce que je comprends, c'est que LaTeX-mode-map n'existe qu'une fois
auctex chargé, ce qui n'est pas le cas quand tu ouvres emacs (à moins que
tu le forces, mais c'est un peu bourrin si tu ne fais pas que du LaTeX
avec emacs).

Donc moi j'ai ça :

(defun my-LaTeX-hook ()
...des tas de trucs dont par exemple...
(define-key LaTeX-mode-map "{" 'skeleton-pair-insert-maybe)
)

(add-hook 'LaTeX-mode-hook 'my-LaTeX-hook)

du coup les trucs dans my-LaTeX-hook ne sont chargés qu'au lancement du
LaTeX-mode.

--
LL
Avatar
Stéphane Dutailly
Le 31/12/2010 15:25, Jean-Claude Marques a écrit :
Stéphane Dutailly a écrit :
Bonjour à tous,

J'ai essayé mais j'ai un problème avec le raccourci: si je mets

(define-key LaTeX-mode-map [C-f6] 'tex-insert-og-fg)

j'obtiens une erreur:

Symbol's value as variable is void: LaTeX-mode-map


Environnement : Auctex + major mode LaTeX
extrait du ~/.emacs:
[SNIP]
(require 'tex-site)
[SNIP]

Cette variable est définie dans le latex.el.

Cordialement

JC

alors que si je mets:

(global-set-key [C-f6] 'tex-insert-og-fg)

alors tout va bien.

Voyez-vous d'où viens le problème?
Merci d'avance et bon réveillon.

Stéphane






Bonjour Jean-Claude,

Si je rajoute

(require 'tex-site)

dans mon .emacs, ça ne change rien (j'ai toujours la même erreur...)

Stéphane
Avatar
Pascal J. Bourguignon
(Luc Habert) writes:

Pour précision:

Erwan David :

(defun tex-insert-og-fg nil





Il vaut mieux utiliser les parentheses pour les listes de paramètres:

(defun tex-insert-og-fg ()

Il est vrai que pour lisp, nil et () sont lus exactement comme le même
objet, le symbol nil, mais pour le programmeur qui va lire le source, il
y a différentes connotations:

() code, liste vide.
nil code, booléen faux.
'() literal, liste vide.
'nil literal, symbole nil.


"Insert pair of french guillemets"



La documentation de la fonction, c'est facultatif.



Non. D'abord, une fois qu'on a la déclaration (interactive), ce n'est
plus une fonction, mais une commande. C'est à dire qu'elle est
directement accessible via l'interface utilisateur. Par conséquent, la
documentation n'est plus facultative! Un programmeur n'a pas le droit
de priver les utilisateurs de la documentation!

Techniquement, emacs lisp ne va pas se plaindre, mais c'est plus grave:
au lieu d'un message d'erreur, on risque de prendre un annuaire
téléphonique sur le crâne!


(interactive)



Là est le point important. Pour qu'une fonction puisse etre appellée via un
racourci clavier ou M-x, il faut qu'elle soit marquée comme interactive.
C'est pas uniquement pour faire chier, ça permet de préciser quel type
d'argument attendre du minibuffer, via une string qu'on passe en argument à
interactive. Si une fonction n'est pas marquée comme interactive, on ne peut
l'appeller que via M-:.



Ton paragraphe serait vrai si tu parlais de commandes.

Quand aux fonctions, elles sont accessible depuis l'interface
utilisateur, mais en passant par la commande eval-expression, M-:

M-: (tex-insert-og-fg) RET


--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Avatar
Denis Bitouzé
Le vendredi 31/12/10 à 12h18,
Ralf Angeli a écrit :

... ou télécharger la version développement d'AUCTeX.



Pourrais-tu m'indiquer (une page expliquant) comment procéder ?

Merci d'avance.
--
Denis
Avatar
Pascal J. Bourguignon
(Luc Habert) writes:

Erwan David :

C'est pour ça que j'ai dit



Pardon, j'avais zappé ton premier paragraphe. Mal réveillé...

qu'il était bon de mettre une documentation



Perso, je suis assez réservé sur ce point. Dans la plupart des cas, le nom
de la fonction est suffisant pour décrire ce qu'elle fait; je vois mal
l'intéret d'écrire un commentaire qui se contente de paraphraser ce nom (et
ça m'agace plus qu'autre chose quand j'en lis, parce que je perds du temps à
lire quelque chose qui ne m'apprend rien).



Il y a une autre connotation, c'est qu'une fonction ou une commande qui
n'est pas documentée, est une fonction ou une commande privée, qui ne
doit pas être utilsée directement.

Donc une commande ou une fonction que l'on veut fournir comme API
publique, ou interface utilisateur DOIT ÊTRE DOCUMENTÉE!


--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Avatar
Luc.Habert.00__arjf
"Pascal J. Bourguignon" :

Ton paragraphe serait vrai si tu parlais de commandes.



Blah...

Quand aux fonctions, elles sont accessible depuis l'interface
utilisateur, mais en passant par la commande eval-expression, M-:

M-: (tex-insert-og-fg) RET



C'est exactement ce que j'ai dit.
1 2 3