emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/consult abc404d 2/4: Add preview debouncing (Fix #333)


From: ELPA Syncer
Subject: [elpa] externals/consult abc404d 2/4: Add preview debouncing (Fix #333)
Date: Sat, 12 Jun 2021 14:57:09 -0400 (EDT)

branch: externals/consult
commit abc404d13e8f246a65ecd3e082828a226a440a04
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@daniel-mendler.de>

    Add preview debouncing (Fix #333)
---
 consult.el | 63 +++++++++++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 48 insertions(+), 15 deletions(-)

diff --git a/consult.el b/consult.el
index e5f2320..9080307 100644
--- a/consult.el
+++ b/consult.el
@@ -1049,20 +1049,37 @@ FACE is the cursor face."
          (when (and cand restore)
            (,(intern (format "consult--%s-action" type)) cand))))))
 
+(defun consult--preview-key-normalize (preview-key)
+  "Normalize PREVIEW-KEY, return alist of keys and debounce times."
+  (let ((keys)
+        (debounce 0))
+    (unless (listp preview-key)
+      (setq preview-key (list preview-key)))
+    (while preview-key
+      (if (eq (car preview-key) :debounce)
+          (setq debounce (cadr preview-key)
+                preview-key (cddr preview-key))
+        (push (cons (car preview-key) debounce) keys)
+        (pop preview-key)))
+    keys))
+
 (defun consult--preview-key-pressed-p (preview-key cand)
   "Return t if PREVIEW-KEY has been pressed given the current candidate CAND."
   (when (and (consp preview-key) (memq :keys preview-key))
     (setq preview-key (funcall (plist-get preview-key :predicate) cand)))
-  (setq preview-key (if (listp preview-key) preview-key (list preview-key)))
-  (or (memq 'any preview-key)
-      (let ((keys (this-single-command-keys)))
-        (seq-find (lambda (x) (equal (vconcat x) keys)) preview-key))))
+  (setq preview-key (consult--preview-key-normalize preview-key))
+  (let ((keys (this-single-command-keys)))
+    (cdr (or (seq-find (lambda (x)
+                         (and (not (eq (car x) 'any))
+                              (equal (vconcat (car x)) keys)))
+                       preview-key)
+             (assq 'any preview-key)))))
 
 (defun consult--with-preview-1 (preview-key state transform candidate fun)
   "Add preview support for FUN.
 
 See `consult--with-preview' for the arguments PREVIEW-KEY, STATE, TRANSFORM 
and CANDIDATE."
-  (let ((input "") (selected))
+  (let ((input "") (selected) (timer))
     (consult--minibuffer-with-setup-hook
         (if (and state preview-key)
             (lambda ()
@@ -1071,14 +1088,28 @@ See `consult--with-preview' for the arguments 
PREVIEW-KEY, STATE, TRANSFORM and
                       (lambda ()
                         (when-let (cand (funcall candidate))
                           (with-selected-window (active-minibuffer-window)
-                            (let ((input (minibuffer-contents-no-properties))
-                                  (new-preview (cons input cand)))
-                              (unless (equal last-preview new-preview)
-                                (with-selected-window (or 
(minibuffer-selected-window) (next-window))
-                                  (let ((transformed (funcall transform input 
cand)))
-                                    (when (consult--preview-key-pressed-p 
preview-key transformed)
-                                      (funcall state transformed nil)
-                                      (setq last-preview new-preview)))))))))))
+                            (let ((input (minibuffer-contents-no-properties)))
+                              (with-selected-window (or 
(minibuffer-selected-window) (next-window))
+                                (let ((transformed (funcall transform input 
cand))
+                                      (new-preview (cons input cand)))
+                                  (when-let (debounce 
(consult--preview-key-pressed-p preview-key transformed))
+                                    (when timer
+                                      (cancel-timer timer)
+                                      (setq timer nil))
+                                    (unless (equal last-preview new-preview)
+                                      (if (> debounce 0)
+                                          (let ((win (selected-window)))
+                                            (setq timer
+                                                  (run-at-time
+                                                   debounce
+                                                   nil
+                                                   (lambda ()
+                                                     (when (window-live-p win)
+                                                       (with-selected-window 
win
+                                                         (funcall state 
transformed nil)
+                                                         (setq last-preview 
new-preview)))))))
+                                        (funcall state transformed nil)
+                                        (setq last-preview 
new-preview))))))))))))
               (let ((post-command-sym (make-symbol 
"consult--preview-post-command")))
                 (fset post-command-sym (lambda ()
                                          (setq input 
(minibuffer-contents-no-properties))
@@ -1092,6 +1123,8 @@ See `consult--with-preview' for the arguments 
PREVIEW-KEY, STATE, TRANSFORM and
           (cons (setq selected (when-let (result (funcall fun))
                                  (funcall transform input result)))
                 input)
+        (when timer
+          (cancel-timer timer))
         ;; If there is a state function, always call restore!
         ;; The preview function should be seen as a stateful object,
         ;; and we call the destructor here.
@@ -1619,7 +1652,7 @@ ASYNC must be non-nil for async completion functions."
 KEYMAP is a command-specific keymap.
 ASYNC must be non-nil for async completion functions.
 NARROW are the narrow settings.
-PREVIEW-KEY is the preview key."
+PREVIEW-KEY are the preview keys."
   (let ((old-map (current-local-map))
         (map (make-sparse-keymap)))
 
@@ -1637,7 +1670,7 @@ PREVIEW-KEY is the preview key."
     ;; Preview trigger keys
     (when (and (consp preview-key) (memq :keys preview-key))
       (setq preview-key (plist-get preview-key :keys)))
-    (setq preview-key (if (listp preview-key) preview-key (list preview-key)))
+    (setq preview-key (mapcar #'car (consult--preview-key-normalize 
preview-key)))
     (when preview-key
       (dolist (key preview-key)
         (unless (or (eq key 'any) (lookup-key old-map key))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]