From 1b8d369c381b5a63e40529d0d95dfa75d94b8e09 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Fri, 14 Aug 2020 13:29:52 +0200 Subject: [PATCH] Change icomplete-show-matches-on-no-input behavior * lisp/icomplete.el (icomplete-show-matches-on-no-input): Doc fix. (icomplete-completions): Set completion-content-when-empty. * lisp/minibuffer.el (completion-content-when-empty): New variable. (completion--complete-and-exit): Use it (bug#19032). Based on a patch by Matthew Leach . --- etc/NEWS | 6 ++++++ lisp/icomplete.el | 11 +++++++++-- lisp/minibuffer.el | 10 ++++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 5dcaefeefe2..91add027e4c 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -785,6 +785,12 @@ digits. ** Miscellaneous +--- +*** 'icomplete-show-matches-on-no-input' behavior change +Previously, choosing a different completion with commands like 'C-.' +and then hitting enter would choose the default completion. Doung +this will now choose the completion under point. + --- *** New user option 'term-scroll-snap-to-bottom'. By default, 'term' and 'ansi-term' will now recenter the buffer so diff --git a/lisp/icomplete.el b/lisp/icomplete.el index 3747ae3d281..8a68df876c1 100644 --- a/lisp/icomplete.el +++ b/lisp/icomplete.el @@ -75,7 +75,11 @@ 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 first prompting for input." + "When non-nil, show completions when first prompting for input. +This also means that if you traverse the list of completions with +commands like `C-.' and just hit `C-j' (enter) without typing any +characters, the match under point will be chosen instead of the +default." :type 'boolean :version "24.4") @@ -709,7 +713,10 @@ matches exist." (push comp prospects) (setq limit t)))) (setq prospects (nreverse prospects)) - ;; Decorate first of the prospects. + ;; Return the first match if the user hits enter. + (when icomplete-show-matches-on-no-input + (setq completion-content-when-empty (car prospects))) + ;; Decorate first of the prospects. (when prospects (let ((first (copy-sequence (pop prospects)))) (put-text-property 0 (length first) diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 0d99f4687c0..641a2e53152 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -1119,6 +1119,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-content-when-empty nil) (defvar completion-fail-discreetly nil "If non-nil, stay quiet when there is no match.") @@ -1503,8 +1504,13 @@ If `minibuffer-completion-confirm' is `confirm-after-completion', COMPLETION-FUNCTION is called if the current buffer's content does not appear to be a match." (cond - ;; Allow user to specify null string - ((= beg end) (funcall exit-function)) + ;; Allow user to specify null string. In the case that + ;; `completion-content-when-empty' is set, use that instead. + ((= beg end) + (when completion-content-when-empty + (completion--replace beg end completion-content-when-empty)) + (funcall exit-function)) + ((test-completion (buffer-substring beg end) minibuffer-completion-table minibuffer-completion-predicate) -- 2.39.5