Tatsächlich gibt es vier verschiedene re-builderSyntaxoptionen, zwischen denen Sie mit wechseln könnenC-cTAB
Zwei sind für die Regexp-Compiler in Sexp-Form rxund 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 readSyntax 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 stringSyntax (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 rxUnterstützung ist, dass die rx-to-stringFunktion tatsächlich verwendet wird, was nicht ganz mit der Verwendung des rxMakros im Code identisch ist . rxakzeptiert eine beliebige Anzahl von Formularargumenten und behandelt sie als implizite Folge , während rx-to-stringnur 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-updateist nützlich, um diese Situationen zu lösen.
Standardmäßig zeigt die Mode-Zeile "RE Builder" bei Verwendung von readoder stringSyntax und "RE Builder Lisp" bei Verwendung von rxoder sregexSyntax, aber es scheint weitaus nützlicher zu sein, die verwendete spezifische Syntax zu identifizieren (insbesondere um zwischen readund zu unterscheiden string).
Wenn Sie das delightPaket 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 readSyntax in "Regexp [read]" , ebenso für die anderen.
Wenn Sie einen Hinweis für das oben beschriebene rxvs rx-to-stringgotcha einfügen möchten, geben Sie in der Moduszeile "Regexp [rx-to-string]" ein, wenn Sie die rxSyntax 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))))