+++ title = "Read RSS with Elfeed" author = ["MichaĆ Sapka"] date = 2023-05-19T23:00:00+02:00 categories = ["emacs"] draft = false weight = 3001 image_dir = "emacs" image_max_width = 480 primary_menu = "cool-emacs-ways" abstract = "Setting up config inside an org file" aliases = ["/2023/moving-my-rss-reading-to-emacs-with-elfeed/", "/emacs/moving-my-rss-reading-to-emacs-with-elfeed/", "/cool-emacs/elfeed-literate-config/"] [menu] [menu.cool-emacs-ways] weight = 3001 identifier = "read-rss-with-elfeed" +++ Since Emacs became my shell of choice[^fn:1], I am abandoning more and more dedicated applications in favor of different packages. As it turns out, Emacs packages are very feature rich. This time: I moved my RSS reading from newsboat[^fn:2] to elfeed[^fn:3]. Elfeed has very simple keybindings: - g will refresh the items list - G will refresh the items list and fetch new items - r will mark currently selected item is read (remove unread tag)[^4] - b will open item in the browser One huge upside of elfeed compared to newsboat is image support. Emacs is a GUI application, so all images are present in their glory! {{< image class="centered" alt="An Emacs screenshot showing a list using a dark mode" file="elfeed-list.png" >}} List of articles {{< /image >}} {{< image class="centered" alt="An Emacs screenshot showing Elfeed in a dark mode with a vintage PC case in the middle" file="elfeed-details.png" >}} Images! {{< /image >}} My setup is near stock. I have a few dozen feeds that are auto-tagged. Three essential tags are "important", "news", and "company". I want to read each "important", then I want to see all normal, and finally I can just skim "news" and "company". Adding auto-tagging is very simple: just define the tag when defining the RSS feed list: ```emacs-lisp ("https://rubenerd.com/feed/" blog important) ("https://www.pine64.org/feed/" company) ``` Now, each new article will be tagged with matching tags. Elfeed allows to define of custom faces that will be applied to items matching tag[^fn:4]: ```emacs-lisp (defface important-elfeed-entry '((t :foreground "#f77")) "Marks an important Elfeed entry." :group 'elfeed) (defface nonimportant-elfeed-entry '((t :foreground "#C0C0C0")) "Marks an nonimportant Elfeed entry." :group 'elfeed) (push '(important important-elfeed-entry) elfeed-search-face-alist) (push '(company nonimportant-elfeed-entry) elfeed-search-face-alist) (push '(news nonimportant-elfeed-entry) elfeed-search-face-alist) ``` Now important items will be dark red, while company & news will be dark gray