Perché le modalità principali non controllano solo i volti?


10

Quando si scrive una modalità principale, è spesso utile sapere "è il punto in una stringa?" 'è il punto in un commento?'.

La maggior parte delle modalità principali sembra tentare di analizzare il linguaggio di programmazione. Per esempio:

  • python-syntax-content chiamate syntax-ppss
  • haskell-fill-paragraphchiamate syntax-ppssere-search-forward
  • c-in-comment-line-prefix-p si sposta in giro e chiama looking-at
  • sp-point-in-commentchiama syntax-ppssma controlla anche se si trova su un delimitatore di commenti

Tuttavia, questo non funziona in alcuni casi. Nei buffer in modalità org, questi commenti non rilevano correttamente i commenti nei blocchi di origine.

Sembra anche inutile, poiché il buffer sta già mostrando i commenti evidenziati .

Invece, potresti semplicemente ispezionare le facce al 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)))

Perché le modalità principali non lo fanno? Il buffer è già disponibile, quindi mi aspetto che questo sia più veloce, più robusto e richieda meno codice.


1
Mi piace questa domanda. Tuttavia, cosa succede se non si utilizza font-lock-mode? (Non che penso che dovresti.)
mbork,

Risposte:


12

Il problema è che non è più robusto.

In primo luogo, le modalità principali sono proprio quelle responsabili di decidere cos'è un commento o una stringa. Se fossero stati in grado di definirli con successo ai fini del blocco dei caratteri, dovrebbero essere in grado di fare lo stesso per altri scopi.

In secondo luogo, leggere la sintassi per determinare il contesto in cui si trova il punto è il modo più efficace di farlo se viene eseguito correttamente. Se hai trovato casi in cui ciò fallisce, vale la pena inviare una segnalazione di bug all'autore della modalità principale.


Il motivo per cui l'ispezione delle facce è meno robusto è perché può fallire in alcune situazioni.

  1. Per cominciare, l'utente avrebbe potuto disabilitare font-lock-mode(forse è un buffer enorme), ma anche con font-lock-modeabilitato, i volti sono alquanto instabili.

  2. Inoltre, l'utente potrebbe avere una modalità minore che ne aggiunge alcune font-lock-keywords(come l'evidenziazione TODOnei commenti). Oppure potrebbe esserci una modalità minore che applica dinamicamente alcune facce dopo che il blocco dei caratteri ha reso disponibile il buffer.

In sintesi, la modalità principale non ha alcuna garanzia che le facce definite da essa siano le facce attualmente applicate.


2

Immagino che il motivo principale sia perché usa il font-lock syntax-ppss.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.