branch: externals/ivy
commit 2c64b2994e1dd778a625f58be711b5cc0ac31435
Author: Basil L. Contovounesios <[email protected]>
Commit: Basil L. Contovounesios <[email protected]>

    Fix minibuffer hooks
    
    The function ivy--cleanup runs after exiting (and outside of) the
    minibuffer.  Instead of removing Ivy minibuffer-local hooks from
    their default values in ivy--cleanup, do so locally in the
    appropriate minibuffer-exit-hook.
    
    * ivy.el (ivy--cleanup): Remove temporary ESS workaround which is no
    longer needed (#1660, emacs-ess/ESS#609).  Stop removing Ivy
    minibuffer-local hooks from default post-command-hook and
    window-size-change-functions.
    (ivy--minibuffer-exit): New function that removes these hooks
    minibuffer-locally instead.
    (ivy--minibuffer-setup): Add it to current minibuffer-exit-hook.
    (ivy--completing-p): New function, extracted...
    (ivy--exhibit): ...from here.
    (ivy--window-size-changed): Use it instead of ivy-mode for
    determining whether Ivy is completing something, since it's possible
    to use Ivy-based completion with ivy-mode off.
---
 ivy.el | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/ivy.el b/ivy.el
index b790306887..63d90a57bb 100644
--- a/ivy.el
+++ b/ivy.el
@@ -2291,10 +2291,6 @@ customizations apply to the current completion session."
                 hist (propertize item 'ivy-index ivy--index))))))))
 
 (defun ivy--cleanup ()
-  ;; Fixes a bug in ESS, #1660
-  (put 'post-command-hook 'permanent-local nil)
-  (remove-hook 'post-command-hook #'ivy--queue-exhibit)
-  (remove-hook 'window-size-change-functions #'ivy--window-size-changed)
   (let ((cleanup (ivy--display-function-prop :cleanup))
         (unwind (ivy-state-unwind ivy-last)))
     (when (functionp cleanup)
@@ -3115,7 +3111,7 @@ tries to ensure that it does not change depending on the 
number of candidates."
   :type 'boolean)
 
 (defun ivy--minibuffer-setup ()
-  "Setup ivy completion in the minibuffer."
+  "Set up Ivy completion in `minibuffer-setup-hook'."
   ;; Guard for --without-x builds where `mwheel' is not preloaded.
   (when (boundp 'mwheel-scroll-up-function)
     (setq-local mwheel-scroll-up-function 'ivy-next-line))
@@ -3136,12 +3132,19 @@ tries to ensure that it does not change depending on 
the number of candidates."
                       (ivy-add-newline-after-prompt 2))))
     (when height
       (set-window-text-height nil height)))
+  (add-hook 'minibuffer-exit-hook #'ivy--minibuffer-exit nil t)
   (add-hook 'post-command-hook #'ivy--queue-exhibit nil t)
   (add-hook 'window-size-change-functions #'ivy--window-size-changed nil t)
   (let ((hook (ivy-alist-setting ivy-hooks-alist)))
     (when (functionp hook)
       (funcall hook))))
 
+(defun ivy--minibuffer-exit ()
+  "Clean up Ivy completion in `minibuffer-exit-hook'."
+  (remove-hook 'minibuffer-exit-hook #'ivy--minibuffer-exit t)
+  (remove-hook 'post-command-hook #'ivy--queue-exhibit t)
+  (remove-hook 'window-size-change-functions #'ivy--window-size-changed t))
+
 (defun ivy--input ()
   "Return the current minibuffer input."
   ;; assume one-line minibuffer input
@@ -3478,10 +3481,14 @@ The function was added in Emacs 26.1.")
    (ivy--format
     (setq ivy--all-candidates cands))))
 
+(defun ivy--completing-p ()
+  "Return non-nil if Ivy is completing in the current buffer."
+  (memq #'ivy--queue-exhibit post-command-hook))
+
 (defun ivy--exhibit ()
   "Insert Ivy completions display.
 Should be run in the minibuffer."
-  (when (memq #'ivy--queue-exhibit post-command-hook)
+  (when (ivy--completing-p)
     (let ((inhibit-field-text-motion nil))
       (constrain-to-field nil (point-max)))
     (ivy-set-text (ivy--input))
@@ -3628,7 +3635,7 @@ height < `ivy-height', auto-shrink the minibuffer."
 
 (defun ivy--window-size-changed (&rest _)
   "Resize ivy window to fit with current frame's size."
-  (when ivy-mode
+  (when (ivy--completing-p)
     (ivy--resize-minibuffer-to-fit)))
 
 (defun ivy--add-face (str face)

Reply via email to