Permalink
Fetching contributors…
Cannot retrieve contributors at this time
106 lines (89 sloc) 5.26 KB

在Emacs中用elfeed阅读你的RSS-feeds

elfeed 是一个超赞的feed阅读器. 该项目的网站上有很完善的文档,详细讲解了各项基础知识. 我已经分享过了我的相关配置. 接下来我也会写一些博文来探讨这些配置. 今天我们就来聊一聊我的elfeed基本配置,我是如何通过一个快捷键就跳转到一组相关elfeed处的,以及我是怎么实现在多台机器之间同步feeds的.

首先我用一个org文件保存我的feeds列表. 下面摘录了一部分内容.

* blogs                                                        :elfeed:
** daily                                                        :daily:
*** http://telescoper.wordpress.com/feed/
*** http://xkcd.com/rss.xml
*** http://timharford.com/feed/
*** http://understandinguncertainty.org/rss.xml
** emacs                                                        :emacs:
*** http://www.reddit.com/r/emacs/.rss
*** http://planet.emacsen.org/atom.xml
*** http://feeds.feedburner.com/XahsEmacsBlog
*** http://pragmaticemacs.com/feed/
*** [[http://emacs.stackexchange.com/feeds][SX]]

我们需要借助elfeed-org 这个package来告诉elfeed使用上面的那份org文件:

;; use an org file to organise feeds
(use-package elfeed-org
  :ensure t
  :config
  (elfeed-org)
  (setq rmh-elfeed-org-files (list "/path/to/elfeed.org")))

你应该能注意到,在上面的org文件中,我用到了一个org-mode的链接来指向stack exchange feed; 该链接的描述部分(即SX)会被elfeed用来作为feed的标题. 我还将这些feeds按照daily和emacs的标签进行了分类规整. elfeed会用这些标签来让你可以阅读同一系列的feed. 第一次运行elfeed的时候我们还需要添加一些书签 指向这些feed的集合. 然后,我们需要在emacs配置文件 中添加如下函数帮助我们跳转到这些feed的集合处:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; elfeed feed reader                                                     ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;shortcut functions
(defun bjm/elfeed-show-all ()
  (interactive)
  (bookmark-maybe-load-default-file)
  (bookmark-jump "elfeed-all"))
(defun bjm/elfeed-show-emacs ()
  (interactive)
  (bookmark-maybe-load-default-file)
  (bookmark-jump "elfeed-emacs"))
(defun bjm/elfeed-show-daily ()
  (interactive)
  (bookmark-maybe-load-default-file)
  (bookmark-jump "elfeed-daily"))

目前, 我在两台机器上使用elfeed,同时保持elfeed数据库(默认保存在 ~/.elfeed 中)在两台机器之间同步. (我自己用的是unison, 不过你可以使用dropbox之类的其他软件). 为了让这套机制能正常工作,我们还需要确保elfeed退出时会更新数据库,当elfeed重新启动时会再次读取数据库. 下面是一些辅助函数:

;;functions to support syncing .elfeed between machines
;;makes sure elfeed reads index from disk before launching
(defun bjm/elfeed-load-db-and-open ()
  "Wrapper to load the elfeed db from disk before opening"
  (interactive)
  (elfeed-db-load)
  (elfeed)
  (elfeed-search-update--force))

;;write to disk when quiting
(defun bjm/elfeed-save-db-and-bury ()
  "Wrapper to save the elfeed db to disk before burying buffer"
  (interactive)
  (elfeed-db-save)
  (quit-window))

下面让我们安装 并配置elfeed

(use-package elfeed
  :ensure t
  :bind (:map elfeed-search-mode-map
              ("A" . bjm/elfeed-show-all)
              ("E" . bjm/elfeed-show-emacs)
              ("D" . bjm/elfeed-show-daily)
              ("q" . bjm/elfeed-save-db-and-bury)))

做完这些之后,我们就可以通过运行 M-x bjm/elfeed-load-db-and-open 来启动elfeed. 若你是第一次运行elfeed,则还需要为我们的标签创建书签: 按下 G 键刷新feeds后按下 C-x r m 创建一个书签并将之命名为 elfeed-all (与我们上面函数定义中的名字要一致). 然后按下 s 来设置过滤条件并在过滤字符串中添加 +emacs. 这样一来应该会只显示你emacs相关的feeds了. 然后为该过滤结果创建一个名为 elfeed-emacs 的书签. 其他的标签也依此法一一操作.

书签创建好后,在elfeed窗口中按下 E 键就会跳到你Emacs相关feed处了,其他快捷键也是类似的功能.

阅读完毕后,可以按下 q 退出elfeed,这样elfeed会保存数据库,并将你最新的改变同步到另一台机.

下一步,我还将研究如何为文章点赞以及如何用org-mode来保存文章,还会对feed的过滤方式做一些小优化.