Pourquoi les modes principaux n'inspectent-ils pas simplement les visages?

10

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 appels syntax-ppss
  • haskell-fill-paragraphappels syntax-ppssetre-search-forward
  • c-in-comment-line-prefix-p se déplace et appelle looking-at
  • sp-point-in-commentappelle syntax-ppssmais 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.

Wilfred Hughes
la source
1
J'aime cette question. Cependant, que faire si vous n'utilisez pas font-lock-mode? (Pas que je pense que vous devriez.)
mbork

Réponses:

12

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.

  1. Pour commencer, l'utilisateur aurait pu désactiver font-lock-mode(peut-être que c'est un énorme tampon), mais même avec font-lock-modeactivé, les visages sont quelque peu instables.

  2. De plus, l'utilisateur pourrait avoir un mode mineur qui en ajoute font-lock-keywords(comme la mise TODOen é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.

Malabarba
la source
2

Je suppose que la raison principale est que le verrouillage des polices est utilisé syntax-ppss.

Stefan
la source