branch: externals/consult
commit 7be0d6bf556b608b0b38d006a4f66be849d721e0
Author: Daniel Mendler <[email protected]>
Commit: Daniel Mendler <[email protected]>

    Support completion-eager-update and completion-eager-display
---
 README.org | 23 +++++++++++++++++++++++
 consult.el | 47 +++++++++++++++++++++++++++++------------------
 2 files changed, 52 insertions(+), 18 deletions(-)

diff --git a/README.org b/README.org
index f18c635e8e..19646daa56 100644
--- a/README.org
+++ b/README.org
@@ -1028,6 +1028,29 @@ following techniques:
 4. Create advices to modify some internal behavior.
 5. Write or propose a patch.
 
+** Default completion UI with auto update
+
+I recommend to use Vertico for best performance and an intuitive UI.
+Nevertheless the default completions buffer UI works decently and supports
+automatic update in newer Emacs versions. I suggest the following configuration
+on Emacs 31:
+
+#+begin_src emacs-lisp
+(setq
+ ;; One column view with annotations
+ completions-format 'one-column
+ completions-detailed t
+ completions-group t
+ ;; Allow navigating from the minibuffer
+ minibuffer-visible-completions t
+ ;; Show completions eagerly and update automatically
+ completion-eager-update t
+ completion-eager-display t
+ ;; Disable noise (inline help also blocks input)
+ completion-show-help nil
+ completion-show-inline-help nil)
+#+end_src
+
 * Recommended packages
 :properties:
 :description: Related packages recommended for installation
diff --git a/consult.el b/consult.el
index a3e35a13e4..acfcdb05c4 100644
--- a/consult.el
+++ b/consult.el
@@ -539,14 +539,15 @@ as the public API.")
   "Buffer display function.")
 
 (defvar consult--completion-candidate-hook
-  (list #'consult--default-completion-minibuffer-candidate
-        #'consult--default-completion-list-candidate)
+  (list #'consult--default-completion-list-candidate
+        #'consult--default-completion-minibuffer-candidate)
   "Get candidate from completion system.")
 
 ;; Redisplay such that the updated completion UI will be displayed, even when
 ;; the update happened due to `accept-process-output' inside a loop of a 
dynamic
 ;; collection. See `consult--async-dynamic'.
-(defvar consult--completion-refresh-hook '(redisplay)
+(defvar consult--completion-refresh-hook
+  (list #'redisplay #'consult--default-completion-list-refresh)
   "Refresh completion system.")
 
 (defvar-local consult--preview-function nil
@@ -5601,8 +5602,7 @@ automatically previewed."
 
 (defun consult--default-completion-minibuffer-candidate ()
   "Return current minibuffer candidate from default completion system or 
Icomplete."
-  (when (and (minibufferp)
-             (eq completing-read-function #'completing-read-default))
+  (when (minibufferp)
     (let ((content (minibuffer-contents-no-properties)))
       ;; When the current minibuffer content matches a candidate, return it!
       (if (test-completion content
@@ -5617,17 +5617,28 @@ automatically previewed."
 
 (defun consult--default-completion-list-candidate ()
   "Return current candidate at point from completions buffer."
-  ;; See feature request bug#74408 for `completion-list-candidate-at-point'.
-  (let (beg)
-    (when (and
-           (derived-mode-p 'completion-list-mode)
-           (cond
-            ((and (not (eobp)) (get-text-property (point) 'completion--string))
-             (setq beg (1+ (point))))
-            ((and (not (bobp)) (get-text-property (1- (point)) 
'completion--string))
-             (setq beg (point)))))
-      (get-text-property (previous-single-property-change beg 
'completion--string)
-                         'completion--string))))
+  (when-let ((window (get-buffer-window "*Completions*" 'visible))
+             (buffer (window-buffer window))
+             ((eq (buffer-local-value 'completion-reference-buffer buffer)
+                  (window-buffer (active-minibuffer-window)))))
+    (with-current-buffer buffer
+      ;; TODO Use `completion-list-candidate-at-point' on Emacs 31
+      (let (beg)
+        (when (cond
+               ((and (not (eobp)) (get-text-property (point) 
'completion--string))
+                (setq beg (1+ (point))))
+               ((and (not (bobp)) (get-text-property (1- (point)) 
'completion--string))
+                (setq beg (point))))
+          (get-text-property (previous-single-property-change beg 
'completion--string)
+                             'completion--string))))))
+
+(defun consult--default-completion-list-refresh ()
+  "Refresh default completion UI."
+  (when (and (bound-and-true-p completion-eager-update)
+             (bound-and-true-p completion-eager-display)
+             (not (bound-and-true-p vertico-mode))
+             (not (bound-and-true-p icomplete-mode)))
+    (minibuffer-completion-help)))
 
 ;;;;; Integration: Vertico
 
@@ -5652,8 +5663,8 @@ automatically previewed."
 
 ;;;;; Integration: Mct
 
-(with-eval-after-load 'mct (add-hook 'consult--completion-refresh-hook
-                                     'mct--live-completions-refresh))
+(with-eval-after-load 'mct
+  (add-hook 'consult--completion-refresh-hook 'mct--live-completions-refresh))
 
 ;;;;; Integration: Icomplete
 

Reply via email to