1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-04-29 09:43:56 -07:00

Allow characters and single-char strings in rx charsets

The `not' and `intersection' forms, and `or' inside these forms,
now accept characters and single-character strings as arguments.
Previously, they had to be wrapped in `any' forms.
This does not add expressive power but is a convenience and is easily
understood.

* doc/lispref/searching.texi (Rx Constructs): Amend the documentation.
* etc/NEWS: Announce the change.
* lisp/emacs-lisp/rx.el (rx--charset-p, rx--translate-not)
(rx--charset-intervals, rx): Accept characters and 1-char strings in
more places.
* test/lisp/emacs-lisp/rx-tests.el (rx-not, rx-charset-or)
(rx-def-in-charset-or, rx-intersection): Test the change.
This commit is contained in:
Mattias Engdegård 2019-12-13 13:10:58 +01:00
parent b04086adf6
commit 82b4e48c59
4 changed files with 43 additions and 17 deletions

View file

@ -272,7 +272,9 @@
(should (equal (rx (not (category tone-mark)) (not (category lao)))
"\\C4\\Co"))
(should (equal (rx (not (not ascii)) (not (not (not (any "a-z")))))
"[[:ascii:]][^a-z]")))
"[[:ascii:]][^a-z]"))
(should (equal (rx (not ?a) (not "b") (not (not "c")) (not (not ?d)))
"[^a][^b]cd")))
(ert-deftest rx-charset-or ()
(should (equal (rx (or))
@ -294,13 +296,17 @@
"[a-ru-z]"))
(should (equal (rx (or (intersection (any "c-z") (any "a-g"))
(not (any "a-k"))))
"[^abh-k]")))
"[^abh-k]"))
(should (equal (rx (or ?f (any "b-e") "a") (not (or ?x "y" (any "s-w"))))
"[a-f][^s-y]")))
(ert-deftest rx-def-in-charset-or ()
(rx-let ((a (any "badc"))
(b (| a (any "def"))))
(should (equal (rx (or b (any "q")))
"[a-fq]")))
(b (| a (any "def")))
(c ?a)
(d "b"))
(should (equal (rx (or b (any "q")) (or c d))
"[a-fq][ab]")))
(rx-let ((diff-| (a b) (not (or (not a) b))))
(should (equal (rx (diff-| (any "a-z") (any "gr")))
"[a-fh-qs-z]"))))
@ -326,7 +332,9 @@
"[e-m]"))
(should (equal (rx (intersection (or (any "a-f") (any "f-t"))
(any "e-w")))
"[e-t]")))
"[e-t]"))
(should (equal (rx (intersection ?m (any "a-z") "m"))
"m")))
(ert-deftest rx-def-in-intersection ()
(rx-let ((a (any "a-g"))