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

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

[elpa] externals/embark a7805f2491 6/7: Add embark-live back


From: ELPA Syncer
Subject: [elpa] externals/embark a7805f2491 6/7: Add embark-live back
Date: Sun, 20 Mar 2022 22:57:33 -0400 (EDT)

branch: externals/embark
commit a7805f24917cd00d6e3a07792851b6ff07621a67
Author: Omar Antolín <omar.antolin@gmail.com>
Commit: Omar Antolín <omar.antolin@gmail.com>

    Add embark-live back
    
    This implementation is significantly simpler than before.
---
 embark.el | 78 +++++++++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 58 insertions(+), 20 deletions(-)

diff --git a/embark.el b/embark.el
index 21bfe3c51c..5eef1be5fa 100644
--- a/embark.el
+++ b/embark.el
@@ -2866,16 +2866,13 @@ Refresh the buffer afterwards."
     (with-current-buffer buffer
       (setq embark--type type embark-collect--candidates candidates))))
 
-;;;###autoload
-(defun embark-collect ()
-  "Create an Embark Collect buffer.
+(defun embark--collect (buffer-name)
+  "Create an Embark Collect buffer named BUFFER-NAME.
 
-To control the display, add an entry to `display-buffer-alist'
-with key \"Embark Collect\"."
+The function `generate-new-buffer-name' is used to ensure the
+buffer has a unique name."
   (interactive)
-  (let ((from (current-buffer))
-        (buffer (generate-new-buffer "*Embark Collect*")))
-
+  (let ((buffer (generate-new-buffer buffer-name)))
     (with-current-buffer buffer
       ;; we'll run the mode hooks once the buffer is displayed, so
       ;; the hooks can make use of the window
@@ -2899,20 +2896,61 @@ with key \"Embark Collect\"."
         (run-mode-hooks)
         (revert-buffer))
       (set-window-dedicated-p window t)
-      (when (minibufferp from)
-        ;; A function added to `minibuffer-exit-hook' locally isn't called if
-        ;; we `abort-recursive-edit' from outside the minibuffer, that is why
-        ;; we use `change-major-mode-hook', which is also run on minibuffer
-        ;; exit.
-        (add-hook
-         'change-major-mode-hook
-         (lambda ()
-              (when (buffer-live-p buffer)
-                (embark--run-after-command #'pop-to-buffer buffer)))
-         nil t))
-      (embark--quit-and-run #'message nil)
       buffer)))
 
+;;;###autoload
+(defun embark-collect ()
+  "Create an Embark Collect buffer.
+
+To control the display, add an entry to `display-buffer-alist'
+with key \"Embark Collect\"."
+  (interactive)
+  (let ((buffer (embark--collect
+                 (format "*Embark Collect: %s*"
+                         (if (minibufferp)
+                             (format "M-x %s RET %s" embark--command
+                                     (minibuffer-contents-no-properties))
+                           (buffer-name))))))
+    (when (minibufferp)
+      (embark--run-after-command #'pop-to-buffer buffer)
+      (embark--quit-and-run #'message nil))))
+
+;;;###autoload
+(defun embark-live ()
+  "Create a live-updating Embark Collect buffer.
+
+To control the display, add an entry to `display-buffer-alist'
+with key \"Embark Live\"."
+  (interactive)
+  (let ((live-buffer (embark--collect
+                      (format "*Embark Live: %s*"
+                              (if (minibufferp)
+                                  (format "M-x %s" embark--command)
+                                (buffer-name)))))
+        (run-collect (make-symbol "run-collect"))
+        (stop-collect (make-symbol "stop-collect"))
+        timer)
+    (setf (symbol-function stop-collect)
+          (lambda ()
+            (remove-hook 'change-major-mode-hook stop-collect t)
+            (remove-hook 'after-change-functions run-collect t)))
+    (setf (symbol-function run-collect)
+          (lambda (_1 _2 _3)
+            (unless timer
+              (setq timer
+                    (run-with-idle-timer
+                     0.05 nil
+                     (lambda ()
+                       (if (not (buffer-live-p live-buffer))
+                           (funcall stop-collect)
+                         (embark-collect--update-candidates live-buffer)
+                         (with-current-buffer live-buffer
+                           (save-excursion (revert-buffer)))
+                         (setq timer nil))))))))
+    (add-hook 'after-change-functions run-collect nil t)
+    (when (minibufferp)
+      (add-hook 'change-major-mode-hook stop-collect nil t))))
+
 ;;;###autoload
 (defun embark-export ()
   "Create a type-specific buffer to manage current candidates.



reply via email to

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