diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el index d361971a1f..f536c10a13 100644 --- a/lisp/international/mule-cmds.el +++ b/lisp/international/mule-cmds.el @@ -3092,6 +3092,37 @@ mule--ucs-names-annotation (let ((char (gethash name ucs-names))) (when char (format " (%c)" char)))) +(defun mule--ucs-names-by-group (names) + (let* ((names-chars + (mapcar (lambda (name) (cons name (gethash name ucs-names))) names)) + (groups-names + (seq-group-by + (lambda (name-char) + (let ((script (aref char-script-table (cdr name-char)))) + (if script (symbol-name script) "ungrouped"))) + names-chars)) + names-headers header) + (dolist (group groups-names) + (setq header t) + (dolist (name-char (cdr group)) + (push (list (car name-char) + (concat + ;; header + (if header + (progn + (setq header nil) + (concat "\n" (propertize + (format "* %s\n" (car group)) + 'face 'header-line))) + "") + ;; prefix + (if (cdr name-char) (format "%c" (cdr name-char)) " ") + " ") + ;; suffix + "") + names-headers))) + (nreverse names-headers))) + (defun char-from-name (string &optional ignore-case) "Return a character as a number from its Unicode name STRING. If optional IGNORE-CASE is non-nil, ignore case in STRING. @@ -3138,8 +3169,10 @@ read-char-by-name prompt (lambda (string pred action) (if (eq action 'metadata) - '(metadata - (annotation-function . mule--ucs-names-annotation) + `(metadata + ,(if completions-detailed + '(affix-function . mule--ucs-names-by-group) + '(annotation-function . mule--ucs-names-annotation)) (category . unicode-name)) (complete-with-action action (ucs-names) string pred))))) (char