come rilevare se all'interno di una coppia abbinata?


16

D: esiste un modo generale per rilevare se il punto si trova all'interno di una coppia di caratteri abbinata?

Cioè: esiste una funzione di predicato generale (o qualcosa) che può determinare se il punto si trova tra una coppia abbinata o alcuni personaggi scelti arbitrariamente? Sto pensando a uno che valuterà t, diciamo, i seguenti scenari, con !riferimento al punto:

"!"   (quotes in general)
``!'' (LaTeX quotes)
$!$   (LaTeX math)
(!)   (lisp parens)
*!*   (org emphasis)

Modifica : syntax-ppsssembra essere un buon punto di partenza, ma non mi è chiaro come si adatterà alle coppie abbinate multi-carattere (ad esempio, le `` citazioni LaTeX '' o addirittura abbinate <b>html tags</b>). Mi chiedo se esiste una soluzione generale o se richiederebbe un parser appositamente progettato.

Risposte:


16

syntax-ppsspotrebbe essere di aiuto qui. Si restituisce una lista che ha anche questi elementi:

  • elemento 0: profondità in parentesi
  • elemento 3: non nullo se all'interno di una stringa

Puoi usarlo in questo modo:

(or (> (nth 0 (syntax-ppss)) 0)
    (nth 3 (syntax-ppss)))

Con una tabella di sintassi correttamente impostata nel buffer (per stringhe e parentesi corrispondenti) la funzione dovrebbe fare ciò che ti aspetti. Se non è possibile utilizzare la tabella di sintassi della modalità, è possibile ricorrere all'utilizzo with-syntax-table.


Vorrei sottolineare che la documentazione di parse-partial-sexpspiega la struttura dei dati restituita syntax-ppssin modo più dettagliato rispetto alla sezione del manuale Elisp a cui ho collegato.
paprika,

2

Se ad esempio vuoi verificare se tra parentesi graffe, usa questo:

(and (looking-back "{") (looking-at "}"))

Certo, puoi sostituire le parentesi graffe con quello che vuoi.

MODIFICARE:

Una funzione più utile sarà qualcosa di simile a questo:

(defun test-inside-curly-braces ()
 (interactive)
 (when (and (looking-back "{\\(.*?\\)") (looking-at "\\(.*?\\)}"))
  (message "inside curly braces")))

2
Funziona solo se il punto è sulla chiusura }e non c'è nulla tra il {}. Ottenere i delimitatori accoppiati con regexps può essere complicato. Meglio usare syntax-ppscome suggerito @paprika.
Tyler,

@Tyler funziona solo se il punto di chiusura }non è il comportamento che ho visto: \ ma sì, ottenere le coppie usando regexps è complicato, anzi
Nsukami _

looking-atesamina il testo a partire dal punto. a meno che il punto non sia sulla }prima affermazione sopra non dovrebbe funzionare? Forse una differenza tra le versioni di Emacs. : /
Tyler,
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.