OVH Cloud OVH Cloud

comment syntax help

10 réponses
Avatar
hakpac
Bonjour,

Je voulais creer un mode perso dans emacs.
C'est un mode tres simple qui ne comporte aucune indentation. Je veux
juste qu'il me colorie les mots cles et les commentaires.

Compte tenu de mon niveaux debutant-novice en LISP-emacs, c'est deja un
exploit de mettre les couleurs les mots cles avec les explications
trouvees sur le net et faire mon fichier perso.el.
Mais pour les commentaires c'est pas encore au point.

J'ecris enormement de fichier input pour mes simulations numeriques et
je trouve le mode fundamental un peu tristounet l'edition de ces
fichiers.La syntaxe de ces fichiers n'est pas tres sophistiquee, mais
une coloration sous emacs permet d'eviter egalement certaines erreurs.

Mes fichiers input utilise le caractere "*" en debut de ligne pour
commenter toute la ligne. (meme principe que pour le "c" en mode
fortran pour le fortran 77)
mais il utilise "*" egalement comme operateur de multiplication (qui
n'est jamais en debut de ligne, la ligne commence par "calc" pour etre
plus precis).

(modify-syntax-entry ?* "<" table)
(modify-syntax-entry ?\n "> " table)

mais colorie aussi "en commentaire" l'operateur *
qui ajoute alors plus de confusion.

Quelqu'un pourait m'aider a contourner ce probleme svp?

Merci d'avance.

Cordialement,
-Hakpac-

10 réponses

Avatar
Eric Reinbold
"hakpac" writes:

Bonjour,

Je voulais creer un mode perso dans emacs.
C'est un mode tres simple qui ne comporte aucune indentation. Je veux
juste qu'il me colorie les mots cles et les commentaires.

Compte tenu de mon niveaux debutant-novice en LISP-emacs, c'est deja un
exploit de mettre les couleurs les mots cles avec les explications
trouvees sur le net et faire mon fichier perso.el.
Mais pour les commentaires c'est pas encore au point.

J'ecris enormement de fichier input pour mes simulations numeriques et
je trouve le mode fundamental un peu tristounet l'edition de ces
fichiers.La syntaxe de ces fichiers n'est pas tres sophistiquee, mais
une coloration sous emacs permet d'eviter egalement certaines erreurs.

Mes fichiers input utilise le caractere "*" en debut de ligne pour
commenter toute la ligne. (meme principe que pour le "c" en mode
fortran pour le fortran 77)
mais il utilise "*" egalement comme operateur de multiplication (qui
n'est jamais en debut de ligne, la ligne commence par "calc" pour etre
plus precis).

(modify-syntax-entry ?* "<" table)
(modify-syntax-entry ?n "> " table)

mais colorie aussi "en commentaire" l'operateur *
qui ajoute alors plus de confusion.

Quelqu'un pourait m'aider a contourner ce probleme svp?

Merci d'avance.

Cordialement,
-Hakpac-



Ave,
Je te donne mon fichier eeec-mode.el, qui comme sont nom l'indique s'occupe des fichier EEEC.

(provide 'eeec-mode)
;------------------------- EEEC-MODE ---------------------------
(defun eeec-mode ()
"Major mode for editing EEEC code."
(interactive)
(kill-all-local-variables)
(setq major-mode 'eeec-mode)
(setq mode-name "eeec-mode")
(setq font-lock-defaults
'((("^\vspace{2mm}$" . font-lock-comment-face)
("^{\textbf{" . font-lock-comment-face)
("}}" . font-lock-comment-face)
("\\$" . font-lock-comment-face)
("^Usage:.*|^Jour:.*|^Lieu:.*" . font-lock-comment-face)
("^*+" . font-lock-comment-face)
("^%%.+" . font-lock-function-name-face)
("^V:." . font-lock-function-name-face)
("^T:.+" . font-lock-keyword-face)
("^w:.+" . font-lock-doc-face)
("![a-z]+!" . font-lock-keyword-face)
("[[MLQPKV]:[^]]+]" . font-lock-keyword-face)
(""[A-G][#bMm98764]*"" . font-lock-variable-name-face)
("|" . font-lock-constant-face)) t)))


Il est appelé, dans .emacs par:

(require 'eeec-mode)
(setq auto-mode-alist
(cons '(".eeec$" . eeec-mode)
auto-mode-alist))

Voili,
Eric
Avatar
Matthieu Moy
Eric Reinbold writes:

(require 'eeec-mode)



Un autoload bien placé t'aurais évité de charger ce mode quand tu ne
t'en sert pas ...

--
Matthieu
Avatar
Pascal Bourguignon
"hakpac" writes:

Bonjour,

Je voulais creer un mode perso dans emacs.
C'est un mode tres simple qui ne comporte aucune indentation. Je veux
juste qu'il me colorie les mots cles et les commentaires.



Alors tu n'as pas vraiment besoin d'un mode. Une simple fonction que
tu mettras en hook sur les modes ou les extensions de fichiers que tu
utilises qui installera les parametres de font-locking que tu veux.


Mes fichiers input utilise le caractere "*" en debut de ligne pour
commenter toute la ligne. (meme principe que pour le "c" en mode
fortran pour le fortran 77)
mais il utilise "*" egalement comme operateur de multiplication (qui
n'est jamais en debut de ligne, la ligne commence par "calc" pour etre
plus precis).

(modify-syntax-entry ?* "<" table)
(modify-syntax-entry ?n "> " table)

mais colorie aussi "en commentaire" l'operateur *
qui ajoute alors plus de confusion.

Quelqu'un pourait m'aider a contourner ce probleme svp?




Voici un exemple "sophistiqué" de font-locking que j'ai implémenté
pour un source assembleur.

Dans les cas simples, on peut mettre directement les regexp dans
l'argument de font-lock-add-keywords. Mais si on a un peu d'analyse
syntaxique à faire, on peut y mettre une fonction qui fasse le
travail.

Bien lire la doc de font-lock-add-keywords, font-lock-keywords, aussi
bien C-h f que info.



(eval-when-compile
(require 'cl)
(load "cl-seq" t t)
(load "cl-macs" t t))
(require 'pjb-cl)
(require 'asm-mode)
(require 'font-lock)


(defconst +asm7090-ibsys-char+ ?$)
(defconst +asm7090-comment-char+ ?*)
(defconst +space+ 32)


(defun POSITION-IF (item sequence &rest keys)
;; (message "item=%S seq=%S keys=%S" item sequence keys)
(let ((start (getf keys :start))
(end (getf keys :end)))
(cond
((and start (= start (length sequence))) nil)
((and end (< (length sequence) end))
(setf keys (copy-seq keys))
(setf (getf keys :end) (length sequence))
(apply (function position-if) item sequence keys))
(t
(apply (function position-if) item sequence keys)))))


"
Example of lines parsed by search-asm7090-fields:

REM MAPCAR(L,F) = (L=0 YIELDS 0, CARD0001
* COMMENTAIRE CARD0002
MAPCAR TZE *+1,4
TSX $SAVE,4 CARD0004
TXL $END3,,F+2 SAVE 3 ITEMS CARD0005
"

(defun search-asm7090-fields (limit)
(macrolet ((sel (len min max sma bet big)
(let ((vlen (gensym)) (vmin (gensym)) (vmax (gensym)))
`(let ((,vlen ,len) (,vmin ,min) (,vmax ,max))
(cond ((< ,vlen ,min) ,sma)
((<= ,vlen ,max) ,bet)
(t ,big))))))
(let* ((start (progn (beginning-of-line) (point)))
(end (progn (end-of-line) (point)))
(line (buffer-substring-no-properties start end)))
;; (message "search-asm7090-fields %d %Sn%S" (point) limit line)
;; (message "search-asm7090-fields start=%d end=%dn" start end)
(setf limit (1+ end))
(beginning-of-line)
(cond
((= 0 (length line))
;; (message " exit 0")
(re-search-forward
"^()()()()()()n" limit t))
((= (aref line 0) +asm7090-ibsys-char+)
;; (message " exit 1")
(re-search-forward
"^()()()()(.{1,72})(.{0,8})n" limit t))
((= (aref line 0) +asm7090-comment-char+)
;; (message " exit 2")
(re-search-forward
"^()()()(.{1,72})()(.{0,8})n" limit t))
((re-search-forward ; only spaces
"^ +()()()()()()n" limit t))
;; (message " exit 3") t
((< (length line) 7)
;; (message " exit 4")
(re-search-forward
"^(.{0,6})()()()()()n" limit t))
(t (let ((labs 0) (labe 6)
cods code
args arge
coms come
nums nume)
;; (message " exit 5")
(setf cods (POSITION-IF (lambda (ch) (/= ch +space+)) line
:start 6 :end 15))
;; (message "cods=%S" cods)
(if cods
(setf code (min 72 (or (POSITION +space+ line :start cods)
(length line))))
(setf cods 6
code 6))
;; (message "cods=%S code=%S" cods code)
(setf args (POSITION-IF (lambda (ch) (/= ch +space+)) line
:start code :end 16))
;; (message "args=%S" args)
(if args
(setf args (min 72 args)
arge (min 72 (or (POSITION +space+ line :start args)
(length line))))
(setf args code
arge code))
;; (message "OPCODE= %S"(subseq line cods code))
(when (STRING-EQUAL (subseq line cods code) "BCI")
(let* ((comma (POSITION (CHARACTER ",") line
:start args :end arge))
(size (HANDLER-CASE
(parse-integer line args
(min arge (or comma arge)))
(error () nil))))
;; (message "SIZE=%S" size)
(when (and comma size)
(setf arge (min 72 (+ comma 1 (* 6 size)) (length line))))))
;; (message "args=%S arge=%S" args arge)
(setf coms (POSITION-IF (lambda (ch) (/= ch +space+)) line
:start arge))
;; (message "coms=%S" coms)
(if coms
(setf coms (min 72 coms)
come (min 72 (length line)))
(setf coms arge
come arge))
;; (message "coms=%S come=%S" coms come)
(if (<= 72 (length line))
(setf nums 72
nume (min 80 (length line)))
(setf nums (length line)
nume (length line)))
;; (message "nums=%S nume=%S" nums nume)
(prog1
(re-search-forward
(apply (function concat)
(list "^"
(format "(.{%d})" (- labe labs))
(format " {%d}" (- cods labe))
(format "(.{%d})" (- code cods))
(format " {%d}" (- args code))
(format "(.{%d})" (- arge args))
(format " {%d}" (- coms arge))
(format "(.{%d})" (- come coms))
(format " {%d}" (- nums come))
"()" ; IBSYS
(format "(.{%d})" (- nume nums))
"n"))
limit t))))))))


(defun asm7090-font-lock ()
(interactive)
(setq font-lock-defaults nil
font-lock-keywords nil)
(font-lock-add-keywords
nil
(list
(list
(function search-asm7090-fields)
'(1 font-lock-function-name-face) ; labels
'(2 font-lock-keyword-face) ; operation codes
'(3 font-lock-reference-face) ; arguments
'(4 font-lock-comment-face) ; comments
'(5 font-lock-preprocessor-face) ; ibsys
'(6 font-lock-type-face) ; cols 72-80
))))

--
__Pascal Bourguignon__ http://www.informatimago.com/
I need a new toy.
Tail of black dog keeps good time.
Pounce! Good dog! Good dog!
Avatar
Eric Reinbold
Matthieu Moy writes:

Eric Reinbold writes:

(require 'eeec-mode)



Un autoload bien placé t'aurais évité de charger ce mode quand tu ne
t'en sert pas ...

--
Matthieu



Le problème...
...c'est que je m'en sers tout le temps.
Avatar
hakpac
Merci pour vos reponses.

J'ai repris tous les font-lock-comment-face d'Eric, ca rapproche un peu
de ce que je voulais.
Il ne me colorie pas toute la ligne commencant par "* ---------" (il le
fait pour les "**" cepandant).
Si Eric veut bien m'explique ce que veut dire les chaines entre quote
de font-lock-comment-face,
je pourrai ameliorer un peu mon niveau.

Merci quand meme a Pascal; c'est trop sophistique comme methode. Et vu
mon niveau, c'est infaisable.

encore merci a Mathieu pour le lien.


-Hakpac-
Avatar
Eric Reinbold
"hakpac" writes:

Merci pour vos reponses.

J'ai repris tous les font-lock-comment-face d'Eric, ca rapproche un peu
de ce que je voulais.
Il ne me colorie pas toute la ligne commencant par "* ---------" (il le
fait pour les "**" cepandant).
Si Eric veut bien m'explique ce que veut dire les chaines entre quote
de font-lock-comment-face,
je pourrai ameliorer un peu mon niveau.




En fait c'est des expression régulières:

("^\vspace{2mm}$" . font-lock-comment-face)
Ca cherche vspace{2mm} , au début (^) et à la fin ($),
en fait il n'y a rien d'autre sur cette ligne.
Les trois , c'est parce que le quatrième fait partie aussi du language.
En fait, c'est et


("^{\textbf{" . font-lock-comment-face)
Toujours en début de ligne (^), {textbf{


("}}" . font-lock-comment-face)
Deux }


("\\$" . font-lock-comment-face)
Ca c'est le plus dur, c'est en fin de ligne ($)


("^Usage:.*|^Jour:.*|^Lieu:.*" . font-lock-comment-face)
Usage: au début de ligne avec quelque chose derrière (.*) ou (|) Jour: ou Lieu



("^*+" . font-lock-comment-face)
Une ligne de (*), héhé


Bon, je te laisse devinez la suite:
("^%%.+" . font-lock-function-name-face)
("^V:." . font-lock-function-name-face)
("^T:.+" . font-lock-keyword-face)
("^w:.+" . font-lock-doc-face)


Ca c'est !fine! ou !segno!, etc
("![a-z]+!" . font-lock-keyword-face)


Ca c'est [M:3/4] ou [K:Am]
("[[MLQPKV]:[^]]+]" . font-lock-keyword-face)


Ca c'est les accords "Am7" par ex:
(""[A-G][#bMm98764]*"" . font-lock-variable-name-face)


Et ca c'est "|", tout simplement:
("|" . font-lock-constant-face)

Ah ca c'est le top, ca ne se mélange pas avec d'autres colorisations,
en autre le ":
)t)))


Enfin rien ne vaut un petit peu de lecture sur les expressions regulières.
Eric

PS: J'espère que j'ai tout bon, hein chef?
Avatar
hakpac
Eric Reinbold wrote:

En fait c'est des expression régulières:

("^\vspace{2mm}$" . font-lock-comment-face)
Ca cherche vspace{2mm} , au début (^) et à la fin ($),
en fait il n'y a rien d'autre sur cette ligne.
Les trois , c'est parce que le quatrième fait partie aussi du language.
En fait, c'est et

("^*+" . font-lock-comment-face)
Une ligne de (*), héhé




Merci ca devient un peu moins cabalistique.
Est ce que ca marche un peu comme pour sed ?

Peut on definir une coloration entre 2 mots cles avec la meme methode?
ex:
^calc coloration de tout ce qui suit jusqu'a fin de ligne.

avec calc en debut de ligne comme mot cle.
C'est un sorte de syntax (j'arrive pas a definir "^calc" comme
syntax-keyword)

J'ai modifie "^Usage" pour "^*" et ca marche nickel.
Donc tres content, merci.

-Hakpac-
Avatar
Eric Reinbold
"hakpac" writes:




Merci ca devient un peu moins cabalistique.
Est ce que ca marche un peu comme pour sed ?



Il y a des pages internet sur les différences et les similitudes.

Peut on definir une coloration entre 2 mots cles avec la meme methode?
ex:
^calc coloration de tout ce qui suit jusqu'a fin de ligne.



"^calc.+"
Le point veut dire n'importe quel caractère.
Le + au moins une occurence du .
Le * 0 ou plus et ? au plus une occurence


avec calc en debut de ligne comme mot cle.
C'est un sorte de syntax (j'arrive pas a definir "^calc" comme
syntax-keyword)

J'ai modifie "^Usage" pour "^*" et ca marche nickel.
Donc tres content, merci.

-Hakpac-
Avatar
hakpac
en fait je veux garder le mot cle calc dans une couleur differente de
ce qui le suit.

Et une derniere question, comment definir les expression régulières
pour que la recherche soit insensible a la casse.

-Hakpac-
Avatar
Florent Georges
hakpac wrote:

Et une derniere question, comment definir les expression régulières
pour que la recherche soit insensible a la casse.



Voir (info "(elisp)Searching and Case").

--drkm