]> git.eshelyaron.com Git - emacs.git/commitdiff
Follow decomposition chains when constructing char-fold-table
authorRobert Pluim <rpluim@gmail.com>
Mon, 22 Jul 2019 18:27:59 +0000 (20:27 +0200)
committerRobert Pluim <rpluim@gmail.com>
Tue, 23 Jul 2019 17:39:06 +0000 (19:39 +0200)
* lisp/char-fold.el (char-fold-make-table): Decompose the
decomposition of each character, adding equivalences to the original
character, until no more decompositions are left.

etc/NEWS
lisp/char-fold.el

index 7fd2214582155dd4b1be60dd576f16e402479d9f..6a02c386960e311507652c7b05882aa9c6782d89 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1167,6 +1167,14 @@ and case-sensitivity together with search strings in the search ring.
 +++
 *** 'flush-lines' prints and returns the number of deleted matching lines.
 
+---
+*** 'char-fold-to-regexp' now matches more variants of a base character.
+The table used to check for equivalence of characters is now built
+using the complete chain of unicode decompositions of a character,
+rather than stopping after one level, such that searching for
+e.g. GREEK SMALL LETTER IOTA will now also find GREEK SMALL LETTER
+IOTA WITH OXIA.
+
 ** Debugger
 
 +++
index 9d3ea17b413e15de5aaf511b366c716cd1a718c5..a5c4e5e411b30fc4ffed152d70d5b5a9b0c145b6 100644 (file)
                               (cons (char-to-string char)
                                     (aref equiv (car decomp))))))))
                (funcall make-decomp-match-char decomp char)
+               ;; Check to see if the first char of the decomposition
+               ;; has a further decomposition.  If so, add a mapping
+               ;; back from that second decomposition to the original
+               ;; character.  This allows e.g. 'ι' (GREEK SMALL LETTER
+               ;; IOTA) to match both the Basic Greek block and
+               ;; Extended Greek block variants of IOTA +
+               ;; diacritical(s).  Repeat until there are no more
+               ;; decompositions.
+               (let ((dec decomp)
+                     next-decomp)
+                   (while dec
+                     (setq next-decomp (char-table-range table (car dec)))
+                     (when (consp next-decomp)
+                       (when (symbolp (car next-decomp))
+                         (setq next-decomp (cdr next-decomp)))
+                       (if (not (eq (car dec)
+                                    (car next-decomp)))
+                           (funcall make-decomp-match-char (list (car next-decomp)) char)))
+                     (setq dec next-decomp)))
                ;; Do it again, without the non-spacing characters.
                ;; This allows 'a' to match 'ä'.
                (let ((simpler-decomp nil)