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

Coloration en fonction de la position (en plus de la coloration syntaxique)

5 réponses
Avatar
Nicolas Matringe
Bonjour
Je suis en train de cr=E9er un mode pour =E9diter un assembleur propri=E9ta=
ire (et =E7a se passe tr=E8s bien jusque l=E0) 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=E9rentes et ind=E9pendantes de la colorati=
on syntaxique de l'assembleur mais je ne sais pas comment faire.
J'ai facilement cr=E9=E9 une expression r=E9guli=E8re pour la premi=E8re co=
lonne "^.\{4\}" mais je n'arrive pas =E0 trouver comment cr=E9er celle de l=
a seconde colonne. J'ai essay=E9 "\(?:^.\{4\}\).\{8\}" mais le 1 groupe "ma=
tche" aussi.
Peut-=EAtre que je ne prends pas le probl=E8me dans le bon sens et qu'il ne=
faut pas passer par une regexp pour colorier par colonne ?

Merci d'avance
Nicolas

5 réponses

Avatar
Pascal J. Bourguignon
Nicolas Matringe writes:

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 {}.
Avatar
Nicolas Matringe
Le jeudi 25 avril 2013 19:53:43 UTC+2, Pascal J. Bourguignon a écrit :
Nicolas Matringe writes:
> [...] 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
Avatar
Nicolas Matringe
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
Avatar
duthen.cnv
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.
Avatar
Nicolas Matringe
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