I'm late to the party here, but I'd just like to add that Gregory's solution based on advice can easily be be integrated into icomplete-mode directly. I do like that it's such a simple solution, doesn't include new defcustoms, modes and such. I didn't have a in-depth look, but it looks like your solution Ergus, is quite a bit more complex. Why? What extras does it bring to the table? And are we sure we need those extras in the first version of this? Or am I missing something and is Gregory's solution fundamentally unusable? My 2c, João On Sat, Sep 12, 2020 at 2:33 PM Ergus wrote: > On Sat, Sep 12, 2020 at 01:10:57PM +0000, Gregory Heytings wrote: > > > >> > >>>If there was a built-in vertical mode it would be better / more > >>>intuitive. > >> > >>Could you try the branch feature/icomplete-vertical? I need some > >>testers before adding it to master. > >> > > > >Alas no, I have been using the following to have icomplete-vertical > >for quite some time, it works perfectly well, so I don't see why a > >more complex implementation would be necessary. > > > >(setq icomplete-prospects-height 6) > >(setq icomplete-separator "\n") > >(defun icomplete-vertical-minibuffer-setup () > > (setq truncate-lines t) > > (setq-local completion-ignore-case t) > > (setq-local read-file-name-completion-ignore-case t) > > (setq-local read-buffer-completion-ignore-case t) > > (setq icomplete-hide-common-prefix nil)) > >(add-hook 'icomplete-minibuffer-setup-hook > #'icomplete-vertical-minibuffer-setup) > >(defun icomplete-vertical-reformat-completions (completions) > > (save-match-data > > (let ((cnp (substring-no-properties completions))) > > (if (string-match "^\\((.*)\\|\\[.+\\]\\)?{\\(\\(?:.\\|\n\\)+\\)}" > cnp) > > (format "%s \n%s" > > (or (match-string 1 cnp) "") > > (replace-regexp-in-string "^" (make-string > (current-column) ? ) (match-string 2 cnp))) > > cnp)))) > >(defun icomplete-vertical-adjust-minibuffer-height (completions) > > (let* ((comp (icomplete-vertical-reformat-completions completions)) > > (complen (length (split-string comp "\n")))) > > (if (> complen 1) (enlarge-window (- icomplete-prospects-height (1- > (window-height))))) > > comp)) > >(advice-add 'icomplete-completions :filter-return > #'icomplete-vertical-adjust-minibuffer-height) > > 1) Internal functionalities try not to use advises. > 2) The branch is not actually more complex, it just generates the > formatted vertical output form the beginning. > 3) It does more or less the same you are doing but with a simpler > config: > > (icomplete-mode t) > (icomplete-format 'vertical) > > 4) We add arrow bindings to move > 5) Add completion matching faces is also coming. > > -- João Távora