branch: externals/ivy
commit acb20ad74f00cb3aa339ff6c4d30ecfef342018b
Merge: d63d52f140 fd8df3b733
Author: Basil L. Contovounesios <ba...@contovou.net>
Commit: Basil L. Contovounesios <ba...@contovou.net>

    Merge branch 'master' into externals/ivy
---
 ivy.el | 36 ++++++++++++++++++++----------------
 1 file changed, 20 insertions(+), 16 deletions(-)

diff --git a/ivy.el b/ivy.el
index 063c9eee59..cddd64aef8 100644
--- a/ivy.el
+++ b/ivy.el
@@ -3409,25 +3409,29 @@ Otherwise, ~/ will move home."
   :type 'boolean)
 
 (defcustom ivy-dynamic-exhibit-delay-ms 0
-  "Delay in ms before dynamic collections are refreshed"
+  "Delay in milliseconds before dynamic collections are refreshed."
   :type 'integer)
 
-(defvar ivy--exhibit-timer nil)
+(defvar ivy--exhibit-timer nil
+  "Timer for debouncing calls to `ivy--exhibit'.")
+
+(defvar ivy--queue-last-input nil
+  "Value of `ivy--input' from last `post-command-hook'.")
 
 (defun ivy--queue-exhibit ()
-  "Insert Ivy completions display, possibly after a timeout for
-dynamic collections.
+  "Refresh Ivy completions display, with debouncing.
+This is like `ivy--exhibit', but dynamic collections are delayed by
+`ivy-dynamic-exhibit-delay-ms' to avoid issues with rapid refreshes.
 Should be run via minibuffer `post-command-hook'."
-  (if (and (> ivy-dynamic-exhibit-delay-ms 0)
-           (ivy-state-dynamic-collection ivy-last))
-      (progn
-        (when ivy--exhibit-timer (cancel-timer ivy--exhibit-timer))
-        (setq ivy--exhibit-timer
-              (run-with-timer
-               (/ ivy-dynamic-exhibit-delay-ms 1000.0)
-               nil
-               'ivy--exhibit)))
-    (ivy--exhibit)))
+  (if (or (<= ivy-dynamic-exhibit-delay-ms 0)
+          (not (ivy-state-dynamic-collection ivy-last))
+          (equal ivy--queue-last-input
+                 (setq ivy--queue-last-input (ivy--input))))
+      (ivy--exhibit)
+    (when ivy--exhibit-timer (cancel-timer ivy--exhibit-timer))
+    (setq ivy--exhibit-timer
+          (run-with-timer (/ ivy-dynamic-exhibit-delay-ms 1000.0)
+                          nil #'ivy--exhibit))))
 
 (defalias 'ivy--file-local-name
   (if (fboundp 'file-local-name)
@@ -3455,8 +3459,8 @@ The function was added in Emacs 26.1.")
 
 (defun ivy--exhibit ()
   "Insert Ivy completions display.
-Should be run via minibuffer `post-command-hook'."
-  (when (memq 'ivy--queue-exhibit post-command-hook)
+Should be run in the minibuffer."
+  (when (memq #'ivy--queue-exhibit post-command-hook)
     (let ((inhibit-field-text-motion nil))
       (constrain-to-field nil (point-max)))
     (ivy-set-text (ivy--input))

Reply via email to