diff options
Diffstat (limited to 'lisp/+elfeed.el')
-rw-r--r-- | lisp/+elfeed.el | 133 |
1 files 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 @@ | |||
40 | 40 | ||
41 | (defun +elfeed-update-command () | 41 | (defun +elfeed-update-command () |
42 | (interactive) | 42 | (interactive) |
43 | (let ((script (expand-file-name "~/.local/bin/elfeed-update.el")) | 43 | (unless +elfeed--update-running |
44 | (update-message-format "[Elfeed] Background update: %s")) | 44 | (let ((script (expand-file-name "~/.local/bin/elfeed-update.el")) |
45 | (message update-message-format "start") | 45 | (update-message-format "[Elfeed] Background update: %s")) |
46 | (setq +elfeed--update-running t) | 46 | (message update-message-format "start") |
47 | (elfeed-db-save) | 47 | (setq +elfeed--update-running t) |
48 | (advice-add 'elfeed :override #'+elfeed--update-message) | 48 | (elfeed-db-save) |
49 | (ignore-errors (kill-buffer "*elfeed-search*")) | 49 | (advice-add 'elfeed :override #'+elfeed--update-message) |
50 | (ignore-errors (kill-buffer "*elfeed-log*")) | 50 | (ignore-errors (kill-buffer "*elfeed-search*")) |
51 | (elfeed-db-unload) | 51 | (ignore-errors (kill-buffer "*elfeed-log*")) |
52 | (unless (file-exists-p script) | 52 | (elfeed-db-unload) |
53 | (make-directory (file-name-directory script) :parents) | 53 | (unless (file-exists-p script) |
54 | (with-temp-buffer | 54 | (make-directory (file-name-directory script) :parents) |
55 | (insert | 55 | (with-temp-buffer |
56 | (nconcat nil | 56 | (insert |
57 | "#!/usr/bin/env -S emacs --script" | 57 | (nconcat nil |
58 | "(setq lexical-binding t)" | 58 | "#!/usr/bin/env -S emacs --script" |
59 | ;; I have to load the necessary files | 59 | "(setq lexical-binding t)" |
60 | "(load (locate-user-emacs-file \"early-init\"))" | 60 | ;; I have to load the necessary files |
61 | "(straight-use-package 'elfeed)" | 61 | "(load (locate-user-emacs-file \"early-init\"))" |
62 | "(straight-use-package 'elfeed-org)" | 62 | "(straight-use-package 'elfeed)" |
63 | "(require 'elfeed)" | 63 | "(straight-use-package 'elfeed-org)" |
64 | "(require 'elfeed-org)" | 64 | "(require 'elfeed)" |
65 | ;; And set needed variables | 65 | "(require 'elfeed-org)" |
66 | (let ((copy-environment)) | 66 | ;; And set needed variables |
67 | (dolist (var '(rmh-elfeed-org-files | 67 | (let ((copy-environment)) |
68 | elfeed-db-directory | 68 | (dolist (var '(rmh-elfeed-org-files |
69 | elfeed-curl-program-name | 69 | elfeed-db-directory |
70 | elfeed-use-curl | 70 | elfeed-curl-program-name |
71 | elfeed-curl-extra-arguments | 71 | elfeed-use-curl |
72 | elfeed-enclosure-default-dir)) | 72 | elfeed-curl-extra-arguments |
73 | (push (concat "(setq " (symbol-name var) | 73 | elfeed-enclosure-default-dir)) |
74 | " '" (prin1-to-string (symbol-value var)) ")\n") | 74 | (push (concat "(setq " (symbol-name var) |
75 | copy-environment)) | 75 | " '" (prin1-to-string (symbol-value var)) ")\n") |
76 | (nreverse copy-environment)) | 76 | copy-environment)) |
77 | ;; Overwrite log function to go to stdout | 77 | (nreverse copy-environment)) |
78 | "(defun elfeed-log (level fmt &rest objects)" | 78 | ;; Overwrite log function to go to stdout |
79 | " (princ (format \"[%s] [%s]: %s\\n\"" | 79 | "(defun elfeed-log (level fmt &rest objects)" |
80 | " (format-time-string \"%F %T\")" | 80 | " (princ (format \"[%s] [%s]: %s\\n\"" |
81 | " level" | 81 | " (format-time-string \"%F %T\")" |
82 | " (apply #'format fmt objects))))" | 82 | " level" |
83 | ;; Load elfeed | 83 | " (apply #'format fmt objects))))" |
84 | "(elfeed-org)" | 84 | ;; Load elfeed |
85 | "(elfeed-db-load)" | 85 | "(elfeed-org)" |
86 | "(elfeed)" | 86 | "(elfeed-db-load)" |
87 | ;; Update elfeed | 87 | "(elfeed)" |
88 | "(elfeed-update)" | 88 | ;; Update elfeed |
89 | ;; Wait to finish ... I think. | 89 | "(elfeed-update)" |
90 | "(while (> (elfeed-queue-count-total) 0)" | 90 | ;; Wait to finish ... I think. |
91 | " (sleep-for 5)" | 91 | "(while (> (elfeed-queue-count-total) 0)" |
92 | " (message \"%s\" (elfeed-queue-count-total))" | 92 | " (sleep-for 5)" |
93 | " (accept-process-output))" | 93 | " (message \"%s\" (elfeed-queue-count-total))" |
94 | ;; Save and garbage-collect | 94 | " (accept-process-output))" |
95 | "(elfeed-db-save)" | 95 | ;; Save and garbage-collect |
96 | "(elfeed-db-gc)")) | 96 | "(elfeed-db-save)" |
97 | (write-file script)) | 97 | "(elfeed-db-gc)")) |
98 | (chmod script #o777)) | 98 | (write-file script)) |
99 | (set-process-sentinel (start-process-shell-command | 99 | (chmod script #o777)) |
100 | "Elfeed" nil script) | 100 | (set-process-sentinel (start-process-shell-command |
101 | (lambda (a b) | 101 | "Elfeed" nil script) |
102 | (advice-remove 'elfeed #'+elfeed--update-message) | 102 | (lambda (a b) |
103 | (setq +elfeed--update-running nil) | 103 | (advice-remove 'elfeed #'+elfeed--update-message) |
104 | (message update-message-format | 104 | (setq +elfeed--update-running nil) |
105 | (string-trim b)))))) | 105 | (message update-message-format |
106 | (string-trim b))))))) | ||
106 | 107 | ||
107 | (defvar +elfeed--update-timer nil "Timer for `elfeed-update-command'.") | 108 | (defvar +elfeed--update-timer nil "Timer for `elfeed-update-command'.") |
108 | (defvar +elfeed--update-first-time 6 "How long to wait for the first time.") | 109 | (defvar +elfeed--update-first-time 6 "How long to wait for the first time.") |
@@ -116,16 +117,20 @@ | |||
116 | 117 | ||
117 | (defun +elfeed--reinstate-update-timer () | 118 | (defun +elfeed--reinstate-update-timer () |
118 | "Reinstate `+elfeed--update-timer'." | 119 | "Reinstate `+elfeed--update-timer'." |
120 | ;; First, unload the db | ||
121 | (elfeed-db-save) | ||
122 | (elfeed-db-unload) | ||
119 | (setq +elfeed--update-timer | 123 | (setq +elfeed--update-timer |
120 | (run-at-time +elfeed--update-first-time | 124 | (run-at-time +elfeed--update-first-time |
121 | +elfeed--update-repeat | 125 | +elfeed--update-repeat |
122 | #'+elfeed-update-command))) | 126 | #'+elfeed-update-command))) |
123 | 127 | ||
124 | (define-minor-mode +elfeed-update-async-mode | 128 | (define-minor-mode +elfeed-update-async-mode |
125 | "Minor mode to update elfeed async-style every 15 minutes." | 129 | "Minor mode to update elfeed async-style." |
126 | :global t | 130 | :global t |
127 | (if +elfeed-update-async-mode | 131 | (if +elfeed-update-async-mode |
128 | (progn ; enable | 132 | (progn ; enable |
133 | (+elfeed--cancel-update-timer) ; first disable any hangers-on | ||
129 | (+elfeed--reinstate-update-timer) | 134 | (+elfeed--reinstate-update-timer) |
130 | (advice-add 'elfeed :before '+elfeed--cancel-update-timer) | 135 | (advice-add 'elfeed :before '+elfeed--cancel-update-timer) |
131 | (advice-add 'elfeed-search-quit-window :after '+elfeed--reinstate-update-timer)) | 136 | (advice-add 'elfeed-search-quit-window :after '+elfeed--reinstate-update-timer)) |