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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pascal J. Bourguignon
Le #25363252
Nicolas Matringe
Bonjour
Je suis en train de créer un mode pour éditer un assembleur
propriétaire (et ça se passe très bien jusque là) et j'y ajoute un
mode pour colorier le fichier de log de la compilation qui comporte 3
colonnes : l'adresse, l'opcode et l'assembleur correspondant. Je
voudrais afficher adresse et opcode dans des couleurs différentes et
indépendantes de la coloration syntaxique de l'assembleur mais je ne
sais pas comment faire.
J'ai facilement créé une expression régulière pour la première colonne
"^.{4}" mais je n'arrive pas à trouver comment créer celle de la
seconde colonne. J'ai essayé "(?:^.{4}).{8}" mais le 1 groupe
"matche" 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 ?



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 {}.
Nicolas Matringe
Le #25364102
Le jeudi 25 avril 2013 19:53:43 UTC+2, Pascal J. Bourguignon a écrit :
Nicolas Matringe > [...] colorier le fichier de log de la compilation qui comporte 3
> colonnes : l'adresse, l'opcode et l'assembleur correspondant. Je
> voudrais afficher adresse et opcode dans des couleurs différentes


[...]
> J'ai facilement créé une expression régulière pour la premièr e colonne
> "^.{4}" mais je n'arrive pas à trouver comment créer celle de la
> seconde colonne.[...]
> Peut-être que je ne prends pas le problème dans le bon sens et qu'i l ne
> faut pas passer par une regexp pour colorier par colonne ?

Jette un oeul sur:
https://gitorious.org/com-informatimago/emacs/blobs/master/pjb-asm7090.el



Ouh la...


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).



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.


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.



Je ne comprends pas très bien ce que ça veut dire... (pardonne mon peu de pratique du lisp)


`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 c as.



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
Nicolas Matringe
Le #25365192
Le vendredi 26 avril 2013 00:26:25 UTC+2, Nicolas Matringe a écrit :
[...]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)
)
)



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
duthen.cnv
Le #25374312
Le vendredi 26 avril 2013 13:01:45 UTC+2, Nicolas Matringe a écrit :
J'ai résolu le problème après avoir relu plus attentivement la doc, on 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 -log-opcode-regexp. Ça m'ouvre des perspectives...



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.
Nicolas Matringe
Le #25375112
Le 30/04/2013 16:25, a écrit :

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
Publicité
Poster une réponse
Anonyme