From: Juri Linkov Date: Mon, 14 Dec 2020 08:44:04 +0000 (+0200) Subject: Don't show matches with no input for nil icomplete-show-matches-on-no-input X-Git-Tag: emacs-28.0.90~4729 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=dc6e616dfea1a740248b8f73b35851f7b167ec16;p=emacs.git Don't show matches with no input for nil icomplete-show-matches-on-no-input * lisp/icomplete.el (icomplete-show-matches-on-no-input): Fix docstring. (icomplete--initial-input): New internal variable. (icomplete-minibuffer-setup): Set buffer-local icomplete--initial-input to icomplete--field-string. (icomplete-ret, icomplete-force-complete-and-exit) (icomplete--sorted-completions, icomplete-exhibit): Compare icomplete--initial-input with icomplete--field-string to detect no input. (Bug#19031) etc/NEWS: Remove duplicate entry. --- diff --git a/etc/NEWS b/etc/NEWS index 909473f4e77..02edabfc27f 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1553,12 +1553,6 @@ both modes are on). This works like 'report-emacs-bug', but is more geared towards sending patches to the Emacs issue tracker. ---- -*** 'icomplete-show-matches-on-no-input' behavior change. -Previously, choosing a different completion with commands like 'C-.' -and then hitting 'RET' would choose the default completion. Doing -this will now choose the completion under point. - +++ *** The user can now customize how "default" values are prompted for. The new utility function 'format-prompt' has been added which uses the @@ -1609,7 +1603,9 @@ horizontally and vertically, respectively. *** Change in meaning of 'icomplete-show-matches-on-no-input'. Previously, choosing a different completion with commands like 'C-.' and then hitting 'RET' would choose the default completion. Doing this -will now choose the completion under point instead. +will now choose the completion under point instead. Also when this option +is nil, completions are not shown when the minibuffer reads a file name +with initial input as the default directory. --- *** The width of the buffer-name column in 'list-buffers' is now dynamic. diff --git a/lisp/icomplete.el b/lisp/icomplete.el index 0fdacd0a3c6..6627fd15f65 100644 --- a/lisp/icomplete.el +++ b/lisp/icomplete.el @@ -75,7 +75,9 @@ everything preceding the ~/ is discarded so the interactive selection process starts again from the user's $HOME.") (defcustom icomplete-show-matches-on-no-input nil - "When non-nil, show completions when the minibuffer is empty. + "When non-nil, show completions when first prompting for input. +This means to show completions even when the current minibuffer contents +is the same as was the initial input after minibuffer activation. This also means that if you traverse the list of completions with commands like `C-.' and just hit RET without typing any characters, the match under point will be chosen instead of the @@ -146,6 +148,10 @@ icompletion is occurring." (defvar icomplete-overlay (make-overlay (point-min) (point-min) nil t t) "Overlay used to display the list of completions.") +(defvar icomplete--initial-input nil + "Initial input in the minibuffer when icomplete-mode was activated. +Used to implement the option `icomplete-show-matches-on-no-input'.") + (defun icomplete-pre-command-hook () (let ((non-essential t)) (icomplete-tidy))) @@ -169,7 +175,7 @@ icompletion is occurring." (interactive) (if (and icomplete-show-matches-on-no-input (car completion-all-sorted-completions) - (eql (icomplete--field-end) (icomplete--field-beg))) + (equal (icomplete--field-string) icomplete--initial-input)) (icomplete-force-complete-and-exit) (minibuffer-complete-and-exit))) @@ -189,7 +195,7 @@ the default otherwise." (if (or ;; there's some input, meaning the default in off the table by ;; definition; OR - (> (icomplete--field-end) (icomplete--field-beg)) + (not (equal (icomplete--field-string) icomplete--initial-input)) ;; there's no input, but there's also no minibuffer default ;; (and the user really wants to see completions on no input, ;; meaning he expects a "force" to be at least attempted); OR @@ -441,6 +447,7 @@ Conditions are: "Run in minibuffer on activation to establish incremental completion. Usually run by inclusion in `minibuffer-setup-hook'." (when (and icomplete-mode (icomplete-simple-completing-p)) + (setq-local icomplete--initial-input (icomplete--field-string)) (setq-local completion-show-inline-help nil) (use-local-map (make-composed-keymap icomplete-minibuffer-map (current-local-map))) @@ -486,7 +493,7 @@ Usually run by inclusion in `minibuffer-setup-hook'." ;; `completing-read' invocations, described below: for fn in (cond ((and minibuffer-default (stringp minibuffer-default) ; bug#38992 - (= (icomplete--field-end) (icomplete--field-beg))) + (equal (icomplete--field-string) icomplete--initial-input)) ;; Here, we have a non-nil string default and ;; no input whatsoever. We want to make sure ;; that the default is bubbled to the top so @@ -579,7 +586,8 @@ See `icomplete-mode' and `minibuffer-setup-hook'." (goto-char (point-max)) ; Insert the match-status information: (when (and (or icomplete-show-matches-on-no-input - (> (icomplete--field-end) (icomplete--field-beg))) + (not (equal (icomplete--field-string) + icomplete--initial-input))) (or ;; Don't bother with delay after certain number of chars: (> (- (point) (icomplete--field-beg)) @@ -602,7 +610,7 @@ See `icomplete-mode' and `minibuffer-setup-hook'." (or (>= (- (point) (overlay-end rfn-eshadow-overlay)) 2) (eq ?/ (char-before (- (point) 2))))) (delete-region (overlay-start rfn-eshadow-overlay) - (overlay-end rfn-eshadow-overlay)) ) + (overlay-end rfn-eshadow-overlay))) (let* ((field-string (icomplete--field-string)) ;; Not sure why, but such requests seem to come ;; every once in a while. It's not fully