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

Problème spécial

24 réponses
Avatar
Ph. Ivaldi
Re,

J'utilise two-mode-mode pour faire un mode hybride latex/asymptote:
quand le curseur se trouve entre les balises \begin{asy} et \end{asy}
tout le buffer bascule en asy-mode et hors des balises il est en mode
LaTeX-mode.
Ça fonctionne très bien sauf que...

En mode asy-mode tout texte entre apostrophes ou guillemets (") est
coloré en rouge (c'est une chaîne quoi).

Si j'édite ce bête code:
8<------8<------8<------8<------8<------8<------8<------8<------8<------
\documentclass{article}
\begin{document}
s'il Il n'y a pas de solution c'est qu'il n'y a pas de problème.
\begin{asy}
draw(unitcircle);
\end{asy}
\end{document}
8<------8<------8<------8<------8<------8<------8<------8<------8<------

comme le nombre d'apostrophes avant l'environnement asy est impair,
tout l'environnement asy devient rouge.

Auriez une idée pour contourner ce problème ?
J'étudie TOUTE proposition, de la plus farfelue à la plus sérieuse.
--
Merci de votre attention,
Philippe Ivaldi.
http://piprim.tuxfamily.org/

10 réponses

1 2 3
Avatar
Olivier
D'habitude et depuis hilit19, on fait ainsi :

(defsubst phi-search-forward-string-delimiter (lim)
"Give the position of next " preceded by an even number
of . Move point after this point. Nil if no such place before LIM"
;; Inspired from fontify-string-find in hilit19.el.
(let (p)
(while (and (setq p (search-forward """ lim t))
(save-excursion
(forward-char -1)
(not (zerop (% (skip-chars-backward "\") 2))))))
p))

(defun phi-match-string (lim)
"Set match-data 0 to limits of next string.
Point at beginning is outside a string. Move point after this point.
Nil if no such string before LIM."
(let ((beg (phi-search-forward-string-delimiter lim))
(end (phi-search-forward-string-delimiter lim))
(if (and beg end)
(set-match-data (list beg end))
nil)))

et dans la liste de fontification keywords, on met

'(phi-match-string (0 my-face))

JQCA!
Amities,
Olivier

(code non testé, et ecrit sans verificateur de parentheses ---
une partie recopiee de pari.el)
Avatar
Olivier
ok, a corriger, je reviens --
Avatar
Ph. Ivaldi
Le 06 juillet 2007, Olivier écrivit :

ok, a corriger, je reviens --



Je cherche aussi de mon côté...
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Avatar
Olivier
J'ai mal piqué dans mon code. Au lieu de :

(defsubst phi-search-forward-string-delimiter (lim)
"Give the position of next " preceded by an even number
of . Move point after this point. Nil if no such place before LIM"
;; Inspired from fontify-string-find in hilit19.el.
(let (p)
(while (and (setq p (search-forward """ lim t))
(save-excursion
(forward-char -1)
(not (zerop (% (skip-chars-backward "\") 2))))))
p))



il faut tout simplement

(defsubst phi-search-forward-string-delimiter (lim)
"Give the position of next ". Move point after this point. Nil if no
such place before LIM"
(search-forward """ lim t))

Voila et desole, j'eus du reflechir un chouia plus :-p
A.O.
Avatar
Ph. Ivaldi
Le 06 juillet 2007, Olivier écrivit :

il faut tout simplement

(defsubst phi-search-forward-string-delimiter (lim) "Give the position
of next ". Move point after this point. Nil if no such place before
LIM" (search-forward """ lim t))



Merci ça marche nickel sauf que...

asy-mode est dérivé de objc-mode:
(define-derived-mode asy-mode objc-mode "Asymptote"....

du coup '....' est bien matché par phi-match-string mais si la
guillemet ne ferme pas ('.....)
ça reste matché par la fonction propre à objc-mode et l'environnement
asy devient rouge dans l'exemple que j'ai donné.

Ma question est donc maintenant « comment remplacer la coloration des
chaînes de objc-mode par la mienne ? »

Au passage je trouve que colorier toute la fin d'un buffer depuis une
guillemet qui ne ferme pas est très gênant en général et n'a pas grand
intérêt.

Le code complet que j'utilise pour tester tout ça
8<------8<------8<------8<------8<------8<------8<------8<------8<------
(defun phi-search-forward-string-delimiter (lim)
"Give the position of next ". Move point after this point. Nil if no
such place before LIM"
(search-forward "'" lim t))

(defun phi-match-string (lim)
"Set match-data 0 to limits of next string.
Point at beginning is outside a string. Move point after this point.
Nil if no such string before LIM."
(let ((beg (phi-search-forward-string-delimiter lim))
(end (phi-search-forward-string-delimiter lim)))
(if (and beg end)
(progn
(set-match-data (list beg end))
(point)) nil)))

(font-lock-add-keywords
'asy-mode
'((phi-match-string 0 'asy-link-face t)))
8<------8<------8<------8<------8<------8<------8<------8<------8<------

Il y a là une question qui me turlupine...
Dans la doc de "set-match-data" il est dit

,----[(set-match-data LIST &optional RESEAT)]
| ..................................
| LIST should have been created by calling `match-data' previously.
`----

Or là pas de match-data à l'horizon... Une explication ?

Voila et desole



Vraiment pas de quoi, c'est une aide précieuse !
Merci.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Avatar
Olivier
Ph. Ivaldi wrote:

Ma question est donc maintenant « comment remplacer la coloration des
chaînes de objc-mode par la mienne ? »



Malheureusement, je ne vois pas trente six solutions --
On peut bien sur refaire la fontification des chaines dans font-lock,
mais c'est tordu --
Une possibilité : mettre tout ce qui est en asy-mode dans une couleur
transparente et utiliser l'argument override pour la fontification
en asy-mode.

Dans le genre

(put-text-property start end 'face 'my-favorite-undefined-face)

ou start est le debut de
begin{asy}
et end la fin de
end{asy}
Mais cela demande de connaitre la fin ... ou alors de reactualiser
avec le after-insert-hook (j'oublie toujours le nom exact de ce crochet)

Il suffit peut etre de mettre le begin{asy} dans une couleur
virtuelle pour bloquer le deroulement du coloriage de la chaine.
(Je crois que c'est vrai).
Du coup un
(put-text-property start end 'face 'my-favorite-undefined-face)
suffit mais la encore, il faut reconnaitre ce texte au prealable ---
SI il y a une commande qui insere l'environnement, c'est tout bon.
Sinon, il faut reutiliser font-lock, faire une reconnaissance
de begin{asy} end{asy}, imposer une couleur virtuelle etc --

Essais a faire !

Au passage je trouve que colorier toute la fin d'un buffer depuis une
guillemet qui ne ferme pas est très gênant en général et n'a pas grand
intérêt.



Oui, c'est vrai. Normalement, le code que j'ai donné ne colorie que les
chaines completes.

Il y a là une question qui me turlupine...
Dans la doc de "set-match-data" il est dit

,----[(set-match-data LIST &optional RESEAT)]
| ..................................
| LIST should have been created by calling `match-data' previously.
`----

Or là pas de match-data à l'horizon... Une explication ?



Pas clair, car l'explication dit aussi
"Use `store-match-data' to reinstate the data in this list."
et store-match-data est un alias de set-match-data :-)

Je fais des essais ce soir si j'ai le temps que je crois que j'aurais :-)
Amities,
Olivier
Avatar
Ph. Ivaldi
Le 06 juillet 2007, Olivier écrivit :

Ma question est donc maintenant « comment remplacer la coloration des
chaînes de objc-mode par la mienne ? »



Malheureusement, je ne vois pas trente six solutions --
On peut bien sur refaire la fontification des chaines dans font-lock,
mais c'est tordu --



J'ai regardé de ce côté mais ça dépasse largement mes compétences.

Une possibilité : mettre tout ce qui est en asy-mode dans une couleur
transparente et utiliser l'argument override pour la fontification
en asy-mode.

Dans le genre

(put-text-property start end 'face 'my-favorite-undefined-face)

ou start est le debut de
begin{asy}
et end la fin de
end{asy}




J'ai testé cette méthode (en statique, pas de modif de buffer)... sans
succès; la coloration syntaxique est au dessus de la text-property.

Mais cela demande de connaitre la fin ... ou alors de reactualiser
avec le after-insert-hook (j'oublie toujours le nom exact de ce
crochet)



Pas vu de after-insert-hook ou after-self-insert-hook...
La seule chose approchant est `after-change-functions'.


Il suffit peut etre de mettre le begin{asy} dans une couleur
virtuelle



C'est quoi une couleur virtuelle ?

pour bloquer le deroulement du coloriage de la chaine.
(Je crois que c'est vrai).
Du coup un
(put-text-property start end 'face 'my-favorite-undefined-face)
suffit mais la encore,
il faut reconnaitre ce texte au prealable ---
SI il y a une commande qui insere l'environnement, c'est tout bon.



Là je ne te suis pas. Si j'édite un texte préexistant, l'environnement
est déjà en place.

Sinon, il faut reutiliser font-lock, faire une reconnaissance
de begin{asy} end{asy}, imposer une couleur virtuelle etc --



Je ne comprends pas grand chose...
Si ça peut aider, il y a un "hook" quand on passe d'un mode à l'autre.

Essais a faire !



Yep... ça fait 5 heures que je cherche dans tous les sens et je suis
dans une impasse.

Au passage je trouve que colorier toute la fin d'un buffer depuis une
guillemet qui ne ferme pas est très gênant en général et n'a pas
grand intérêt.



Oui, c'est vrai. Normalement, le code que j'ai donné ne colorie que
les chaines completes.



Exact... si je pouvais avoir ça dans tous les modes...

Merci de t'intéresser à mon problème, asy-mode est assez
agréable pour coder en Asymptote et c'est dommage qu'il reste cette
coquille.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Avatar
Olivier
Bon, on repart sur de nouvelles bases. Vola ce que j'ai ajoute
entre (defface asy-environment-face etc et (defface asy-link-face ; :
-------------------------------------------------------------------
(defface asy-environment-face
`((t
(:underline t :inverse-video t)))
"Face used to highlighting the keywords 'begin{asy}' and
'end{asy}' within lasy-mode."
:group 'asymptote)

(defun asy-locate-asy-environment (lim)
(let ((beg (search-forward "begin{asy}" lim t))
(first-end (point))
(end (search-forward "end{asy}" lim t)))
(if (and beg end)
(progn (set-match-data
(list (- beg 11) end
first-end (- end 9)
(- beg 11) first-end
(- end 9) end))
(print (match-data 0)))
nil)))
(defface asy-dummy-face ;; dummy-face
`((t
()))
"--"
:group 'asymptote)

(font-lock-add-keywords
'asy-mode
(list
'(asy-locate-asy-environment (0 'asy-dummy-face t)
(2 'asy-environment-face t)
(3 'asy-environment-face t))
))

(defface asy-link-face ;; widget-field-face
`((t
(:underline t)))
"Face used to highlighting the links."
:group 'asymptote)
--------------------------------------------------------------------
Voila qui devrait t'expliquer ce que j'avais en tête mieux que ce
j'ai pu ecrire.
Je suis ce fil encore ce soir, sinon dimanche soir.
Amities,
Olivier
Avatar
Ph. Ivaldi
Le 06 juillet 2007, Olivier écrivit :

Bon, on repart sur de nouvelles bases. Vola ce que j'ai ajoute
entre (defface asy-environment-face etc et (defface asy-link-face ; :
[code]



Ça marche chez toi ?
Chez moi la coloration ne s'effectue que lorsqu'on commence à taper (ça
doit être facilement réparable) et le problème avec les apostrophes
subsiste :-(

Je vais étudier ça se soir...

Je suis ce fil encore ce soir, sinon dimanche soir.



Bon week-end.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Avatar
Olivier
Ph. Ivaldi wrote:
[..°]
Ça marche chez toi ?



Mon exemple est :
8<------8<------8<------8<------8<------8<------8<------8<------8<------
documentclass{article}
begin{document}
s'il Il n'y a pas de solution c'est qu'il n'y a pas de problème.
begin{asy}
draw(unitcircle);
end{asy}
end{document}
8<------8<------8<------8<------8<------8<------8<------8<------8<------

Et là, ça marche
Maintenant, ça ne fonctionne que dès que le end{asy}
apparait, c'est comme cela que je l'ai codé, mais on peut
faire dès que le begin{asy} apparait.

Chez moi la coloration ne s'effectue que lorsqu'on commence à taper (ça
doit être facilement réparable) et le problème avec les apostrophes
subsiste :-(



Tu es en lazy-lock, ton fichier est très gros ou ce genre de choses ?
De toutes façons, la coloration asy, ou du moins celle que je redefinis
doit prendre le pas sur toute autre.

Je n'ai pas de fichier asy-keywords.el, j'ai créé les variables
manquantes à la main :-p

Bon, la suite dimanche alors !
Bon week-end !
Amities,
Olivier
1 2 3