From fb9a2b45b97712dba1f622f6dff7a84696b0f71d Mon Sep 17 00:00:00 2001 From: Gregory Heytings Date: Mon, 5 Apr 2021 21:30:26 +0000 Subject: [PATCH] Add an icomplete-vertical minor mode * lisp/icomplete.el (icomplete-vertical-mode): New minor mode. (icomplete-vertical-reformat-completions, icomplete-vertical-minibuffer-setup): Auxiliary functions for the new minor mode. * etc/NEWS: Mention the new minor mode. * doc/emacs/buffers.texi: Document the new minor mode. --- doc/emacs/buffers.texi | 5 ++++- etc/NEWS | 7 +++++++ lisp/icomplete.el | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/doc/emacs/buffers.texi b/doc/emacs/buffers.texi index 3a166e404a..5561a704ca 100644 --- a/doc/emacs/buffers.texi +++ b/doc/emacs/buffers.texi @@ -740,7 +740,10 @@ Icomplete To enable Icomplete mode, type @kbd{M-x icomplete-mode}, or customize the variable @code{icomplete-mode} to @code{t} (@pxref{Easy -Customization}). +Customization}). This will display the list of possible completions +on the same line as the prompt. To display the completion candidates +vertically under the prompt instead, type @kbd{M-x icomplete-vertical-mode}, +or customize the variable @code{icomplete-vertical-mode} to @code{t}. @findex fido-mode @cindex fido mode diff --git a/etc/NEWS b/etc/NEWS index c8400ba8c2..cbce41d29d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -477,6 +477,13 @@ documented. SMIE is now always enabled and 'ruby-use-smie' only controls whether indentation is done using SMIE or with the old ad-hoc code. +** Icomplete + ++++ +*** New minor mode Icomplete-Vertical mode. +This mode is based on and identical to Icomplete, except that it displays +the list of completions candidates vertically. + --- ** Specific warnings can now be disabled from the warning buffer. When a warning is displayed to the user, the resulting buffer now has diff --git a/lisp/icomplete.el b/lisp/icomplete.el index da589c0064..87b3431079 100644 --- a/lisp/icomplete.el +++ b/lisp/icomplete.el @@ -562,6 +562,46 @@ icomplete--sorted-completions (completion--cache-all-sorted-completions beg end (cons comp all)))) finally return all))) +(defun icomplete-vertical-reformat-completions (completions) + "Reformat the completion candidates returned by `icomplete-completions'." + (save-match-data + (if (string-match "^\\((.*)\\|\\[.*\\]\\)?{\\(\\(?:.\\|\n\\)+\\)}" + completions) + (format "%s \n%s" + (or (match-string 1 completions) "") + (match-string 2 completions)) + completions))) + +(defun icomplete-vertical-minibuffer-setup () + "Setup the minibuffer for vertical display of completion candidates." + (setq-local redisplay-adhoc-scroll-in-resize-mini-windows nil)) + +;;;###autoload +(define-minor-mode icomplete-vertical-mode + "Toggle incremental minibuffer completion with vertical display. + +This global minor mode is identical to `icomplete-mode' (which see), +except that it displays the list of completions candidates vertically. + +As many completion candidates as possible are displayed, depending on +the value of `max-mini-window-height'." + :global t :group 'icomplete + (remove-hook 'icomplete-minibuffer-setup-hook + #'icomplete-vertical-minibuffer-setup) + (advice-remove 'icomplete-completions + #'icomplete-vertical-reformat-completions) + (icomplete-mode -1) + (when icomplete-vertical-mode + (icomplete-mode 1) + (setq icomplete-separator "\n") + (setq icomplete-hide-common-prefix nil) + ;; ask `icomplete-completions' to return enough completions candidates + (setq icomplete-prospects-height 25) + (add-hook 'icomplete-minibuffer-setup-hook + #'icomplete-vertical-minibuffer-setup) + (advice-add 'icomplete-completions + :filter-return #'icomplete-vertical-reformat-completions))) + -- 2.30.2