emacs/lisp/+elfeed.el

107 lines
4.0 KiB
EmacsLisp

;;; +elfeed.el -*- lexical-binding: t; -*-
;;; Code:
;; https://karthinks.com/software/lazy-elfeed/
(defun +elfeed-scroll-up-command (&optional arg)
"Scroll up or go to next feed item in Elfeed"
(interactive "^P")
(let ((scroll-error-top-bottom nil))
(condition-case-unless-debug nil
(scroll-up-command arg)
(error (elfeed-show-next)))))
(defun +elfeed-scroll-down-command (&optional arg)
"Scroll up or go to next feed item in Elfeed"
(interactive "^P")
(let ((scroll-error-top-bottom nil))
(condition-case-unless-debug nil
(scroll-down-command arg)
(error (elfeed-show-prev)))))
(defun +elfeed-search-browse-generic ()
"Browse a url with `browse-url-generic-browser'."
(interactive)
(elfeed-search-browse-url t))
(defun +elfeed-show-browse-generic ()
"Browse a url with `browse-url-generic-browser'."
(interactive)
(elfeed-show-visit t))
;;; Fetch feeds async
;; https://github.com/skeeto/elfeed/issues/367
(defun +elfeed--update-message ()
(message "[Elfeed] Update in progress")
'ignore)
(defvar +elfeed--update-running nil "Whether an update is currently running.")
(defun +elfeed-update-command ()
(interactive)
(let ((script (expand-file-name "~/.local/bin/elfeed")))
(message "[Elfeed] Updating in the background.")
(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 "(progn\n"
" (load (locate-user-emacs-file \"early-init\"))\n"
" (straight-use-package 'elfeed)\n"
" (require 'elfeed)\n"
" (elfeed)\n"
" (elfeed-update)\n"
" (while (> (elfeed-queue-count-total) 0)\n"
" (sleep-for 5)\n"
" (message \"%s\" (elfeed-queue-count-total))\n"
" (accept-process-output))\n"
" (elfeed-db-save-safe)\n"
" (elfeed-db-gc-safe))")
(write-file script)))
(set-process-sentinel (start-process-shell-command
"Elfeed" nil (concat "emacs --script " script))
(lambda (a b)
(advice-remove 'elfeed #'+elfeed--update-message)
(setq +elfeed--update-running nil)
(message "[Elfeed] Background update %s."
(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.")
(defvar +elfeed--update-repeat (* 60 15) "How long between updates.")
(defun +elfeed--cancel-update-timer ()
"Cancel `+elfeed--update-timer'."
(unless +elfeed--update-running
(ignore-errors (cancel-timer +elfeed--update-timer))
(setq +elfeed--update-timer nil)))
(defun +elfeed--reinstate-update-timer ()
"Reinstate `+elfeed--update-timer'."
(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."
:global t
(if +elfeed-update-async-mode
(progn ; enable
(+elfeed--reinstate-update-timer)
(advice-add 'elfeed :before '+elfeed--cancel-update-timer)
(advice-add 'elfeed-search-quit-window :after '+elfeed--reinstate-update-timer))
(progn ; disable
(advice-remove 'elfeed '+elfeed--cancel-update-timer)
(advice-remove 'elfeed-search-quit-window '+elfeed--reinstate-update-timer)
(+elfeed--cancel-update-timer))))
(provide '+elfeed)
;;; +elfeed.el ends here