Il existe en fait quatre re-builder
options de syntaxe différentes , et vous pouvez basculer entre elles avecC-cTAB
Deux sont pour les compilateurs d'expressions sexuelles sexp-form rx
et sregex
(mais comme le premier est plus complet et presque entièrement compatible avec la syntaxe, vous pouvez vraiment ignorer sregex à moins que vous ne travailliez avec l'ancien code qui l'utilisait).
Les deux autres options de syntaxe sont read
(la valeur par défaut) et string
(qui est la syntaxe que vous utilisez de manière interactive).
La read
syntaxe est la syntaxe du «code» - c'est-à-dire telle que reconnue par le lecteur lisp - dans laquelle vous entrez l'expression rationnelle selon la syntaxe de lecture pour les chaînes :
C-hig (elisp) Syntax for Strings
RET
La string
syntaxe (que j'ai toujours considérée comme un nom inutilement déroutant dans ce contexte) est la syntaxe d'une chaîne d'expression régulière qui a déjà été lue , et qui n'a donc aucun caractère d'échappement requis lors de l' écriture de la chaîne. Autrement dit, il s'agit de la syntaxe d'expression régulière réelle , la même que celle que vous utilisez lorsque Emacs vous invite de manière interactive.
Si vous souhaitez utiliser la syntaxe de chaîne par défaut, ajoutez ce qui suit à votre fichier init ou utilisez M-x customize-option
RET reb-re-syntax
RET
(setq reb-re-syntax 'string)
Notez que vous pouvez basculer entre la lecture et la syntaxe de chaîne lors de la modification de l'expression rationnelle, sans perte de données. Vous pouvez également passer des formes sexp à la syntaxe de lecture / chaîne (naturellement; la compilation de sexps en chaînes est à quoi ces bibliothèques sont destinées), mais vous ne pouvez pas aller dans l'autre sens et générer un sexp à partir d'une chaîne. re-builder se souvient de ce qu'était le sexp, donc vous ne perdez pas cette forme lorsque vous changez de syntaxe; mais il n'est pas non plus mis à jour si vous modifiez l'expression rationnelle dans une syntaxe différente, puis revenez en arrière. En bref, si vous construisez l'expression rationnelle en tant que sexp, assurez-vous de ne l'éditer qu'en utilisant cette syntaxe.
Un problème avec le rx
support est qu'il utilise en fait la rx-to-string
fonction, ce qui n'est pas tout à fait identique à l'utilisation de la rx
macro dans le code. rx
accepte un nombre arbitraire d'arguments de formulaire et les traite comme une séquence implicite , alors qu'il rx-to-string
n'accepte qu'un seul formulaire, et toute séquence de niveau supérieur doit être rendue explicite avec '(sequence ...)
ou équivalente.
En bref, lorsque vous entrez un formulaire '(...)
dans le reconstructeur, il est traité comme (rx-to-string '(...))
et non(rx ...)
Notez également qu'un formulaire non valide peut entraîner l' re-builder
arrêt de la mise à jour dynamique des correspondances dans le tampon associé, même après que le formulaire est à nouveau validé. La C-cC-uliaison pour reb-force-update
est utile pour résoudre ces situations.
Par défaut, la ligne de mode affiche "RE Builder" lors de l'utilisation de read
ou la string
syntaxe et "RE Builder Lisp" lors de l'utilisation de la syntaxe rx
ou sregex
, mais il semble beaucoup plus utile d'identifier la syntaxe spécifique utilisée (en particulier pour différencier entre read
et string
).
Si vous installez le delight
package à partir de GNU ELPA, vous pouvez utiliser ce qui suit pour ajouter un indicateur de syntaxe à la ligne de mode.
(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))
Cela change le nom du mode en "Regexp [lecture]" dans la read
syntaxe, et de même pour les autres.
Ou pour inclure un indice pour le rx
vs rx-to-string
gotcha décrit ci-dessus, faites en sorte que la ligne de mode dise "Regexp [rx-to-string]" lors de l'utilisation de la rx
syntaxe:
(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))))