From ca8b3b18fa90679527b83568a80c979d7fe369e6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 Mar 2017 22:01:37 -0500 Subject: [PATCH] Add modules/app/rss (WIP) --- modules/app/rss/autoload.el | 65 +++++++++++++++++++++++++++++++++++++ modules/app/rss/config.el | 61 ++++++++++++++++++++++++++++++++++ modules/app/rss/packages.el | 5 +++ 3 files changed, 131 insertions(+) create mode 100644 modules/app/rss/autoload.el create mode 100644 modules/app/rss/config.el create mode 100644 modules/app/rss/packages.el diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el new file mode 100644 index 000000000..6106ed882 --- /dev/null +++ b/modules/app/rss/autoload.el @@ -0,0 +1,65 @@ +;;; app/rss/autoload.el + +;;;###autoload +(defun =rss () + "Activate (or switch to) `elfeed' in its workspace." + (interactive) + (+workspace-switch +rss-workspace-name t) + (delete-other-windows) + (elfeed)) + +;;;###autoload +(defun +rss|elfeed-wrap () + "Enhances an elfeed entry's readability by wrapping it to a width of +`fill-column' and centering it with `visual-fill-column-mode'." + (let ((inhibit-read-only t) + (inhibit-modification-hooks t)) + (setq-local truncate-lines nil) + (setq-local shr-width 85) + (set-buffer-modified-p nil))) + +;;;###autoload +(defun +rss/delete-pane () + "Delete the *elfeed-entry* split pane." + (interactive) + (let* ((buff (get-buffer "*elfeed-entry*")) + (window (get-buffer-window buff))) + (kill-buffer buff) + (delete-window window))) + +;;;###autoload +(defun +rss-popup-pane (buf) + "Display BUF in a popup." + (doom-popup-buffer buf + :align +rss-split-direction + :size 0.75 + :select t + :noesc t + :autokill t)) + +;;;###autoload +(defun +rss/open (entry) + "Display the currently selected item in a buffer." + (interactive (list (elfeed-search-selected :ignore-region))) + (when (elfeed-entry-p entry) + (elfeed-untag entry 'unread) + (elfeed-search-update-entry entry) + (elfeed-show-entry entry))) + +;;;###autoload +(defun +rss/next () + "Show the next item in the elfeed-search buffer." + (interactive) + (funcall elfeed-show-entry-delete) + (with-current-buffer (elfeed-search-buffer) + (forward-line) + (call-interactively '+rss/open))) + +;;;###autoload +(defun +rss/previous () + "Show the previous item in the elfeed-search buffer." + (interactive) + (funcall elfeed-show-entry-delete) + (with-current-buffer (elfeed-search-buffer) + (forward-line -1) + (call-interactively '+rss/open))) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el new file mode 100644 index 000000000..dd7d6a24e --- /dev/null +++ b/modules/app/rss/config.el @@ -0,0 +1,61 @@ +;;; app/rss/config.el + +;; This is an opinionated workflow that turns Emacs into an RSS reader, inspired +;; by apps Reeder and Readkit. It can be invoked via `=rss'. Otherwise, if you +;; don't care for the UI you can invoke elfeed directly with `elfeed'. + +(defvar +rss-org-dir (concat +org-dir "/rss/") + "Where RSS org files are located.") + +(defvar +rss-elfeed-files (list "elfeed.org") + "The files that configure `elfeed's rss feeds.") + +(defvar +rss-workspace-name "RSS" + "The name of the transient workspace for elfeed to run in.") + +(defvar +rss-split-direction 'below + "What direction to pop up the entry buffer in elfeed.") + + +;; +;; Packages +;; + +(def-package! elfeed + :commands elfeed + :config + (setq-default elfeed-search-filter "@2-week-ago ") + (setq elfeed-db-directory (concat doom-local-dir "elfeed/") + elfeed-show-entry-switch '+rss-popup-pane + elfeed-show-entry-delete '+rss/delete-pane) + + ;; Ensure elfeed buffers are treated as real + (push (lambda (buf) (string-match-p "^\\*elfeed" (buffer-name buf))) + doom-real-buffer-functions) + + (add-hook! (elfeed-search-mode elfeed-show-mode) + 'doom-hide-modeline-mode) + (add-hook 'elfeed-show-mode-hook '+rss|elfeed-wrap) + + (after! doom-themes + (add-hook 'elfeed-show-mode-hook 'doom-buffer-mode)) + + (map! :map elfeed-search-mode-map + :n "r" 'elfeed-update + :n "RET" 'elfeed-search-show-entry + + :map elfeed-show-mode-map + [remap doom/kill-this-buffer] 'elfeed-kill-buffer + :n "q" 'elfeed-kill-buffer + :m "j" 'evil-next-visual-line + :m "k" 'evil-previous-visual-line + :n "]b" '+rss/next + :n "[b" '+rss/previous)) + +(def-package! elfeed-org + :after elfeed + :config + (setq rmh-elfeed-org-files + (mapcar (lambda (file) (expand-file-name file +rss-org-dir)) + +rss-elfeed-files)) + (elfeed-org)) diff --git a/modules/app/rss/packages.el b/modules/app/rss/packages.el new file mode 100644 index 000000000..b1356ab8d --- /dev/null +++ b/modules/app/rss/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; app/rss/packages.el + +(package! elfeed) +(package! elfeed-org)