用 Elfeed 打造本地离线 RSS 阅读系统

2026-06-27

为什么做这个

RSS 是互联网上最古老的开放协议之一,也是我个人获取信息的主力方式。

但过去几年的趋势是:RSS 服务一个接一个关闭,或者被收购后变质。算法推荐、广告追踪、付费墙、账户迁移——这些都不是我想要的阅读体验。

我不想再依赖 Feedly、Inoreader 或者任何一家的 RSS 服务器。我想要的是一个完全本地运行的阅读系统:

Elfeed 就是 Emacs 生态里最适合这个需求的工具。

核心能力

Elfeed 是一个用 Emacs Lisp 写的 RSS/Atom 阅读器。它的数据全部存在本地一个索引文件里(~/.emacs.d/.elfeed/index),抓取的文章保存在 ~/.emacs.d/.elfeed/data 目录下。

这意味着:不管网络好不好,你已经拉下来的文章永远可以读。

基本界面

标签系统

Elfeed 的标签非常灵活,可以给单篇文章打多个标签。配合搜索表达式用,你可以快速构造出自己的信息筛选器,比如:

+unread +emacs @3-days-ago
+starred +productivity @1-month-ago

我的配置

目录设定:

(setq elfeed-db-directory (expand-file-name ".elfeed" user-emacs-directory))

订阅列表(节选):

(setq elfeed-feeds
      '(
        "https://nullprogram.com/feed/"
        "https://planet.emacslife.com/atom.xml"
        "https://sive.rs/feed"
        "https://protesilaos.com/master.xml"
        "https://simonwillison.net/atom/everything/"
        "https://feeds.feedburner.com/ruanyifeng"
        "https://feeds.appinn.com/appinns"
        "https://stephango.com/feed"
        "https://fs.blog/feed/"
        "https://www.joelonsoftware.com/feed"
        ))

跨设备同步

Elfeed 的 .elfeed 目录本质上就是一个普通文件夹。我用 rsync 每天把它镜像到另一台机器上的共享目录:

(defun my-backup-elfeed-db ()
  "Copy Elfeed database to a shared directory for cross-device sync."
  (interactive)
  (let ((source (expand-file-name ".elfeed/" user-emacs-directory))
        (dest (expand-file-name "shared/.elfeed/" "~")))
    (make-directory dest t)
    (if (executable-find "rsync")
        (shell-command
         (format "rsync -av --delete %s %s"
                 (shell-quote-argument source)
                 (shell-quote-argument (file-name-directory dest))))
      (copy-directory source dest t t t))))

只要 rsync 能把 .elfeed 目录同步过去,Windows 或 NixOS 上的 Emacs 打开后状态完全一致。不需要任何在线服务帮你”同步阅读进度”。

设计哲学

获取