Sebenarnya ada empat re-builder
opsi sintaks yang berbeda , dan Anda dapat beralih di antaranyaC-cTAB
Dua adalah untuk kompiler regexp sexp-form rx
dan sregex
(tetapi karena yang pertama lebih komprehensif dan hampir seluruhnya kompatibel dengan sintaks, Anda benar-benar dapat mengabaikan sregex kecuali Anda kebetulan bekerja dengan kode lama yang menggunakannya).
Dua opsi sintaks lainnya adalah read
(default) dan string
(yang merupakan sintaks yang Anda gunakan secara interaktif).
The read
sintaks adalah 'kode' sintaks - yaitu seperti yang diakui oleh cadel pembaca - di mana Anda memasukkan regexp sesuai sintaks membaca untuk string :
C-hig (elisp) Syntax for Strings
RET
The string
sintaks (yang saya selalu dianggap sebagai nama tidak perlu membingungkan dalam konteks ini) adalah sintaks dari string ekspresi reguler yang telah dibaca , dan yang karenanya tidak memiliki karakter melarikan diri diperlukan saat menulis string. Artinya, ini adalah sintaks ekspresi reguler aktual , sama seperti yang Anda gunakan saat Emacs meminta Anda secara interaktif.
Jika Anda ingin menggunakan sintaks string secara default, tambahkan berikut ini ke file init Anda, atau gunakan M-x customize-option
RET reb-re-syntax
RET
(setq reb-re-syntax 'string)
Perhatikan bahwa Anda dapat beralih antara sintaks baca dan string saat mengedit regexp, tanpa kehilangan data. Anda juga dapat beralih dari bentuk sexp ke membaca / sintaksis string (secara alami; kompilasi sexps menjadi string untuk apa perpustakaan itu), tetapi Anda tidak bisa pergi ke arah lain dan menghasilkan sexp dari string. re-builder mengingat apa itu sexp, jadi Anda tidak kehilangan formulir itu saat Anda mengubah sintaks; tetapi juga tidak bisa diperbarui jika Anda memodifikasi regexp dalam sintaks yang berbeda dan kemudian mengubahnya kembali. Singkatnya, jika Anda membangun regexp sebagai sexp, pastikan Anda hanya mengeditnya saat menggunakan sintaks itu.
Gotcha dengan rx
dukungannya adalah bahwa itu sebenarnya menggunakan rx-to-string
fungsi, yang tidak cukup identik dengan menggunakan rx
makro dalam kode. rx
menerima sejumlah argumen bentuk yang sewenang-wenang dan memperlakukannya sebagai urutan yang tersirat , sedangkan rx-to-string
hanya menerima bentuk tunggal, dan urutan tingkat atas apa pun harus dibuat eksplisit dengan '(sequence ...)
atau setara.
Singkatnya, ketika Anda memasukkan formulir '(...)
di pembangun ulang, itu diproses sebagai (rx-to-string '(...))
dan tidak(rx ...)
Perhatikan juga bahwa formulir yang tidak valid dapat menyebabkan re-builder
berhenti memperbarui secara dinamis kecocokan dalam buffer terkait, bahkan setelah formulir dibuat valid lagi. The C-cC-uuntuk mengikat reb-force-update
berguna untuk menyelesaikan situasi ini.
Secara default, baris mode menampilkan "RE Builder" saat menggunakan read
atau string
sintaks, dan "RE Builder Lisp" saat menggunakan rx
atau sregex
sintaks, tetapi tampaknya jauh lebih berguna untuk mengidentifikasi sintaks tertentu yang digunakan (terutama untuk membedakan antara read
dan string
).
Jika Anda menginstal delight
paket dari GNU ELPA, Anda dapat menggunakan yang berikut ini untuk menambahkan indikator sintaks ke baris mode.
(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))
Ini mengubah nama mode menjadi "Regexp [baca]" dalam read
sintaks, dan juga untuk yang lain.
Atau untuk menyertakan petunjuk untuk rx
vs rx-to-string
gotcha yang dijelaskan di atas, buat baris mode mengatakan "Regexp [rx-to-string]" saat menggunakan rx
sintaks:
(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))))