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.
font-lock-mode
? (Pas que je pense que vous devriez.)