¿Por qué los modos principales no solo inspeccionan las caras?

10

Al escribir un modo principal, a menudo es útil saber '¿es un punto en una cadena?' 'es punto en un comentario?'.

La mayoría de los modos principales parecen intentar analizar el lenguaje de programación. Por ejemplo:

  • python-syntax-content llamadas syntax-ppss
  • haskell-fill-paragraphllamadas syntax-ppssyre-search-forward
  • c-in-comment-line-prefix-p mueve punto y llama looking-at
  • sp-point-in-commentllama syntax-ppsspero también comprueba si está en un delímetro de comentarios

Sin embargo, esto no funciona en algunos casos. En las memorias intermedias del modo org, estos enfoques no detectan correctamente los comentarios en los bloques fuente.

También parece inútil, ya que el búfer ya muestra comentarios resaltados .

En cambio, simplemente puede inspeccionar las caras en el punto:

(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)))

¿Por qué los modos principales no hacen esto? El búfer ya está fontificado, por lo que espero que sea más rápido, más robusto y requiera menos código.

Wilfred Hughes
fuente
1
Me gusta esta pregunta Sin embargo, ¿qué pasa si no lo usas font-lock-mode? (No es que piense que
debas

Respuestas:

12

El problema es que no es más robusto.

En primer lugar, los modos principales son precisamente los responsables de decidir qué es un comentario o una cadena. Si pudieron definirlos con éxito con el propósito de bloquear la fuente, deberían poder hacer lo mismo para otros fines.

En segundo lugar, leer la sintaxis para determinar el contexto en el que se encuentra el punto es la forma más sólida de hacerlo si se hace correctamente. Si ha encontrado casos en los que eso falla, vale la pena enviar un informe de error al autor del modo principal.


La razón por la que inspeccionar las caras es menos robusta es porque puede fallar en algunas situaciones.

  1. Para empezar, el usuario podría haber deshabilitado font-lock-mode(tal vez es un gran búfer), pero incluso con font-lock-modehabilitado, las caras son algo inestables.

  2. Además, el usuario podría tener un modo menor que agregue algunos font-lock-keywords(como resaltar TODOen los comentarios). O puede haber un modo menor que aplica dinámicamente algunas caras después de que font-lock haya fontificado el búfer.

En resumen, el modo principal no garantiza que las caras definidas por él sean las caras aplicadas actualmente.

Malabarba
fuente
2

Supongo que la razón principal es porque utiliza el bloqueo de fuente syntax-ppss.

Stefan
fuente