From 335a9bd2157300266614a9ef5e5f106a10b3218a Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Thu, 5 Mar 2020 01:52:58 +0200 Subject: [PATCH] minibuffer-force-complete-and-exit: Allow input with no matches * lisp/minibuffer.el (minibuffer--require-match): New variable. (completing-read-default): Bind it to the REQUIRE-MATCH value. (minibuffer-force-complete-and-exit): Consult it to allow input with no matches when a match is not required (bug#38992). * lisp/icomplete.el (icomplete-exhibit): Use it to render the correct parens around matches. --- lisp/icomplete.el | 2 +- lisp/minibuffer.el | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lisp/icomplete.el b/lisp/icomplete.el index a1a67e2330a..efe64d855a2 100644 --- a/lisp/icomplete.el +++ b/lisp/icomplete.el @@ -541,7 +541,7 @@ See `icomplete-mode' and `minibuffer-setup-hook'." (icomplete--completion-table) (icomplete--completion-predicate) (if (window-minibuffer-p) - (not minibuffer-completion-confirm))))) + (eq minibuffer--require-match t))))) (buffer-undo-list t) deactivate-mark) ;; Do nothing if while-no-input was aborted. diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 49daabc44e3..7f5b597542a 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -1400,7 +1400,11 @@ scroll the window of possible completions." (minibuffer-prompt-end) (point-max) #'exit-minibuffer ;; If the previous completion completed to an element which fails ;; test-completion, then we shouldn't exit, but that should be rare. - (lambda () (minibuffer-message "Incomplete")))) + (lambda () + (if minibuffer--require-match + (minibuffer-message "Incomplete") + ;; If a match is not required, exit after all. + (exit-minibuffer))))) (defun minibuffer-force-complete (&optional start end dont-cycle) "Complete the minibuffer to an exact match. @@ -1464,6 +1468,9 @@ DONT-CYCLE tells the function not to setup cycling." "List of commands which cause an immediately following `minibuffer-complete-and-exit' to ask for extra confirmation.") +(defvar minibuffer--require-match nil + "Value of REQUIRE-MATCH passed to `completing-read'.") + (defun minibuffer-complete-and-exit () "Exit if the minibuffer contains a valid completion. Otherwise, try to complete the minibuffer contents. If @@ -3748,8 +3755,10 @@ See `completing-read' for the meaning of the arguments." (let* ((minibuffer-completion-table collection) (minibuffer-completion-predicate predicate) + ;; FIXME: Remove/rename this var, see the next one. (minibuffer-completion-confirm (unless (eq require-match t) require-match)) + (minibuffer--require-match require-match) (base-keymap (if require-match minibuffer-local-must-match-map minibuffer-local-completion-map)) -- 2.39.2