GNU bug report logs -
#36398
Lax char-fold search
Previous Next
Reported by: Juri Linkov <juri <at> linkov.net>
Date: Wed, 26 Jun 2019 21:38:01 UTC
Severity: wishlist
Tags: patch
Fixed in version 27.0.50
Done: Juri Linkov <juri <at> linkov.net>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Before finishing bug#35689, I'd like to implement the argument LAX of
char-fold-to-regexp, so e.g. during isearch when point is at the beginning
of the word with ligature “fix”, typing three letters ‘f’, ‘i’, ‘x’
will keep point matching on the same word:
[char-fold-to-regexp-lax.patch (text/x-diff, inline)]
diff --git a/lisp/char-fold.el b/lisp/char-fold.el
index 7223ecf738..9d3ea17b41 100644
--- a/lisp/char-fold.el
+++ b/lisp/char-fold.el
@@ -148,12 +148,18 @@ char-fold--make-space-string
(make-list n (or (aref char-fold-table ?\s) " ")))))
;;;###autoload
-(defun char-fold-to-regexp (string &optional _lax from)
+(defun char-fold-to-regexp (string &optional lax from)
"Return a regexp matching anything that char-folds into STRING.
Any character in STRING that has an entry in
`char-fold-table' is replaced with that entry (which is a
regexp) and other characters are `regexp-quote'd.
+When LAX is non-nil, then the final character also matches ligatures
+partially, for instance, the search string \"f\" will match \"fi\",
+so when typing the search string in isearch while the cursor is on
+a ligature, the search won't try to immediately advance to the next
+complete match, but will stay on the partially matched ligature.
+
If the resulting regexp would be too long for Emacs to handle,
just return the result of calling `regexp-quote' on STRING.
@@ -183,7 +189,11 @@ char-fold-to-regexp
;; Long string. The regexp would probably be too long.
(alist (unless (> end 50)
(aref multi-char-table c))))
- (push (let ((matched-entries nil)
+ (push (if (and lax alist (= (1+ i) end))
+ (concat "\\(?:" regexp "\\|"
+ (mapconcat (lambda (entry)
+ (cdr entry)) alist "\\|") "\\)")
+ (let ((matched-entries nil)
(max-length 0))
(dolist (entry alist)
(let* ((suffix (car entry))
@@ -212,7 +222,7 @@ char-fold-to-regexp
(concat suffix-regexp
(char-fold-to-regexp subs nil length))))
`((0 . ,regexp) . ,matched-entries) "\\|")
- "\\)"))))
+ "\\)")))))
out))))
(setq i (1+ i)))
(when (> spaces 0)
diff --git a/test/lisp/char-fold-tests.el b/test/lisp/char-fold-tests.el
index 3fde312a13..e9dfd2b733 100644
--- a/test/lisp/char-fold-tests.el
+++ b/test/lisp/char-fold-tests.el
@@ -82,6 +82,14 @@ char-fold--test-search-with-contents
(set-char-table-extra-slot char-fold-table 0 multi)
(char-fold--test-match-exactly (car it) (cdr it)))))
+(ert-deftest char-fold--test-multi-lax ()
+ (dolist (it '(("f" . "fi") ("f" . "ff")))
+ (with-temp-buffer
+ (insert (cdr it))
+ (goto-char (point-min))
+ (should (search-forward-regexp
+ (char-fold-to-regexp (car it) 'lax) nil 'noerror)))))
+
(ert-deftest char-fold--test-fold-to-regexp ()
(let ((char-fold-table (make-char-table 'char-fold-table))
(multi (make-char-table 'char-fold-table)))
This bug report was last modified 6 years and 54 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.