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

creer un mode pour un langage

4 réponses
Avatar
cyril.guilloud
Bonjour,

Je voudrai creer un nouveau mode emacs pour un langage de macro. Pour
commencer, faire du syntax highlighting sur les mots clef puis faire de
l'indentation automatique.

Est-ce que quellqu'un aurai des exemples simples pour programmer ca ?
ou est-ce que je dois aller voir dans les modes pre-definis ?

Est-ce qu'il faut une grammaire du langage pour pouvoir faire de
l'indentation ou des petits "trucs" du style :
<< apres une "{" ajouter 4 espace d'indentation >> suffisent ?

merci d'avance

Cyril.

4 réponses

Avatar
drkm
writes:

Est-ce que quellqu'un aurai des exemples simples pour programmer ca ?
ou est-ce que je dois aller voir dans les modes pre-definis ?



Cfr. (info: (elisp)Modes), (info: (elisp)Major Modes) et (info:
(elisp)Example Major Modes). Tu peux peut-être dériver d'un mode
existant, (info: (elisp)Derived Modes).

Est-ce qu'il faut une grammaire du langage pour pouvoir faire de
l'indentation ou des petits "trucs" du style :
<< apres une "{" ajouter 4 espace d'indentation >> suffisent ?



Cela dépend. De toute façon, l'indentation n'est pas ajoutée
automatiquement. Soit tu as une commande de reformatage de tout
le buffer, ou d'une région, soit tu fournis une commande pour
TAB, soit tu fournis une commande pour RET (qui indente la
nouvelle ligne), etc.

Et tout dépend du langage, et de la qualité que tu veux pour
ton mode. Surcharger RET pour insérer 4 espaces de plus que la
ligne précédente lorsque la ligne se termine par '{' est
extrêmement simple. Mais détecter au préalable si l'on est dans
une chaîne de caractères ou un commentaire l'est parfois moins.

Mais suivant tes capacités et le temps qui t'est disponible, tu
trouveras peut-être le comportement initial suffisant, même si
quelques fois cela donne quelque chose de bizarre dans une chaîne
de caractères.

Si tu veux parser ton buffer avec exactitude (si ton langage
n'est pas simplissime), tu sera peut-être intéressé par Semantic
<URL:http://cedet.sf.net/>.

À quoi ressemble le langage pour lequel tu veux créer un mode ?

--drkm
Avatar
Matthieu Moy
drkm writes:

Cela dépend. De toute façon, l'indentation n'est pas ajoutée
automatiquement. Soit tu as une commande de reformatage de tout
le buffer, ou d'une région, soit tu fournis une commande pour
TAB, soit tu fournis une commande pour RET (qui indente la
nouvelle ligne), etc.



Plutôt que de surcharger TAB, il vaut mieux positionner
`indent-line-function' (qui te donnera la commande pour une ligne ET
la commande pour une région en bonnus).

--
Matthieu
Avatar
drkm
Matthieu Moy writes:

Plutôt que de surcharger TAB, il vaut mieux positionner
`indent-line-function' (qui te donnera la commande pour une ligne ET
la commande pour une région en bonnus).



Oui. Pardon, ce n'était peut-être pas clair. Je ne parlais
pas au niveau technique exact. Plutôt sur le principe.

Merci.

--drkm
Avatar
Olivier
Bonjour,

Il y a trois cas (pour etendre ce que disait drkm) :
-- ou tu veux faire un mode mineur, et la, faut reflechir
(ce serait "editer des macros dans un code qui n'en contient
que peu et sans utiliser mmode"). En general, il faut laisser
la programmation des modes mineurs aux hyper-pros, car ces
derniers doivent etre compatibles avec tout ce qui existe,
c'est un miracle d'equilibre et de justesse d'ecriture.
-- ou bien c'est un petit truc et tu fais un derived-mode
(dans le genre, il faut ce mode pour un code special,
mais dans trois mois il n'aura plus d'utilisation)
-- ou bien tu veux faire un mode majeur complet, et il
faut
(1) aller recuperer le Elisp manual
GNU Emacs Lisp Reference Manual sur le net et
l'acheter pour faire bonne mesure :-)
(2) lire les sections "Major and Minor Modes",
"Major Modes" qui disent clairement comment faire.
(3) aller faire un tour sur les sections
"Indentation" et "Syntax tables". ya aussi
"Font lock" et "Text properties", mais la un peu de
hack sur des codes existants est souvent plus efficaces.
Et inspecter "M-/" (dynamic completion) avant de se lancer
dans le moindre code de completion.
(4) ca se fait en une demi-heure pour le squelette.
(5) si l'indentation pose probleme, j'ai un petit moteur
general "sli-tools.el" a aller chercher sur sourceforge
dans le projet "mupacs". Le fichier correspondant est
completement independant. La aussi, il suffit de charger
le code et de definir les differentes balises etc et de voir
si le resultat plait. Mais si les primitives standards
suffisent (ce qui est rare !), autant s'en contenter.
Bon courage !
Et reviens si probleme :-)
Amities,
Olivier