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(-) (limited to 'lisp') 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