OVH Cloud OVH Cloud

font-lock

8 réponses
Avatar
Ph. Ivaldi
Bonjour,

J'ai un code de ce genre:

(defvar asy-command-name
"\\<filltype\\>\\|\\<angle\\>\\|....")

(defvar asy-constante-name
"\\<infinity\\>\\|....")

(font-lock-add-keywords 'asy-mode
`((,asy-command-name . font-lock-function-name-face)
(,asy-constante-name . font-lock-constant-face)))

Le problème est que filltype, par exemple, est à la fois une fonction
"filltype(...)" et une constante "filltype ="
ou "bidule(..., ..., filltype, ...)".

Je voudrais donc savoir comment avoir une coloration différente entre
filltype( et filltype sans pour autant colorier toutes les parenthèses
du code (par exemple 3*(toto+2) ).

Merci de votre attention,
--
Philippe Ivaldi.

8 réponses

Avatar
Florent Georges
Ph. Ivaldi wrote:

Bonjour !

(font-lock-add-keywords 'asy-mode
`((,asy-command-name . font-lock-function-name-fa ce)
(,asy-constante-name . font-lock-constant-face) ))

Le problème est que filltype, par exemple, est à la fois une fonction
"filltype(...)" et une constante "filltype ="
ou "bidule(..., ..., filltype, ...)".



Tu peux utiliser la construction suivante. Elle utilise un format
d'arguments un peu plus complexe, permettant de specifier une
sous-partie de l'expression rationnelle a colorier. Cela permet de
matcher sur une plus longue chaine, mais d'exclure la parenthese :

(font-lock-add-keywords
'makefile-mode
'(("(filltype)(" 1 font-lock-function-name-face)
("(filltype)(?:[^(]|')" 1 font-lock-constant-face)))

Tu as toutes les infos ici : (info "(elisp)Search-based
Fontification"). Certaines constructions permettent de faire des
choses vraiment complexes.

--drkm
Avatar
Ph. Ivaldi
Le 22 août 2006 à 20h22:42,
"Florent Georges" écrivit :

Ph. Ivaldi wrote:

Tu peux utiliser la construction suivante. Elle utilise un format
d'arguments un peu plus complexe, permettant de specifier une
sous-partie de l'expression rationnelle a colorier. Cela permet de
matcher sur une plus longue chaine, mais d'exclure la parenthese :

(font-lock-add-keywords
'makefile-mode
'(("(filltype)(" 1 font-lock-function-name-face)
("(filltype)(?:[^(]|')" 1 font-lock-constant-face)))



Exactement l'exemple qui me manquait.


Tu as toutes les infos ici : (info "(elisp)Search-based
Fontification"). Certaines constructions permettent de faire des
choses vraiment complexes.



Ho sûrement... pour le moment je vais me contenter de choses vraiment
simples.


--drkm



Merci pour tout,
--
Philippe Ivaldi.
Avatar
Ph. Ivaldi
Le 22 août 2006 à 20h22:42,
"Florent Georges" écrivit :

Ph. Ivaldi wrote:

Bonjour !

Tu peux utiliser la construction suivante. Elle utilise un format


d'arguments un peu plus complexe, permettant de specifier une
sous-partie de l'expression rationnelle a colorier. Cela permet de
matcher sur une plus longue chaine, mais d'exclure la parenthese :

(font-lock-add-keywords
'makefile-mode
'(("(filltype)(" 1 font-lock-function-name-face)
("(filltype)(?:[^(]|')" 1 font-lock-constant-face)))

Tu as toutes les infos ici : (info "(elisp)Search-based
Fontification"). Certaines constructions permettent de faire des
choses vraiment complexes.



En fait il me faudrait définir deux "matching functions" qui se basent
sur deux listes de mots clefs du type:
(defvar asy-command-name '("draw" "FillDraw" "filltype" ....))
J'ai beau lire la documentation et
Message-ID:
je me noie.

Bref, comment définir une telle "matching function" ?
Merci de votre aide.
--
Philippe Ivaldi.
Avatar
Ph. Ivaldi
Le 23 août 2006 à 15h14:04,
Ph. Ivaldi écrivit :

En fait il me faudrait définir deux "matching functions" qui se basent
sur deux listes de mots clefs du type:
(defvar asy-command-name '("draw" "FillDraw" "filltype" ....))
J'ai beau lire la documentation et
Message-ID:
je me noie.

Bref, comment définir une telle "matching function" ?



Je ne sais toujours pas mais j'ai trouvé un contournement (merci
emacswiki):

(defun asy-add-command-keywords (command-keywords face-name)
(let* ((keyword-list (mapcar #'(lambda (x)
(symbol-name x))
command-keywords))
(keyword-regexp (concat "<("
(regexp-opt keyword-list)
")(")))
(font-lock-add-keywords 'asy-mode
`((,keyword-regexp 1 ',face-name)))))

(defun asy-add-constant-keywords (command-keywords face-name)
(let* ((keyword-list (mapcar #'(lambda (x)
(symbol-name x))
command-keywords))
(keyword-regexp (concat "<("
(regexp-opt keyword-list)
")(?:[^(a-zA-Z]|')")))
(font-lock-add-keywords 'asy-mode
`((,keyword-regexp 1 ',face-name)))))

(defvar asy-constant-name
'(truc Machin bidule))

(defcustom asy-user-command-name
'(drawangle labelA labelB labelC Abc abc)
"Extra user commands names"
:type '(repeat sexp)
:group 'asymptote)


(defvar asy-command-name
'(truc Machin chouette))

(asy-add-command-keywords
(nconc asy-command-name asy-user-command-name)
'font-lock-function-name-face)

(asy-add-constant-keywords
(nconc asy-constant-name asy-command-name asy-user-command-name)
'font-lock-constant-face)

Ce qui permet de faire une mise à jour simple et rapide des noms de
commandes et de constantes (et d'apprendre les subtilités du
lisp :-) ).
Quelle idée aussi d'utiliser un langage où une fonction porte le même
nom qu'une variable ?

Bonne journée,
--
Philippe Ivaldi.
Avatar
Florent Georges
Ph. Ivaldi wrote:

Salut

Le 23 août 2006 à 15h14:04,
Ph. Ivaldi écrivit :

> Bref, comment définir une telle "matching function" ?

Je ne sais toujours pas mais j'ai trouvé un contournement



Désolé, je n'ai pas vu ton article plus tôt. Mais tu as
trouvé la solution tout seul :-). C'est exactement ce que
je t'aurais conseillé : tu n'as pas besoin d'une fonction
dans ce cas, une expression rationnelle suffit. Et le code
a l'air très bien, configurable, ...

--drkm
Avatar
Ph. Ivaldi
Le 25 août 2006 à 09h47:21,
"Florent Georges" écrivit :

[...]
Et le code a l'air très bien, configurable, ...



ha ben ça, ça me fait vraiment plaisir.
--
Philippe Ivaldi.
Avatar
Florent Georges
Ph. Ivaldi wrote:

(defcustom asy-user-command-name
'(drawangle labelA labelB labelC Abc abc)
"Extra user commands names"
:type '(repeat sexp)
:group 'asymptote)



Just une petite remarque, j'aurais utilise '(repeat symbol) ici.
Mais c'est toi qui sait si cela est mieux adapte. Pour une liste des
types simples predefinis : (info "(elisp)Simple Types").

Ah, ca fait du bien de se replonger un peu dans ELisp :-)

--drkm
Avatar
Ph. Ivaldi
Le 25 août 2006 à 13h20:20,
"Florent Georges" écrivit :

Ph. Ivaldi wrote:

(defcustom asy-user-command-name
'(drawangle labelA labelB labelC Abc abc)
"Extra user commands names"
:type '(repeat sexp)
:group 'asymptote)



Just une petite remarque, j'aurais utilise '(repeat symbol) ici.



Exact.
j'ai hésité entre les deux mais comme il était tard j'ai eu la flemme de
tester.
Merci pour cette précision.


Ah, ca fait du bien de se replonger un peu dans ELisp :-)



Oui. C'est quand même un langage vraiment spécial.
Pour quelqu'un qui le maîtrise cela doit être un pur bonheur...
--
Philippe Ivaldi.