diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-02-17 14:53:54 +0000 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-02-17 15:02:13 +0000 |
commit | 70940c79bde48b9c9102f5e829953dbc6913bdce (patch) | |
tree | e58c318b2f7db0152bb13d9c4d69297d6a95ed06 /Emacs | |
parent | cd58595d2e4a59f6fa733ca25faf29aaae5a1968 (diff) | |
download | dotfiles-70940c79bde48b9c9102f5e829953dbc6913bdce.tar.gz dotfiles-70940c79bde48b9c9102f5e829953dbc6913bdce.tar.bz2 dotfiles-70940c79bde48b9c9102f5e829953dbc6913bdce.zip |
Rework elfeed
All my feeds are stored in a separate org file. I've written a parser
`elfeed-org` which parses the headings-as-links with the overarching
tags into a format for `elfeed-feeds`.
Why didn't I use the third-party elfeed-org package? It uses an older
version of org which straight will clone entirely. Don't want two
versions of org, and its a task just simple enough for me to do
myself.
Diffstat (limited to 'Emacs')
-rw-r--r-- | Emacs/.config/emacs/.config/elfeed/feeds.org | 18 | ||||
-rw-r--r-- | Emacs/.config/emacs/config.org | 61 | ||||
-rw-r--r-- | Emacs/.config/emacs/elisp/elfeed-org.el | 56 |
3 files changed, 88 insertions, 47 deletions
diff --git a/Emacs/.config/emacs/.config/elfeed/feeds.org b/Emacs/.config/emacs/.config/elfeed/feeds.org new file mode 100644 index 0000000..2b8a46d --- /dev/null +++ b/Emacs/.config/emacs/.config/elfeed/feeds.org @@ -0,0 +1,18 @@ +#+title: RSS Feeds +#+author: Aryadev Chavali +#+date: 2025-02-17 + +* News :news: +** [[https://www.archlinux.org/feeds/news/][Arch Linux]] +* Social :social: +** [[https://news.ycombinator.com/rss][Hacker News]] +** [[https://www.theonion.com/rss][The Onion]] +** [[https://www.hackerfactor.com/blog/index.php?/feeds/index.rss2][Hacker Factor]] +* YouTube :youtube: +** [[https://www.youtube.com/feeds/videos.xml?channel_id=UC0uTPqBCFIpZxlz_Lv1tk_g][Protesilaos Stavrou]] +** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCrqM0Ym_NbK1fqeQG2VIohg][Tsoding Daily]] +** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCrqM0Ym_NbK1fqeQG2VIohg][Tsoding]] +** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCYO_jab_esuFRV4b17AJtAw][3B1B]] +** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCbWcXB0PoqOsAvAdfzWMf0w][Fredrik Knusden]] +** [[https://www.youtube.com/feeds/videos.xml?channel_id=UC9PIn6-XuRKZ5HmYeu46AIw][Barely Sociable]] +** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCn8OYopT9e8tng-CGEWzfmw][Atrocity Guide]] diff --git a/Emacs/.config/emacs/config.org b/Emacs/.config/emacs/config.org index 1f48a32..75a59e2 100644 --- a/Emacs/.config/emacs/config.org +++ b/Emacs/.config/emacs/config.org @@ -3623,10 +3623,7 @@ most distribution nowadays. default-directory))) (evil-set-initial-state 'rg-mode 'normal)) #+end_src -** TODO Elfeed -:PROPERTIES: -:header-args:emacs-lisp: :tangle no :results none -:END: +** Elfeed Elfeed is the perfect RSS feed reader, integrated into Emacs perfectly. I've got a set of feeds that I use for a large variety of stuff, mostly media and entertainment. I've also bound "<leader> ar" @@ -3647,53 +3644,11 @@ it out again. "<return>" #'elfeed-search-show-entry) :init (setq elfeed-db-directory (no-littering-expand-var-file-name "elfeed/")) - - (setq +rss/feed-urls - '(("Arch Linux" - "https://www.archlinux.org/feeds/news/" - News Technology) - ("The Onion" - "https://www.theonion.com/rss" - Social) - ("Protesilaos Stavrou" - "https://www.youtube.com/@protesilaos" - YouTube Technology) - ("Tsoding Daily" - "https://www.youtube.com/feeds/videos.xml?channel_id=UCrqM0Ym_NbK1fqeQG2VIohg" - YouTube Technology) - ("Tsoding" - "https://www.youtube.com/feeds/videos.xml?channel_id=UCrqM0Ym_NbK1fqeQG2VIohg" - YouTube Technology) - ("Nexpo" - "https://www.youtube.com/feeds/videos.xml?channel_id=UCpFFItkfZz1qz5PpHpqzYBw" - YouTube Stories) - ("3B1B" - "https://www.youtube.com/feeds/videos.xml?channel_id=UCYO_jab_esuFRV4b17AJtAw" - YouTube) - ("Fredrik Knusden" - "https://www.youtube.com/feeds/videos.xml?channel_id=UCbWcXB0PoqOsAvAdfzWMf0w" - YouTube Stories) - ("Barely Sociable" - "https://www.youtube.com/feeds/videos.xml?channel_id=UC9PIn6-XuRKZ5HmYeu46AIw" - YouTube Stories) - ("Atrocity Guide" - "https://www.youtube.com/feeds/videos.xml?channel_id=UCn8OYopT9e8tng-CGEWzfmw" - YouTube Stories) - ("Hacker News" - "https://news.ycombinator.com/rss" - Social News Technology) - ("Hacker Factor" - "https://www.hackerfactor.com/blog/index.php?/feeds/index.rss2" - Social))) :config (with-eval-after-load "evil-collection" (evil-collection-elfeed-setup)) - (setq elfeed-feeds (cl-map 'list #'(lambda (item) - (append (list (nth 1 item)) (cdr (cdr item)))) - +rss/feed-urls)) - - (advice-add 'elfeed-search-show-entry :after #'+elfeed/dispatch-entry) + (advice-add 'elfeed-search-show-entry :after #'+elfeed/dispatch-entry) (defun +elfeed/dispatch-entry (entry) "Process each type of entry differently. @@ -3704,6 +3659,18 @@ it out again. (mpv-play-url url)) (_ (eww url)))))) #+end_src +*** Elfeed-org +#+begin_src emacs-lisp +(use-package elfeed-org + :load-path "elisp/" + :after elfeed + :init + (thread-last "elfeed/feeds.org" + no-littering-expand-etc-file-name + (setq elfeed-org/file)) + :config + (elfeed-org)) +#+end_src ** IBuffer IBuffer is the dired of buffers. Nothing much else to be said. diff --git a/Emacs/.config/emacs/elisp/elfeed-org.el b/Emacs/.config/emacs/elisp/elfeed-org.el new file mode 100644 index 0000000..2b68acc --- /dev/null +++ b/Emacs/.config/emacs/elisp/elfeed-org.el @@ -0,0 +1,56 @@ +;;; elfeed-org.el --- Org integration with elfeed -*- lexical-binding: t; -*- + +;; Copyright (C) 2025 Aryadev Chavali + +;; Author: Aryadev Chavali <aryadev@aryadevchavali.com> +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; + +;;; Code: + +(defvar elfeed-org/file nil) + +(defun elfeed-org/--parse-link (context) + (thread-last (org-element-property :title context) + search-forward) + (let ((title-context (org-element-context))) + (org-element-property :raw-link title-context))) + +(defun elfeed-org/--parse-tags () + (mapcar #'intern (org-get-tags))) + +(defun elfeed-org/--parse-headline () + (if-let* ((ctx (org-element-context)) + (link (elfeed-org/--parse-link ctx)) + (tags (elfeed-org/--parse-tags))) + (cons link tags) + nil)) + +(defun elfeed-org/--parse-headlines () + (cl-remove-if + #'null + (org-map-entries #'elfeed-org/--parse-headline t))) + +(defun elfeed-org () + (setq elfeed-feeds + (with-current-buffer (find-file-noselect elfeed-org/file) + (elfeed-org/--parse-headlines)))) + +(provide 'elfeed-org) +;;; elfeed-org.el ends here |