Esistono in realtà quattro diverse re-builderopzioni di sintassi e puoi passare da una all'altraC-cTAB
Due sono per i compilatori regexp sexp-form rxe 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 readsintassi è 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 stringsintassi (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 rxsupporto è che sta effettivamente utilizzando la rx-to-stringfunzione, che non è del tutto identica all'utilizzo della rxmacro nel codice. rxaccetta un numero arbitrario di argomenti di forma e li tratta come una sequenza implicita , mentre rx-to-stringaccetta 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-builderl'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 reado la stringsintassi e "RE Builder Lisp" quando si utilizza rxo la sregexsintassi, ma sembra molto più utile identificare la sintassi specifica in uso (in particolare per distinguere tra reade string).
Se si installa il delightpacchetto 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 readsintassi e allo stesso modo per gli altri.
O per includere un suggerimento per il rxvs rx-to-stringgotcha descritto sopra, fai dire alla riga della modalità "Regexp [rx-to-string]" quando usi la rxsintassi:
(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))))