diff --git a/lisp/char-fold.el b/lisp/char-fold.el index e61bc3edc6..a60d49dd8e 100644 --- a/lisp/char-fold.el +++ b/lisp/char-fold.el @@ -24,6 +24,30 @@ (eval-and-compile (put 'char-fold-table 'char-table-extra-slots 1)) +(eval-and-compile (defcustom char-fold-include-base nil + "Include mappings from composite character to base letter." + :type 'boolean + :group 'matching + :version "27.1")) + +(eval-and-compile (defcustom char-fold-include-alist + '((?\" """ "“" "”" "”" "„" "⹂" "〞" "‟" "‟" "❞" "❝" "❠" "“" "„" "〝" "〟" "🙷" "🙶" "🙸" "«" "»") + (?' "❟" "❛" "❜" "‘" "’" "‚" "‛" "‚" "󠀢" "❮" "❯" "‹" "›") + (?` "❛" "‘" "‛" "󠀢" "❮" "‹")) + "Additional character mappings to include." + :type '(alist :key-type (character :tag "From") + :value-type (repeat (string :tag "To"))) + :group 'lisp + :version "27.1")) + +(eval-and-compile (defcustom char-fold-exclude-alist nil + "Character mappings to exclude from default setting." + :type '(alist :key-type (character :tag "From") + :value-type (character :tag "To")) + :group 'lisp + :version "27.1")) + + (defconst char-fold-table (eval-when-compile (let ((equiv (make-char-table 'char-fold-table)) @@ -76,7 +109,11 @@ char-fold-table (aref equiv-multi (car decomp)))) (aset equiv (car decomp) (cons (char-to-string char) - (aref equiv (car decomp)))))))) + (aref equiv (car decomp)))) + (when char-fold-include-base + (aset equiv char + (cons (char-to-string (car decomp)) + (aref equiv (car decomp))))))))) (funcall make-decomp-match-char decomp char) ;; Do it again, without the non-spacing characters. ;; This allows 'a' to match 'ä'. @@ -98,13 +135,18 @@ char-fold-table table) ;; Add some manual entries. - (dolist (it '((?\" """ "“" "”" "”" "„" "⹂" "〞" "‟" "‟" "❞" "❝" "❠" "“" "„" "〝" "〟" "🙷" "🙶" "🙸" "«" "»") - (?' "❟" "❛" "❜" "‘" "’" "‚" "‛" "‚" "󠀢" "❮" "❯" "‹" "›") - (?` "❛" "‘" "‛" "󠀢" "❮" "‹"))) + (dolist (it char-fold-include-alist) (let ((idx (car it)) (chars (cdr it))) (aset equiv idx (append chars (aref equiv idx))))) + ;; Remove some entries. + (dolist (it char-fold-exclude-alist) + (let ((idx (car it)) + (char (cdr it))) + (when (aref equiv idx) + (aset equiv idx (remove (char-to-string char) (aref equiv idx)))))) + ;; Convert the lists of characters we compiled into regexps. (map-char-table (lambda (char dec-list)