Насправді є чотири різні re-builder
варіанти синтаксису, і ви можете перемикатися між нимиC-cTAB
Два призначені для компіляторів регулярного генерування формату sexp rx
і sregex
(але, коли перший є всеосяжнішим і майже повністю сумісним із синтаксисом, ви можете дійсно ігнорувати sregex, якщо ви не працюєте зі старим кодом, який використовував його).
Інші два варіанти синтаксису - це read
(за замовчуванням) та string
(що є синтаксисом, який ви використовуєте інтерактивно).
read
Синтаксис «код» синтаксис - тобто як визнання читача LISP - в якому ви вводите регулярний вираз відповідно до синтаксисом читання для рядків :
C-hig (elisp) Syntax for Strings
RET
string
Синтаксис (який я завжди вважав зайве заплутаним ім'я в даному контексті) є синтаксис регулярних виразів рядки , яка вже була зчитана , і які , отже , не має будь - якої з зарезервованих символів потрібно при написанні рядка. Що означає, це власне синтаксис регулярного виразу, такий самий, як ви використовуєте, коли Emacs підкаже вам інтерактивно.
Якщо ви хочете використовувати синтаксис рядків за замовчуванням, додайте наступне у свій файл init або використовуйте M-x customize-option
RET reb-re-syntax
RET
(setq reb-re-syntax 'string)
Зауважте, що ви можете перемикатися між синтаксисом читання та рядка під час редагування регулярного вираження без втрати даних. Ви також можете переключитися з сексових форм на синтаксис читання / рядка (природно; для цих бібліотек є компіляція сексорів до рядків), але ви не можете піти в іншому напрямку та генерувати секпс із рядка. реконструктор пам’ятає, яким був сексп, тому ви не втрачаєте такої форми, змінюючи синтаксис; але він також не оновлюється, якщо змінити регулярний вираз в іншому синтаксисі, а потім змінити назад. Коротше кажучи, якщо ви будуєте регулярний параметр як sexp, переконайтесь, що ви його редагуєте лише під час використання цього синтаксису.
Гатча з rx
підтримкою полягає в тому, що вона фактично використовує rx-to-string
функцію, яка не зовсім ідентична використанню rx
макросу в коді. rx
приймає довільну кількість аргументів форми і трактує їх як мається на увазі послідовність , тоді як rx-to-string
приймає лише одну форму, і будь-яка послідовність верхнього рівня повинна бути зроблена явною з '(sequence ...)
або еквівалентною.
Коротше кажучи, коли ви вводите форму '(...)
в реконструктор, вона обробляється як (rx-to-string '(...))
і ні(rx ...)
Також візьміть до уваги, що неправильна форма може призвести re-builder
до припинення динамічного оновлення відповідностей у відповідному буфері, навіть після того, як форма знову буде чинною. C-cC-uЗв'язування для reb-force-update
корисний для вирішення цих ситуацій.
За замовчуванням рядок режимів показує "RE Builder" при використанні read
або string
синтаксисі та "RE Builder Lisp" при використанні rx
або sregex
синтаксисі, але здається набагато кориснішим визначити конкретний синтаксис, який використовується (особливо для розмежування між read
і string
).
Якщо ви встановите delight
пакет з GNU ELPA, ви можете скористатися наступним, щоб додати індикатор синтаксису до рядка режиму.
(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))
Це змінює ім'я режиму на "Regexp [read]" у read
синтаксисі, а також для інших.
Або щоб включити підказку для rx
vs rx-to-string
gotcha, описану вище, вкажіть рядок режиму "Regexp [rx-to-string]" при використанні rx
синтаксису:
(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))))