Coloration en fonction de la position (en plus de la coloration syntaxique)
Le
Nicolas Matringe

Bonjour
Je suis en train de créer un mode pour éditer un assembleur propriéta=
ire (et ça se passe très bien jusque là) et j'y ajoute un mode pour c=
olorier le fichier de log de la compilation qui comporte 3 colonnes : l'adr=
esse, l'opcode et l'assembleur correspondant. Je voudrais afficher adresse =
et opcode dans des couleurs différentes et indépendantes de la colorati=
on syntaxique de l'assembleur mais je ne sais pas comment faire.
J'ai facilement créé une expression régulière pour la première co=
lonne "^.{4}" mais je n'arrive pas à trouver comment créer celle de l=
a seconde colonne. J'ai essayé "(?:^.{4}).{8}" mais le 1 groupe "ma=
tche" aussi.
Peut-être que je ne prends pas le problème dans le bon sens et qu'il ne=
faut pas passer par une regexp pour colorier par colonne ?
Merci d'avance
Nicolas
Je suis en train de créer un mode pour éditer un assembleur propriéta=
ire (et ça se passe très bien jusque là) et j'y ajoute un mode pour c=
olorier le fichier de log de la compilation qui comporte 3 colonnes : l'adr=
esse, l'opcode et l'assembleur correspondant. Je voudrais afficher adresse =
et opcode dans des couleurs différentes et indépendantes de la colorati=
on syntaxique de l'assembleur mais je ne sais pas comment faire.
J'ai facilement créé une expression régulière pour la première co=
lonne "^.{4}" mais je n'arrive pas à trouver comment créer celle de l=
a seconde colonne. J'ai essayé "(?:^.{4}).{8}" mais le 1 groupe "ma=
tche" aussi.
Peut-être que je ne prends pas le problème dans le bon sens et qu'il ne=
faut pas passer par une regexp pour colorier par colonne ?
Merci d'avance
Nicolas
Jette un oeul sur:
https://gitorious.org/com-informatimago/emacs/blobs/master/pjb-asm7090.el
Comme tu vois, le truc c'est qu'on peut utiliser une fonction au lieu
d'une regexp dans font-lock-add-keywords (cf. ligne 208).
Cette fonction peut effectuer toute l'analyse syntaxique ou autre
qu'elle veut. Le seul truc, c'est qu'en sortant, les match-data doivent
êter remplis avec les groupes attendus par les différentes faces
spécifiées.
`match-data' et `set-match-data' sont spécifiées avec la structure de
donnée retournée et attendue, donc la fonction peut directement la
générer et la passer à set-match-data, ou, elle peut faire comme la
mienne (dans le cas d'un langage assembleur ligne par ligne, c'est plus
simple), appeler re-search-forward avec une regexp adaptée à chaque cas.
--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
[...]
Ouh la...
Alors, attends... Je n'utilise pas font-lock-add-keywords, j'ai copié sur d'autres modes :
(setq mi6-font-lock-keywords
`(
(,mi6-constants-regexp . font-lock-constant-face)
(,mi6-instructions-regexp . font-lock-keyword-face)
(,mi6-registers-regexp . font-lock-variable-name-face)
(,mi6-hw-registers-regexp . font-lock-function-name-face)
(,mi6-conditions-regexp . font-lock-builtin-face)
)
)
puis dans la définition du mode:
(setq font-lock-defaults '((mi6-font-lock-keywords)))
Donc si je te comprends bien, je peux mettre une fonction dans ma variable mi6-font-lock-keywords ?
Ma liste ressemblerait alors à... Ah mince je sais pas, en fait.
Je ne comprends pas très bien ce que ça veut dire... (pardonne mon peu de pratique du lisp)
Je ne comprends pas tout mais j'entrevois... L'assembleur pour lequel je cr ée ce mode a une structure très libre, je ne vois pas comment je pourra is utiliser re-search-forward, ne sachant pas a priori quel objet (registre , variable, instruction...) va se trouver à quelle position.
Ça a l'air sacrément plus compliqué que je ne l'aurais cru au dépar t.
Merci en tout cas
Nicolas
J'ai résolu le problème après avoir relu plus attentivement la doc, o n peut indiquer quelle sous-expression on veut colorier :
(,mi6-log-opcode-regexp . (2 font-lock-type-face)))
ne va appliquer font-lock-type-face qu'à la 2nde sous-expression de mi6-l og-opcode-regexp. Ça m'ouvre des perspectives...
Nicolas
C'est à ça que devait faire référence Pascal Bourguignon:
match-data décrit précisément la structure matchée, c'est-à-dire la liste des sous-expressions matchées associées à leur numéro.
Plus précisément, match-data contient une liste avec:
l'endroit dans le fichier du début de la première sous-expression
l'endroit dans le fichier de la fin de la première sous-expression
l'endroit dans le fichier du début de la deuxième sous-expression
l'endroit dans le fichier de la fin de la deuxième sous-expression
etc.
Oui certainement mais avec sa fonction j'ai été un peu perdu.
Finalement je n'ai plus qu'une expression régulière avec 2
sous-expressions colorées différemment, c'est tout simple.
Nicolas