From 2a16bbd8db063ec2272a057262891328a267b129 Mon Sep 17 00:00:00 2001
From: Case Duckworth
Date: Tue, 8 Feb 2022 14:15:43 -0600
Subject: Change logic in +elfeed

---
 lisp/+elfeed.el | 133 +++++++++++++++++++++++++++++---------------------------
 1 file changed, 69 insertions(+), 64 deletions(-)

diff --git a/lisp/+elfeed.el b/lisp/+elfeed.el
index f669afd..8a0376d 100644
--- a/lisp/+elfeed.el
+++ b/lisp/+elfeed.el
@@ -40,69 +40,70 @@
 
 (defun +elfeed-update-command ()
   (interactive)
-  (let ((script (expand-file-name "~/.local/bin/elfeed-update.el"))
-        (update-message-format "[Elfeed] Background update: %s"))
-    (message update-message-format "start")
-    (setq +elfeed--update-running t)
-    (elfeed-db-save)
-    (advice-add 'elfeed :override #'+elfeed--update-message)
-    (ignore-errors (kill-buffer "*elfeed-search*"))
-    (ignore-errors (kill-buffer "*elfeed-log*"))
-    (elfeed-db-unload)
-    (unless (file-exists-p script)
-      (make-directory (file-name-directory script) :parents)
-      (with-temp-buffer
-        (insert
-         (nconcat nil
-           "#!/usr/bin/env -S emacs --script"
-           "(setq lexical-binding t)"
-           ;; I have to load the necessary files
-           "(load (locate-user-emacs-file \"early-init\"))"
-           "(straight-use-package 'elfeed)"
-           "(straight-use-package 'elfeed-org)"
-           "(require 'elfeed)"
-           "(require 'elfeed-org)"
-           ;; And set needed variables
-           (let ((copy-environment))
-             (dolist (var '(rmh-elfeed-org-files
-                            elfeed-db-directory
-                            elfeed-curl-program-name
-                            elfeed-use-curl
-                            elfeed-curl-extra-arguments
-                            elfeed-enclosure-default-dir))
-               (push (concat "(setq " (symbol-name var)
-                             " '" (prin1-to-string (symbol-value var)) ")\n")
-                     copy-environment))
-             (nreverse copy-environment))
-           ;; Overwrite log function to go to stdout
-           "(defun elfeed-log (level fmt &rest objects)"
-           "  (princ (format \"[%s] [%s]: %s\\n\""
-           "                 (format-time-string \"%F %T\")"
-           "                 level"
-           "                 (apply #'format fmt objects))))"
-           ;; Load elfeed
-           "(elfeed-org)"
-           "(elfeed-db-load)"
-           "(elfeed)"
-           ;; Update elfeed
-           "(elfeed-update)"
-           ;; Wait to finish ... I think.
-           "(while (> (elfeed-queue-count-total) 0)"
-           "  (sleep-for 5)"
-           "  (message \"%s\" (elfeed-queue-count-total))"
-           "  (accept-process-output))"
-           ;; Save and garbage-collect
-           "(elfeed-db-save)"
-           "(elfeed-db-gc)"))
-        (write-file script))
-      (chmod script #o777))
-    (set-process-sentinel (start-process-shell-command
-                           "Elfeed" nil script)
-                          (lambda (a b)
-                            (advice-remove 'elfeed #'+elfeed--update-message)
-                            (setq +elfeed--update-running nil)
-                            (message update-message-format
-                                     (string-trim b))))))
+  (unless +elfeed--update-running
+    (let ((script (expand-file-name "~/.local/bin/elfeed-update.el"))
+          (update-message-format "[Elfeed] Background update: %s"))
+      (message update-message-format "start")
+      (setq +elfeed--update-running t)
+      (elfeed-db-save)
+      (advice-add 'elfeed :override #'+elfeed--update-message)
+      (ignore-errors (kill-buffer "*elfeed-search*"))
+      (ignore-errors (kill-buffer "*elfeed-log*"))
+      (elfeed-db-unload)
+      (unless (file-exists-p script)
+        (make-directory (file-name-directory script) :parents)
+        (with-temp-buffer
+          (insert
+           (nconcat nil
+             "#!/usr/bin/env -S emacs --script"
+             "(setq lexical-binding t)"
+             ;; I have to load the necessary files
+             "(load (locate-user-emacs-file \"early-init\"))"
+             "(straight-use-package 'elfeed)"
+             "(straight-use-package 'elfeed-org)"
+             "(require 'elfeed)"
+             "(require 'elfeed-org)"
+             ;; And set needed variables
+             (let ((copy-environment))
+               (dolist (var '(rmh-elfeed-org-files
+                              elfeed-db-directory
+                              elfeed-curl-program-name
+                              elfeed-use-curl
+                              elfeed-curl-extra-arguments
+                              elfeed-enclosure-default-dir))
+                 (push (concat "(setq " (symbol-name var)
+                               " '" (prin1-to-string (symbol-value var)) ")\n")
+                       copy-environment))
+               (nreverse copy-environment))
+             ;; Overwrite log function to go to stdout
+             "(defun elfeed-log (level fmt &rest objects)"
+             "  (princ (format \"[%s] [%s]: %s\\n\""
+             "                 (format-time-string \"%F %T\")"
+             "                 level"
+             "                 (apply #'format fmt objects))))"
+             ;; Load elfeed
+             "(elfeed-org)"
+             "(elfeed-db-load)"
+             "(elfeed)"
+             ;; Update elfeed
+             "(elfeed-update)"
+             ;; Wait to finish ... I think.
+             "(while (> (elfeed-queue-count-total) 0)"
+             "  (sleep-for 5)"
+             "  (message \"%s\" (elfeed-queue-count-total))"
+             "  (accept-process-output))"
+             ;; Save and garbage-collect
+             "(elfeed-db-save)"
+             "(elfeed-db-gc)"))
+          (write-file script))
+        (chmod script #o777))
+      (set-process-sentinel (start-process-shell-command
+                             "Elfeed" nil script)
+                            (lambda (a b)
+                              (advice-remove 'elfeed #'+elfeed--update-message)
+                              (setq +elfeed--update-running nil)
+                              (message update-message-format
+                                       (string-trim b)))))))
 
 (defvar +elfeed--update-timer nil "Timer for `elfeed-update-command'.")
 (defvar +elfeed--update-first-time 6 "How long to wait for the first time.")
@@ -116,16 +117,20 @@
 
 (defun +elfeed--reinstate-update-timer ()
   "Reinstate `+elfeed--update-timer'."
+  ;; First, unload the db
+  (elfeed-db-save)
+  (elfeed-db-unload)
   (setq +elfeed--update-timer
         (run-at-time +elfeed--update-first-time
                      +elfeed--update-repeat
                      #'+elfeed-update-command)))
 
 (define-minor-mode +elfeed-update-async-mode
-  "Minor mode to update elfeed async-style every 15 minutes."
+  "Minor mode to update elfeed async-style."
   :global t
   (if +elfeed-update-async-mode
       (progn                            ; enable
+        (+elfeed--cancel-update-timer) ; first disable any hangers-on
         (+elfeed--reinstate-update-timer)
         (advice-add 'elfeed :before '+elfeed--cancel-update-timer)
         (advice-add 'elfeed-search-quit-window :after '+elfeed--reinstate-update-timer))
-- 
cgit 1.4.1-21-gabe81