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

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

8 réponses
Avatar
valrik
Bonjour =C3=A0 tous,

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

L'inconv=C3=A9nient de cette m=C3=A9thode, c'est que mes fonctions personne=
lles
et les raccourcis clavier qui vont avec sont valides dans tous les
modes.

Afin d'=C3=A9viter des conflits entre tout ce petit monde, j'aimerais faire
en sorte qu'une biblioth=C3=A8que soit uniquement valide pour le mode
idoine.

Donc, les hooks me semblaient la solution la plus appropri=C3=A9e pour
atteindre cet objectif.

Ce que j'ai compris des hooks, pour le mode HTML par exemple, peut
=C3=AAtre r=C3=A9sum=C3=A9 ainsi :

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

Mais, si je charge ma biblioth=C3=A8que personnelle "html.el" gr=C3=A2ce =
=C3=A0 la
fonction my-html-library() en utilisant require, son usage est tout
aussi globale.

Je reviens donc au point de d=C3=A9part.

Quelqu'un aurait-il une id=C3=A9e l=C3=A0 dessus?

8 réponses

Avatar
Luc.Habert.00__arjf
:

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.
Avatar
Pascal J. Bourguignon
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.

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?




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 {}.
Avatar
valrik
(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 var iables
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é à chaq ue 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...

certains
modes ont un machinploum-mode-load-hook qui a l'avantage de n'être e xé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 l es buffers du même
mode.
Avatar
valrik
"Pascal J. Bourguignon" 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. :-))


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
Avatar
Luc.Habert.00__arjf
:

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)
Avatar
Pascal J. Bourguignon
writes:

"Pascal J. Bourguignon" 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 :-)


--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Avatar
valrik
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 :-)
Avatar
vincent.belaiche
writes:

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.