Per quali lingue è appropriato `syntax-ppss`?


12

Ho cercato un modo per rilevare se il punto è su un commento, osservando come il buffer corrente è fontificato.

Smartparens definisce sp-point-in-comment, su cui si basa syntax-ppss. Tuttavia, sembra che syntax-ppsse parse-partial-sexppossa essere usato per linguaggi arbitrari, anche se non usano espressioni s.

Ad esempio, questo Python:

x = 1
# I'm a comment
y = 2

Inserire il punto all'interno del commento e valutare (if (nth 4 (syntax-ppss)) 'comment 'not-comment)funziona correttamente.

Funziona syntax-ppsscon qualsiasi modalità di programmazione? Perché le dotstring parlano delle espressioni s?


1
Non che l'ho esplorato a fondo, ma devo ancora trovare una lingua in cui non funziona. Anche in modalità derivate dal testo come il lattice ha funzionato bene per me.
Malabarba,

Risposte:


13

Bene, le espressioni-s sono essenzialmente "sintassi astratte", nel senso che sono semplicemente una sintassi concreta per gli alberi di sintassi astratti, e quindi qualsiasi linguaggio può essere rappresentato come espressioni-s, e manipolato con comandi di espressione-s. Quindi, syntax-ppssparlare di "Sexps" è semplicemente il modo Lisp di parlare di alberi di sintassi astratti.

Praticamente, tuttavia, syntax-ppssgeneralmente non funziona per nessuna modalità. È mirato fondamentalmente a linguaggi simili a Lisp e se la lingua concreta di una lingua si discosta troppo da Sexps, non ha più molto senso usare i comandi Sexp per manipolare la lingua. Funzionerebbe, ma ci sarebbe un divario troppo grande tra la rappresentazione astratta e la sintassi concreta, il che renderebbe la maggior parte dei comandi contro-intuitivi.

Tuttavia, alcune delle infrastrutture sottostanti syntax-ppsssono abbastanza generiche. Le principali modalità in genere si sforzano di collegarlo, perché le fa funzionare bene con molte funzionalità integrate di Emacs e fornisce un'interfaccia generica per altri pacchetti di terze parti come Smartparens.

In particolare, syntax-ppsssi basa sulle tabelle di sintassi per stringhe e commenti. Le tabelle di sintassi classificano i singoli personaggi in base alla loro classe sintattica. Esistono classi per delimitatori associati, delimitatori di stringa e caratteri di commento.

La struttura di stringhe e commenti è abbastanza simile in quasi tutti i linguaggi di programmazione: le stringhe sono normalmente racchiuse in delimitatori speciali. I commenti possono avere anche delimitatori speciali, oppure iniziare con un certo carattere ed estendersi fino alla fine della riga. Queste strutture possono essere facilmente catturate nelle tabelle di sintassi e quasi tutte le principali modalità definiscono le tabelle di sintassi appropriate, se non altro per trarre profitto dalla fortificazione sintattica di Emacs.

Quindi, syntax-ppssfunziona bene per stringhe e commenti in quasi tutte le lingue, ma il supporto e l '"utilità" di altre funzionalità variano.


4

Aggiungendo alla risposta di @ lunaryorn, penso che la sintassi-ppss si basi solo sulla solidità del sistema di tabelle di sintassi di emacs, che funziona per commenti e stringhe nella maggior parte delle lingue. Ma se il linguaggio ha la sintassi che la tabella della sintassi non può acquisire e se la modalità non ha creato un parser per aggiungere le proprietà della sintassi nei posti giusti, syntax-ppssfallirebbe.

Prova questo in html-mode:

<p class="aa" id='bb'>"cc" 'dd'</p>

e chiama il seguente comando:

(defun inside-string-p (&optional pos)
  "Return non-nil if inside string, else nil.
This depends on major mode having setup syntax table properly."
  (interactive)
  (let ((result (nth 3 (syntax-ppss pos))))
    (print result)
    result))

Solo aa è vero, ma anche bb dovrebbe essere vero.

Quando in nxml-mode, nessuno di essi restituisce true, ma almeno aa dovrebbe essere true.

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.