Lors de l'écriture d'un mode majeur, il est souvent utile de savoir «est le point dans une chaîne? 'est le point dans un commentaire?'.
La plupart des modes principaux semblent tenter d'analyser le langage de programmation. Par exemple:
python-syntax-content
appelssyntax-ppss
haskell-fill-paragraph
appelssyntax-ppss
etre-search-forward
c-in-comment-line-prefix-p
se déplace et appellelooking-at
sp-point-in-comment
appellesyntax-ppss
mais vérifie également si c'est sur un délimiteur de commentaire
Cependant, cela ne fonctionne pas dans certains cas. Dans les tampons en mode org, les commentaires dans les blocs source ne sont pas correctement détectés par ces approches.
Cela semble également inutile, car le tampon affiche déjà des commentaires mis en évidence .
Au lieu de cela, vous pouvez simplement inspecter les faces au point:
(defun wh--get-faces (pos)
"Get all the font faces at POS."
(remq nil
(list
(get-char-property pos 'read-face-name)
(get-char-property pos 'face)
(plist-get (text-properties-at pos) 'face))))
(defun wh-string-p (pos)
"Return non-nil if POS is inside a string."
(memq 'font-lock-string-face (wh--get-faces pos)))
Pourquoi les modes principaux ne font-ils pas cela? Le tampon est déjà fontifié, donc je m'attends à ce que ce soit plus rapide, plus robuste et nécessite moins de code.
major-mode
syntax-highlighting
Wilfred Hughes
la source
la source
font-lock-mode
? (Pas que je pense que vous devriez.)Réponses:
Le problème est qu'il n'est pas plus robuste.
Premièrement, les modes principaux sont précisément ceux responsables de décider ce qu'est un commentaire ou une chaîne. S'ils étaient en mesure de les définir avec succès à des fins de verrouillage des polices, ils devraient être en mesure de faire de même à d'autres fins.
Deuxièmement, la lecture de la syntaxe pour déterminer le contexte dans lequel se trouve le point est la manière la plus robuste de le faire si elle est bien faite. Si vous avez trouvé des cas où cela échoue, il vaut la peine de soumettre un rapport de bogue à l'auteur en mode principal.
La raison pour laquelle l'inspection des visages est moins robuste est qu'elle peut échouer dans certaines situations.
Pour commencer, l'utilisateur aurait pu désactiver
font-lock-mode
(peut-être que c'est un énorme tampon), mais même avecfont-lock-mode
activé, les visages sont quelque peu instables.De plus, l'utilisateur pourrait avoir un mode mineur qui en ajoute
font-lock-keywords
(comme la miseTODO
en évidence dans les commentaires). Ou il peut y avoir un mode mineur qui applique dynamiquement certains visages après que font-lock a police le tampon.En résumé, le mode majeur n'a aucune garantie que les faces qu'il définit sont les faces actuellement appliquées.
la source
Je suppose que la raison principale est que le verrouillage des polices est utilisé
syntax-ppss
.la source