En realidad, hay cuatro re-builder
opciones de sintaxis diferentes , y puede cambiar entre ellas conC-cTAB
Dos son para los compiladores de expresiones regulares sexp-form rx
y sregex
(pero como el primero es más completo y casi totalmente compatible con la sintaxis, realmente puede ignorar sregex a menos que esté trabajando con el código antiguo que lo usó).
Las otras dos opciones de sintaxis son read
(la predeterminada) y string
(que es la sintaxis que usa de forma interactiva).
La read
sintaxis es la sintaxis de 'código', es decir, tal como lo reconoce el lector de lisp, en la que se ingresa la expresión regular según la sintaxis de lectura para las cadenas :
C-hig (elisp) Syntax for Strings
RET
La string
sintaxis (que siempre he considerado un nombre innecesariamente confuso en este contexto) es la sintaxis de una cadena de expresión regular que ya se ha leído y que, por lo tanto, no requiere que se escape ningún carácter al escribir la cadena. Es decir, esta es la sintaxis de expresión regular real , la misma que usa cuando Emacs le solicita interactivamente.
Si desea utilizar la sintaxis de cadena de forma predeterminada, agregue lo siguiente a su archivo de inicio o use M-x customize-option
RET reb-re-syntax
RET
(setq reb-re-syntax 'string)
Tenga en cuenta que puede alternar entre la sintaxis de lectura y cadena al editar la expresión regular, sin pérdida de datos. También puede cambiar de los formularios sexp a la sintaxis de lectura / cadena (naturalmente; compilar sexps en cadenas es para lo que sirven esas bibliotecas), pero no puede ir en la otra dirección y generar un sexp a partir de una cadena. re-builder recuerda cuál era el sexp, por lo que no pierde esa forma cuando cambia la sintaxis; pero tampoco se actualiza si modifica la expresión regular en una sintaxis diferente y luego cambia de nuevo. En resumen, si está creando la expresión regular como sexp, asegúrese de editarla solo mientras usa esa sintaxis.
Un problema con el rx
soporte es que en realidad está usando la rx-to-string
función, que no es exactamente idéntica a usar la rx
macro en el código. rx
acepta un número arbitrario de argumentos de forma y los trata como una secuencia implícita , mientras que rx-to-string
solo acepta una única forma, y cualquier secuencia de nivel superior debe hacerse explícita con '(sequence ...)
o equivalente.
En resumen, cuando ingresa un formulario '(...)
en el re-constructor, se procesa como (rx-to-string '(...))
y no(rx ...)
También tenga en cuenta que un formulario no válido puede hacer re-builder
que deje de actualizar dinámicamente las coincidencias en el búfer asociado, incluso después de que el formulario vuelva a ser válido. El C-cC-uenlace para reb-force-update
es útil para resolver estas situaciones.
Por defecto, la línea de modo muestra "RE Builder" cuando se usa read
o string
sintaxis, y "RE Builder Lisp" cuando se usa rx
o sregex
sintaxis, pero parece mucho más útil identificar la sintaxis específica en uso (especialmente para diferenciar entre read
y string
).
Si instala el delight
paquete desde GNU ELPA, puede usar lo siguiente para agregar un indicador de sintaxis a la línea de modo.
(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))
Esto cambia el nombre del modo a "Regexp [lectura]" en read
sintaxis, y lo mismo para los demás.
O para incluir una pista para el gotcha rx
vs rx-to-string
descrito anteriormente, haga que la línea de modo diga "Regexp [rx-to-string]" cuando use la rx
sintaxis:
(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))))