Tatsächlich gibt es vier verschiedene re-builder
Syntaxoptionen, zwischen denen Sie mit wechseln könnenC-cTAB
Zwei sind für die Regexp-Compiler in Sexp-Form rx
und sregex
(da der erstere jedoch umfassender und fast vollständig syntaktisch kompatibel ist, können Sie sregex wirklich ignorieren, es sei denn, Sie arbeiten zufällig mit altem Code, der ihn verwendet hat).
Die anderen beiden Syntaxoptionen sind read
(die Standardeinstellung) und string
(die Syntax, die Sie interaktiv verwenden).
Die read
Syntax ist die 'Code'-Syntax - dh wie vom Lisp-Reader erkannt -, in der Sie den regulären Ausdruck gemäß der Lesesyntax für Zeichenfolgen eingeben :
C-hig (elisp) Syntax for Strings
RET
Die string
Syntax (die ich in diesem Zusammenhang immer als unnötig verwirrend angesehen habe) ist die Syntax einer Zeichenfolge mit regulären Ausdrücken, die bereits gelesen wurde und die daher keine Zeichen enthält, die beim Schreiben der Zeichenfolge maskiert werden müssen. Das heißt, dies ist die eigentliche Syntax für reguläre Ausdrücke, die Sie auch verwenden, wenn Emacs Sie interaktiv dazu auffordert.
Wenn Sie standardmäßig die Zeichenfolgensyntax verwenden möchten, fügen Sie der Init-Datei Folgendes hinzu, oder verwenden Sie M-x customize-option
RET reb-re-syntax
RET
(setq reb-re-syntax 'string)
Beachten Sie, dass Sie beim Bearbeiten des regulären Ausdrucks ohne Datenverlust zwischen Lese- und Zeichenfolgensyntax wechseln können. Sie können auch von den Sexp-Formularen zur Lese- / Zeichenfolgensyntax wechseln (natürlich ist das Kompilieren von Sexps zu Zeichenfolgen das, wofür diese Bibliotheken bestimmt sind), aber Sie können nicht in die andere Richtung gehen und ein Sexp aus einer Zeichenfolge generieren. re-builder merkt sich, was der sexp war, damit Sie diese Form nicht verlieren , wenn Sie die Syntax ändern. Es wird jedoch auch nicht aktualisiert, wenn Sie den regulären Ausdruck in einer anderen Syntax ändern und dann zurückkehren. Kurz gesagt, wenn Sie den regulären Ausdruck als Sexp erstellen, stellen Sie sicher, dass Sie ihn nur bearbeiten, während Sie diese Syntax verwenden.
Ein Problem mit der rx
Unterstützung ist, dass die rx-to-string
Funktion tatsächlich verwendet wird, was nicht ganz mit der Verwendung des rx
Makros im Code identisch ist . rx
akzeptiert eine beliebige Anzahl von Formularargumenten und behandelt sie als implizite Folge , während rx-to-string
nur ein einzelnes Formular akzeptiert wird und jede Folge der obersten Ebene explizit mit '(sequence ...)
oder gleichwertig sein muss.
Kurz gesagt, wenn Sie ein Formular eingeben '(...)
in Re-Builder wird es verarbeitet , wie (rx-to-string '(...))
und nicht(rx ...)
Beachten Sie auch, dass ein ungültiges Formular dazu führen kann re-builder
, dass die Übereinstimmungen im zugehörigen Puffer möglicherweise nicht mehr dynamisch aktualisiert werden, selbst wenn das Formular wieder gültig ist. Die C-cC-uBindung für reb-force-update
ist nützlich, um diese Situationen zu lösen.
Standardmäßig zeigt die Mode-Zeile "RE Builder" bei Verwendung von read
oder string
Syntax und "RE Builder Lisp" bei Verwendung von rx
oder sregex
Syntax, aber es scheint weitaus nützlicher zu sein, die verwendete spezifische Syntax zu identifizieren (insbesondere um zwischen read
und zu unterscheiden string
).
Wenn Sie das delight
Paket von GNU ELPA installieren , können Sie Folgendes verwenden, um der mode-Zeile einen Syntaxindikator hinzuzufügen.
(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))
Dies ändert den Modusnamen in der read
Syntax in "Regexp [read]" , ebenso für die anderen.
Wenn Sie einen Hinweis für das oben beschriebene rx
vs rx-to-string
gotcha einfügen möchten, geben Sie in der Moduszeile "Regexp [rx-to-string]" ein, wenn Sie die rx
Syntax verwenden:
(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))))