Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Autres EDI
Autres EDI Forum d'entraide sur les autres EDI
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 13/06/2012, 12h21   #1
jack-ft
Membre Expert
 
Inscription : avril 2008
Messages : 799
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 799
Points : 1 808
Points : 1 808
Par défaut [Emacs] Comment mettre à jour la propriété face pour que get-text-property fonctionne correctement?

Bonjour vénérables emacsiens.

Comment faire pour que la propriété "face" soit mise à jour, soit pour tout le fichier, soit autour du "point"?

J'ai écrit une fonction emacs-lisp qui effectue une recherche sur du texte et sur la propriété 'face'.
Cette fonction marche parfaitement lorsque le buffer a été entièrement affiché (via un scroll, par exemple).
Mais, lorsque je viens juste d'ouvrir un fichier, j'ai constaté que la propriété "face" du texte qui n'a pas encore été affiché reste à nil tant qu'il n'a pas été affiché.

Code :
(get-text-property (point) 'face) => nil
J'ai essayé (font-lock-fontify-buffer) mais ça ne provoque pas la mise à jour que je souhaite.

Dans le temps, il y avait un lazy-lock, mais il n'existe pas dans mon emacs.

Comment faire pour que la propriété "face" soit mise à jour, soit pour tout le fichier, soit autour du "point"?

Merci d'avance pour votre aide.

)jack(

Rq:
Pour éviter tout problème de .emacs, j'ai lancé: "emacs -Q" et évalué seulement ma fonction.
GNU Emacs 23.1.1 (i686-pc-linux-gnu, GTK+ Version 2.22.0) of 2011-03-04 on roseapple, modified by Debian
jack-ft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2012, 13h49   #2
jabbounet
Expert Confirmé
 
Avatar de jabbounet
 
Homme frederic frances
Consultant informatique
Inscription : juin 2009
Messages : 1 848
Détails du profil
Informations personnelles :
Nom : Homme frederic frances
Âge : 37

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : juin 2009
Messages : 1 848
Points : 2 675
Points : 2 675
Sur les versions récente d'emacs (23.1 est une version récente) il faut utiliser la propriété 'font-lock-face au lieu de 'face.

La propriété 'face n'est pas affecté par font-lock-mode, ce qui explique que font-lock-fontify-buffer n'as pas d'effets.

Je t'invite à aller lire cet article pour plus de précisions:
http://emacswiki.org/emacs/TextProperties



.
__________________
bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

Emacs Wiki: http://www.emacswiki.org/

En attente de ce que produira: http://www.pushmid.com
jabbounet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2012, 14h42   #3
jack-ft
Membre Expert
 
Inscription : avril 2008
Messages : 799
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 799
Points : 1 808
Points : 1 808
Citation:
Envoyé par jabbounet Voir le message
Sur les versions récente d'emacs (23.1 est une version récente) il faut utiliser la propriété 'font-lock-face au lieu de 'face.

La propriété 'face n'est pas affecté par font-lock-mode, ce qui explique que font-lock-fontify-buffer n'as pas d'effets.

Je t'invite à aller lire cet article pour plus de précisions:
http://emacswiki.org/emacs/TextProperties
Tout d'abord, merci d'avoir répondu!

Je n'ai pas trouvé la réponse à ma question dans le lien que tu m'as proposé... car le problème n'est pas là!

Pour être plus précis, lorsque je positionne le point à l'intérieur d'un commentaire et que je demande la liste (que j'imagine complète) des propriétés ou seulement la propriété qui m'intéresse, j'obtiens ceci:

Code :
1
2
3
4
5
6
7
8
M-: (text-properties-at (point))
=> (face font-lock-comment-face fontified t)

M-: (get-text-property (point) 'font-lock-face)
=> nil

M-: (get-text-property (point) 'face)
=> font-lock-comment-face
Le problème ne vient pas de (get-text-property (point) 'face) lui-même qui fonctionne correctement (ainsi que le montre l'exemple précédent), mais qui ne fonctionne correctement qu'à la condition expresse que le point soit effectivement visible (ou ait été visible à un moment donné).

Pour moi, ça ressemble plutôt à quelque chose comme un problème de caching...

En fait, voici une manière extrêmement simple de mettre en évidence le trait/bug (?).
J'ouvre un fichier avec emacs -Q, je vais "loin" dans le fichier (au moins une page, a priori). Je place le point dans un commentaire et j'évalue:

Code :
1
2
3
4
M-: (point)
=> 14920
M-: (get-text-property 14920 'face)
=> font-lock-comment-face
Je quitte emacs (ou je ferme le fichier) et je relance emacs -Q (ou je rouvre le fichier) et, sans déplacer le point, j'évalue successivement:
Code :
1
2
3
4
5
6
7
8
M-: (get-text-property 14920 'face)
=> nil

M-: (goto-char 14920)
=> 14920

M-: (get-text-property 14920 'face)
=> font-lock-comment-face
Si, ensuite, je reviens au début du fichier et que je retape de nouveau (get-text-property 14920 'face), je continue à obtenir le bon résultat font-lock-comment-face.

Remarque: si, dans l'état initial, je tape:
Code :
1
2
3
4
5
M-: 
(progn (message "1 %s" (get-text-property 14920 'face))
    (goto-char 14920)
    (message "2 %s" (get-text-property 14920 'face)))
=> "2 nil"
Et, en queue du buffer "*Messages*":
Si j'utilise (sit-for 0), ça marche (en rouvrant le même fichier):

Code :
1
2
3
4
5
(progn (message "1 %s" (get-text-property 14920 'face))
    (goto-char 14920)
    (sit-for 0)
    (message "2 %s" (get-text-property 14920 'face)))
=> "2 font-lock-comment-face"
Code :
1
2
3
1 nil
2 font-lock-comment-face
"2 font-lock-comment-face"
Y a-t-il une autre méthode que d'ajouter du (sit-for 0)?

)jack(
jack-ft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2012, 18h06   #4
jack-ft
Membre Expert
 
Inscription : avril 2008
Messages : 799
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 799
Points : 1 808
Points : 1 808
Ne cherchez plus! J'ai eu ma réponse sur gnu.emacs.help.
Je poste un résumé demain.
jack-ft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2012, 11h22   #5
jack-ft
Membre Expert
 
Inscription : avril 2008
Messages : 799
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 799
Points : 1 808
Points : 1 808
Citation:
Envoyé par jack-ft Voir le message
Ne cherchez plus! J'ai eu ma réponse sur gnu.emacs.help.
Je poste un résumé demain.
En fait, si on veut vraiment forcer la fontification, il faut utiliser jit-lock-fontify-now

Mais, ici, ce n'est pas la bonne méthode:
Avec Emacs, pour vérifier si le point courant est à l'intérieur d'un commentaire ou d'une chaine, etc., il vaut mieux utiliser syntaxe-ppss (je confirme que ça marche très bien!).

)jack(
jack-ft est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h39.


 
 
 
 
Partenaires

Hébergement Web