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