
在我日益希望把 emacs 作为唯一计算环境的愿望中,我已经开始更认真地对待在它里面浏览网页。以前我认为 EWW 只是个不错的点缀,但远谈不上有能力;用了几天之后,它似乎能覆盖大约 85-90% 的使用场景——即便是在充斥着 JavaScript 的糟糕互联网里也是如此。
为什么?
在我自己使用现代浏览器(chromium/firefox)的过程中,我看到自己太容易分心——太容易偏离正轨,掉进占据我一整天的兔子洞。关于我该如何度过时间,有无限的建议;数不清的闪亮物件让我把目光从真正的奖品——创造力与深度——上移开。使用 EWW(或者对非 emacs 用户来说,任何终端浏览器,lynx 或 browsh)后,这一点已被极大地抵消。
除此之外,我相信我们应该努力向前,离开互联网的 Layer 8——社交平台那些限制性的前端,以及网络上被锁起来的角落,它们限制了真正的讨论(Discord,说的就是你)。我们向大型科技平台让渡了太多,却没有得到任何有价值的东西作为回报,以至于现在许多人认为互联网正在消亡。
互联网只是一种投递机制,而对于看清它真正面貌的人来说,互联网从未如此有生命力。我真心推荐像 1999 年那样使用互联网。
甚至在我的手机上,我也已经停止使用 JavaScript 前端,转而采用在 emacs(在 termux 中)里使用 eww,只在约 5-10% 的使用场景中退回到 fennec:

我发现这种使用互联网的方式,其信号远高于任何其他方式,让我能够查找信息、阅读文档,并产出更多。
我是怎么做的
对于还不了解的人,emacs 自带 EWW(Emacs Web Wowser),让你可以直接在 Emacs 内部浏览网页,并支持图片和 gif(gif 是什么时候死掉的,如今我几乎见不到它们了!)。
我有一些合理的默认设置,方便使用,例如用 B 返回、用 U 在光标处拉取 URL,以及一些内置函数。
按 R 会调用 eww readable,它类似于 firefox 的阅读器模式,会移除页眉和页脚,并聚焦于页面上的文本。很有用。
你可以用 & 将页面发送到默认浏览器。如果某个页面渲染得不好,这是一个不错的回退方案。
D 会在本地下载图片,b 返回上一页,a 会保存书签。所有这些都让在 eww 中浏览真正令人愉快。
我还设置了让 .pdf 在 emacs 中打开,让 .mp4 和 youtube/视频托管链接在 mpv 中打开,让 gopher/gemini 链接在 elpher 中打开。Elpher 是用于 gopher 和 gemini 协议的 EWW,也就是只有信号、没有噪音的 smolweb。
EWW 使用 Shr 来渲染 html,所以你会在下面的配置中看到一些对它的提及:
我的 browser.el 设置:
以下是我在自己的 Emacs 配置中配置 EWW 工作方式的方法:
Emacs Is My Browser
(setq eww-search-prefix "https://searx.labrynth.org/search?q=")(setq eww-download-directory (expand-file-name "~/Downloads/"))
(defun my-browse-url-mpv (url &rest _args) "Open URL in mpv." (start-process "mpv" nil "mpv" url))
(defun my-browse-url-pdf (url &rest _args) "Fetch remote PDF and open in pdf-tools within Emacs." (let ((tmp (make-temp-file "emacs-pdf-" nil ".pdf"))) (url-copy-file url tmp t) (find-file-other-window tmp) (pdf-view-mode)))
(setq browse-url-handlers '(("\\(youtube\\.com\\|youtu\\.be\\|vimeo\\.com\\|twitch\\.tv\\)" . my-browse-url-mpv) ("\\.mp4$" . my-browse-url-mpv) ("\\.pdf$" . my-browse-url-pdf) ("^gemini://" . elpher-browse-url-elpher) ("^gopher://" . elpher-browse-url-elpher) ("." . eww-browse-url)))
;; Keep your fallback setting(setq browse-url-secondary-browser-function 'browse-url-generic browse-url-generic-program "chromium")
(with-eval-after-load 'eww (define-key eww-mode-map (kbd "=") #'text-scale-increase) (define-key eww-mode-map (kbd "-") #'text-scale-decrease) (define-key eww-mode-map (kbd "0") #'text-scale-adjust))
(setq shr-width 100)(setq shr-max-width 120)(setq shr-indentation 4)
(setq shr-use-fonts nil)(setq shr-max-image-size '(800 . 600))(setq shr-image-animate t)
(defun my/eww-download-image-at-point () "Download image at point to `eww-download-directory'." (interactive) (let ((url (or (get-text-property (point) 'image-url) (get-text-property (point) 'shr-url)))) (if (not url) (message "No image at point") (let* ((filename (file-name-nondirectory (url-filename (url-generic-parse-url url)))) (dest (expand-file-name filename eww-download-directory))) (url-copy-file url dest t) (message "Saved: %s" dest)))))
;; Keybinds(with-eval-after-load 'eww (define-key eww-mode-map (kbd "b") #'eww-back-url) (define-key eww-mode-map (kbd "a") #'eww-add-bookmark) (define-key eww-mode-map (kbd "U") #'shr-copy-url) (define-key eww-mode-map (kbd "D") #'my/eww-download-image-at-point))
(provide 'browser)
我的默认搜索引擎是我自己搭建的 Searx 实例,这是一个尊重隐私的前端,聚合了所有其他搜索引擎。
局限性
你不会用它观看 YouTube 视频或阅读推文(x.com 对不支持 JS 的浏览器充满敌意)。你不会用它使用社交媒体,也不会登录任何平台。你不会用它进行网上银行操作、填写政府表格或查看客户门户。
使用场景主要是快速网页搜索、查看文档,以及一般性地阅读博客。另外,在任何网页中按下 & 都会唤起你的默认浏览器,当你确实遇到在 EWW 中运行不佳的页面时,可以在 chromium 或 firefox 中继续你的会话。
结论
我已经把所有 url 函数还原为默认在 EWW 中浏览,因此任何网页交互都必须先经过 EWW。这促使我首先深入思考自己在网上做什么,然后才在需要时回退到现代浏览器。我对能在 emacs 内完成这么多事情感到惊喜,并继续朝着永远把它作为我的计算环境的方向前进。
一如既往,上帝保佑,下次再见。
如果你喜欢这篇文章,可以考虑支持我的工作、看看我的书、与我合作,或者给我发邮件告诉我你的想法。