Subject: Re: bug#77546: Acknowledgement (Regression in defaults: Re: Enhance 'icomplete-vertical-mode' customization options.)

From: João Távora <[email-masked]>
Date: Sun, 06 Apr 2025 14:20:56 +0100

João Távora <[email-masked]> writes:

> That's ok. Thanks for confirming and testing. I'll push the patch later and close this.

I've pushed the patch with the fix and followed up with a simpler one
that simply renames internal functions to be shorter and in-line with
our convention for internal function names (it's icomplete--, not
icomplete-vertical-- since icomplete-vertical.el doesn't exist).

I've also noticed that you didn't update the hand-holding comments of
icomplete--render-vertical, and that there's a suspicious double call to
a new icomplete--ensure-visible-lines-inside-buffer function.  I'm
fairly sure this is only relevant for `icomplete--in-region-buffer' but
I think the code should look like this.  Can you try this patch after my
sig?

João

diff --git a/lisp/icomplete.el b/lisp/icomplete.el
index 35842b53e6b..481e7164889 100644
--- a/lisp/icomplete.el
+++ b/lisp/icomplete.el
@@ -914,16 +914,15 @@ icomplete--adjust-lines-for-column
                 lines))
     lines))
 
-(defun icomplete--ensure-visible-lines-inside-buffer ()
-  "Ensure the completion list is visible in regular buffers only.
-Scrolls the screen to be at least `icomplete-prospects-height' real lines
+(defun icomplete--ensure-vertical-completion-list-visible ()
+  "Ensure vertical completion list is visible.
+Scroll the screen to be at least `icomplete-prospects-height' real lines
 away from the bottom.  Counts wrapped lines as real lines."
-  (unless (minibufferp)
-    (let* ((window-height (window-body-height))
-           (current-line (count-screen-lines (window-start) (point)))
-           (lines-to-bottom (- window-height current-line)))
-      (when (< lines-to-bottom icomplete-prospects-height)
-        (scroll-up (- icomplete-prospects-height lines-to-bottom))))))
+  (let* ((window-height (window-body-height))
+         (current-line (count-screen-lines (window-start) (point)))
+         (lines-to-bottom (- window-height current-line)))
+    (when (< lines-to-bottom icomplete-prospects-height)
+      (scroll-up (- icomplete-prospects-height lines-to-bottom)))))
 
 (defun icomplete--add-indicator-to-selected (comp)
   "Add indicator to completion COMP according to its selection state."
@@ -943,7 +942,11 @@ icomplete--render-vertical
                  (truncate (max-mini-window-lines) 1)))))
   ;; Welcome to loopapalooza!
   ;;
-  ;; First, be mindful of `icomplete-scroll' and manual scrolls.  If
+  ;; First, take care of a special case for icomplete--in-region-buffer
+  (when icomplete--in-region-buffer
+    (icomplete--ensure-vertical-completion-list-visible))
+
+  ;; Then, be mindful of `icomplete-scroll' and manual scrolls.  If
   ;; `icomplete--scrolled-completions' and `icomplete--scrolled-past'
   ;; are:
   ;;
@@ -953,14 +956,9 @@ icomplete--render-vertical
   ;;   example);
   ;; - non-nil and nil, respectively, a refiltering took place and we
   ;;   may need to readjust them to the new filtered `comps'.
-  (when (and icomplete-scroll
-             (not icomplete--scrolled-completions)
-             (not icomplete--scrolled-past))
-    (icomplete--ensure-visible-lines-inside-buffer))
   (when (and icomplete-scroll
              icomplete--scrolled-completions
              (null icomplete--scrolled-past))
-    (icomplete--ensure-visible-lines-inside-buffer)
     (cl-loop with preds
              for (comp . rest) on comps
              when (equal comp (car icomplete--scrolled-completions))