Esistono in realtà quattro diverse re-builder
opzioni di sintassi e puoi passare da una all'altraC-cTAB
Due sono per i compilatori regexp sexp-form rx
e sregex
(ma poiché il primo è più completo e quasi completamente compatibile con la sintassi, puoi davvero ignorare sregex a meno che tu non stia lavorando con il vecchio codice che lo usava).
Le altre due opzioni di sintassi sono read
(impostazione predefinita) e string
(che è la sintassi che si utilizza in modo interattivo).
La read
sintassi è la sintassi del 'codice' - cioè riconosciuta dal lettore lisp - in cui si inserisce la regexp secondo la sintassi di lettura per le stringhe :
C-hig (elisp) Syntax for Strings
RET
La string
sintassi (che ho sempre considerato un nome inutilmente confuso in questo contesto) è la sintassi di una stringa di espressione regolare che è già stata letta e che pertanto non ha alcun carattere di escape necessario durante la scrittura della stringa. Vale a dire, questa è la sintassi dell'espressione regolare effettiva , la stessa che usi quando Emacs ti richiede in modo interattivo.
Se si desidera utilizzare la sintassi della stringa per impostazione predefinita, aggiungere quanto segue al file init o utilizzare M-x customize-option
RET reb-re-syntax
RET
(setq reb-re-syntax 'string)
Si noti che è possibile alternare tra la sintassi di lettura e stringa durante la modifica di regexp, senza perdita di dati. Puoi anche passare dai form di sexp alla sintassi read / string (naturalmente; compilare sexp in stringhe è ciò a cui servono quelle librerie), ma non puoi andare nell'altra direzione e generare un sexp da una stringa. re-builder ricorda qual era il sexp, quindi non perdi quella forma quando cambi sintassi; ma inoltre non viene aggiornato se si modifica regexp in una sintassi diversa e poi si torna indietro. In breve, se stai costruendo il regexp come sexp, assicurati di modificarlo solo mentre usi quella sintassi.
Un problema con il rx
supporto è che sta effettivamente utilizzando la rx-to-string
funzione, che non è del tutto identica all'utilizzo della rx
macro nel codice. rx
accetta un numero arbitrario di argomenti di forma e li tratta come una sequenza implicita , mentre rx-to-string
accetta solo una forma singola e qualsiasi sequenza di livello superiore deve essere resa esplicita '(sequence ...)
o equivalente.
In breve, quando si inserisce un modulo '(...)
in re-builder, viene elaborato come (rx-to-string '(...))
e non(rx ...)
Si noti inoltre che un modulo non valido potrebbe causare re-builder
l'interruzione dell'aggiornamento dinamico delle corrispondenze nel buffer associato, anche dopo che il modulo è stato reso nuovamente valido. L' C-cC-uassociazione per reb-force-update
è utile per risolvere queste situazioni.
Per impostazione predefinita, la riga della modalità mostra "RE Builder" quando si utilizza read
o la string
sintassi e "RE Builder Lisp" quando si utilizza rx
o la sregex
sintassi, ma sembra molto più utile identificare la sintassi specifica in uso (in particolare per distinguere tra read
e string
).
Se si installa il delight
pacchetto da GNU ELPA, è possibile utilizzare quanto segue per aggiungere un indicatore di sintassi alla riga della modalità.
(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))
Questo cambia il nome della modalità in "Regexp [leggi]" nella read
sintassi e allo stesso modo per gli altri.
O per includere un suggerimento per il rx
vs rx-to-string
gotcha descritto sopra, fai dire alla riga della modalità "Regexp [rx-to-string]" quando usi la rx
sintassi:
(let ((name '("Regexp["
(:eval (symbol-name (if (eq reb-re-syntax 'rx)
'rx-to-string
reb-re-syntax)))
"]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))