From 13e032bab34fb33efee23184c02baa62ebe4dbfc Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Fri, 27 Nov 2020 11:17:12 +0200 Subject: [PATCH] Add completion-tab-width to align prefix chars with names in read-char-by-name * lisp/international/mule-cmds.el (mule--ucs-names-affixation): Replace mule--ucs-names-annotation to display chars in prefixes that implements two FIXME items. (read-char-by-name): Let-bind completion-tab-width to 4. Use affixation-function instead of annotation-function. * lisp/minibuffer.el (completion-tab-width): New variable. (completion--insert-strings): Align colwidth to tab positions when completion-tab-width is non-nil. * lisp/simple.el (completion-setup-function): Set tab-width to completion-tab-width when completion-tab-width is non-nil. https://lists.gnu.org/archive/html/emacs-devel/2020-11/msg01263.html --- lisp/international/mule-cmds.el | 15 +++++++-------- lisp/minibuffer.el | 13 ++++++++++--- lisp/simple.el | 2 ++ 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el index d361971a1fc..d59f2c0ebfc 100644 --- a/lisp/international/mule-cmds.el +++ b/lisp/international/mule-cmds.el @@ -3084,13 +3084,11 @@ on encoding." (puthash "BELL (BEL)" ?\a names) (setq ucs-names names)))) -(defun mule--ucs-names-annotation (name) - ;; FIXME: It would be much better to add this annotation before rather than - ;; after the char name, so the annotations are aligned. - ;; FIXME: The default behavior of displaying annotations in italics - ;; doesn't work well here. - (let ((char (gethash name ucs-names))) - (when char (format " (%c)" char)))) +(defun mule--ucs-names-affixation (names) + (mapcar (lambda (name) + (let ((char (gethash name ucs-names))) + (list name (concat (if char (format "%c" char) " ") "\t") ""))) + names)) (defun char-from-name (string &optional ignore-case) "Return a character as a number from its Unicode name STRING. @@ -3133,13 +3131,14 @@ octal). Treat otherwise-ambiguous strings like \"BED\" (U+1F6CF) as names, not numbers." (let* ((enable-recursive-minibuffers t) (completion-ignore-case t) + (completion-tab-width 4) (input (completing-read prompt (lambda (string pred action) (if (eq action 'metadata) '(metadata - (annotation-function . mule--ucs-names-annotation) + (affixation-function . mule--ucs-names-affixation) (category . unicode-name)) (complete-with-action action (ucs-names) string pred))))) (char diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 87bf3d36fa4..d44d8968221 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -1134,6 +1134,7 @@ completion candidates than this number." (defvar-local completion-all-sorted-completions nil) (defvar-local completion--all-sorted-completions-location nil) (defvar completion-cycling nil) ;Function that takes down the cycling map. +(defvar completion-tab-width nil) (defvar completion-fail-discreetly nil "If non-nil, stay quiet when there is no match.") @@ -1718,6 +1719,11 @@ It also eliminates runs of equal strings." (row 0) (first t) (laststring nil)) + (unless (or tab-stop-list (null completion-tab-width) + (zerop (mod colwidth completion-tab-width))) + ;; Align to tab positions for the case + ;; when the caller uses tabs inside prefix. + (setq colwidth (- colwidth (mod colwidth completion-tab-width)))) ;; The insertion should be "sensible" no matter what choices were made ;; for the parameters above. (dolist (str strings) @@ -1758,9 +1764,10 @@ It also eliminates runs of equal strings." ;; already past the goal column, there is still ;; a space displayed. (set-text-properties (1- (point)) (point) - ;; We can't just set tab-width, because - ;; completion-setup-function will kill - ;; all local variables :-( + ;; We can set tab-width using + ;; completion-tab-width, but + ;; the caller can prefer using + ;; \t to align prefixes. `(display (space :align-to ,column))) nil)))) (setq first nil) diff --git a/lisp/simple.el b/lisp/simple.el index 77888d07f1e..93fda7de8a1 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -8822,6 +8822,8 @@ Called from `temp-buffer-show-hook'." insert-fun)) (set (make-local-variable 'completion-reference-buffer) mainbuf) (if base-dir (setq default-directory base-dir)) + (when completion-tab-width + (setq tab-width completion-tab-width)) ;; Maybe insert help string. (when completion-show-help (goto-char (point-min)) -- 2.39.5