Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Chargement d'une bibliothèque s'appliquant un type de fichier.

5 views
Skip to first unread message

val...@laposte.net

unread,
Apr 16, 2012, 4:53:41 PM4/16/12
to
Bonjour à tous,

j'ai un tas de petites fonctions pratiques pour faire de la saisie de
code (html, C++, etc...). J'ai placé celles-ci dans des fichiers
différents et je les charge au moyen de la fonction require.

L'inconvénient de cette méthode, c'est que mes fonctions personnelles
et les raccourcis clavier qui vont avec sont valides dans tous les
modes.

Afin d'éviter des conflits entre tout ce petit monde, j'aimerais faire
en sorte qu'une bibliothèque soit uniquement valide pour le mode
idoine.

Donc, les hooks me semblaient la solution la plus appropriée pour
atteindre cet objectif.

Ce que j'ai compris des hooks, pour le mode HTML par exemple, peut
être résumé ainsi :

(defun my-html-library ()
(des_fonctions_en_plus_pour_le_mode_html)...
)
(add-hook 'html-mode-hook 'my-html-library)

Mais, si je charge ma bibliothèque personnelle "html.el" grâce à la
fonction my-html-library() en utilisant require, son usage est tout
aussi globale.

Je reviens donc au point de départ.

Quelqu'un aurait-il une idée là dessus?

Luc Habert

unread,
Apr 16, 2012, 5:06:03 PM4/16/12
to
val...@laposte.net :

> Afin d'éviter des conflits entre tout ce petit monde, j'aimerais faire
> en sorte qu'une bibliothèque soit uniquement valide pour le mode
> idoine.
>
> Donc, les hooks me semblaient la solution la plus appropriée pour
> atteindre cet objectif.
>
> Ce que j'ai compris des hooks, pour le mode HTML par exemple, peut
> être résumé ainsi :
>
> (defun my-html-library ()
> (des_fonctions_en_plus_pour_le_mode_html)...
> )
> (add-hook 'html-mode-hook 'my-html-library)

Il faut mettre dans le corps de my-html-library du code qui modifie des
variables locales au buffer, ou du moins, qui ne touche qu'à des variables
du mode html (en étant conscient que ça sera réexecuté à chaque fois qu'un
buffer passe dans ce mode, donc il faut que ce soit involutif; certains
modes ont un machinploum-mode-load-hook qui a l'avantage de n'être exécuté
qu'une seule fois). Par exemple, des local-set-key, qui s'appliquent à la
keymap du buffer, qui est en général partagée entre tous les buffers du même
mode.

Pascal J. Bourguignon

unread,
Apr 16, 2012, 5:27:58 PM4/16/12
to
Défini des modes mineurs, cf. define-minor-mode.

Chaque mode mineur a une keymap dans laquelle tu pourras définir les
bindings que tu veux. (info "(elisp) Defining Minor Modes") C-x C-e

Aussi, personnellement j'utilise H- (et secondairement A-) dans mes
key-bindings, aussi il n'y a aucune collision. Sur les claviers
actuels, il y a suffisament de touches sur la rangée du bas:

Control Return
Shift Shift
super Hyper Meta -------Space------- Meta Hyper super Alt


S- Shift
C- Control
M- Meta
H- Hyper
s- super
A- Alt


--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.

val...@laposte.net

unread,
Apr 17, 2012, 4:40:39 AM4/17/12
to
Luc.Haber...@normalesup.org (Luc Habert) writes:
> Il faut mettre dans le corps de my-html-library du code qui modifie des
> variables locales au buffer, ou du moins, qui ne touche qu'à des variables
> du mode html...

Donc, si je comprends bien, le hook ne peut servir qu'à opérer des
définitions de variables "locales" appartenant au buffer?

Si je cherche à définir des fonctions par ce biais, elles seront
forcément globales?

> (en étant conscient que ça sera réexecuté à chaque fois qu'un
> buffer passe dans ce mode, donc il faut que ce soit involutif;...

involutif? J'avoue ne pas connaître cette notion. J'ai trouvé une
entrée wikipedia, mais en math...

val...@laposte.net

unread,
Apr 17, 2012, 5:05:25 AM4/17/12
to
"Pascal J. Bourguignon" <p...@informatimago.com> writes:
>
> Défini des modes mineurs, cf. define-minor-mode.

OK, je ne suis pas encore très au fait de ce sujet, mais je vais m'y
mettre. J'ai cru comprendre que cela demandait pas mal d'effort.


>
> Chaque mode mineur a une keymap dans laquelle tu pourras définir les
> bindings que tu veux. (info "(elisp) Defining Minor Modes") C-x C-e

Chez moi, la commande ne passe pas... Je ne sais pas pourquoi les
pages info d'Emacs ne sont pas installées d'office sur une Debian!
J'ai cherché un peu, mais comme je manque de temps, je n'ai pas creusé
de ce coté : avis aux Debianistes qui passent par là! ;-)

En fait, l'idée est de rendre les key bindings locaux à un buffer,
sans se soucier de la porté des fonctions?

Il est vrai, qu'avec mes nons de fonctions très "frenchy", je ne
risque pas le conflit avec les fonctions "natives" d'Emacs. :-))

Luc Habert

unread,
Apr 17, 2012, 5:12:10 AM4/17/12
to
val...@laposte.net :

> Donc, si je comprends bien, le hook ne peut servir qu'à opérer des
> définitions de variables "locales" appartenant au buffer?

Il peut servir à n'importe quoi, mais c'est plus logique de ne toucher qu'à
des choses plus ou moins locales. Je dis plus ou moins parce que la keymap
est en général "locale au mode" et non au buffer.

> Si je cherche à définir des fonctions par ce biais, elles seront
> forcément globales?

Une définition de fonction via defun est toujours globale. On peut faire une
définition locale en stockant un lambda dans une variable locale, mais la
syntaxe d'appel est chiante, donc en pratique, on ne s'* pas et on fait des
définitions globales, en namespaçant à la main avec des prefixes.

>> (en étant conscient que ça sera réexecuté à chaque fois qu'un
>> buffer passe dans ce mode, donc il faut que ce soit involutif;...
>
> involutif? J'avoue ne pas connaître cette notion. J'ai trouvé une
> entrée wikipedia, mais en math...

Bah oui, l'info, c'est des maths. Une fonction involutive, en maths, c'est
une fonction telle que f(f(x)) = f(x). En l'occurence, je veux dire que si
l'on appelle plus d'une fois la fonction, on ne doit pas changer l'état
des variables globales après le premier appel (donc dans le formalisme de la
phrase précédente, x est l'état global et non un éventuel argument à la
fonction elisp, qui a priori est sans argument).

Un exemple de truc non involutif:

(setq 'html-mode-list-of-bluish-foobars (cons "blah" html-mode-list-of-bluish-foobars))

car à chaque fois que tu ouvres un .html, tu vas réajouter "blah" en tête de
la liste.

Un exemple de truc involutif:

(local-set-key [(control ?c) (control ?f)] 'do-something)

Pascal J. Bourguignon

unread,
Apr 17, 2012, 5:17:55 AM4/17/12
to
val...@laposte.net writes:

> "Pascal J. Bourguignon" <p...@informatimago.com> writes:
>>
>> Défini des modes mineurs, cf. define-minor-mode.
>
> OK, je ne suis pas encore très au fait de ce sujet, mais je vais m'y
> mettre. J'ai cru comprendre que cela demandait pas mal d'effort.

Ça dépend, il y a des modes qui sont simple, et on peut en faire d'aussi
compliqué que l'on veut.


>> Chaque mode mineur a une keymap dans laquelle tu pourras définir les
>> bindings que tu veux. (info "(elisp) Defining Minor Modes") C-x C-e
>
> Chez moi, la commande ne passe pas... Je ne sais pas pourquoi les
> pages info d'Emacs ne sont pas installées d'office sur une Debian!
> J'ai cherché un peu, mais comme je manque de temps, je n'ai pas creusé
> de ce coté : avis aux Debianistes qui passent par là! ;-)
>
> En fait, l'idée est de rendre les key bindings locaux à un buffer,
> sans se soucier de la porté des fonctions?
>
> Il est vrai, qu'avec mes nons de fonctions très "frenchy", je ne
> risque pas le conflit avec les fonctions "natives" d'Emacs. :-))
Oui, c'est une solution valable :-)

val...@laposte.net

unread,
Apr 17, 2012, 6:08:27 AM4/17/12
to
val...@laposte.net writes:

> Bonjour à tous,
>
> j'ai un tas de petites fonctions pratiques pour faire de la saisie de
> code (html, C++, etc...). J'ai placé celles-ci dans des fichiers
> différents et je les charge au moyen de la fonction require.
> ...
> Mais, si je charge ma bibliothèque personnelle "html.el" grâce à la
> fonction my-html-library() en utilisant require, son usage est tout
> aussi globale.
>
> Je reviens donc au point de départ.
>
> Quelqu'un aurait-il une idée là dessus?


Bon, est bien merci à tous pour vos conseils éclairants :-)

Vincent Belaïche

unread,
Apr 20, 2012, 12:50:45 AM4/20/12
to Vincent Belaïche
val...@laposte.net writes:

> val...@laposte.net writes:
>

[...]

>
>
> Bon, est bien merci à tous pour vos conseils éclairants :-)

Salut,

Juste un petit commentaire en plus, si ton problème de base c'est de
définir des raccourcis clavier locaux, utilise

(local-set-key KEY COMMAND)

dans ta fonction crochet.

À+,
Vincent.
0 new messages