优化 EWW 浏览 GitHub 体验
文章目录
在之前的使用 EWW 阅读技术文章一文中介绍过使用 EWW 的优势,对于文档来说默认的 EWW 体验就很好了,但是对于阅读 GitHub 上的代码时,体验就不是很好了。比如:

可以看到,EWW 展示 GitHub 时充斥了大量类似导航栏之类的内容,比较影响代码阅读。优化思路也很简单,就是尽量用 GitHub 提供的功能,以纯文本的方式来浏览,方式如下:
- 对于项目中的每一个文件,都对于一个纯文本的 raw 版本
- 在每个 Pull Request/Commit 页面,通过增加
.patch后缀,可以打开对应的 patch 格式文件
有了上面的指导思路,实现就不复杂了。首要问题就是 URL 重定向,解决代码如下:
1(setq my/url-redirect-list `(("^https://github.com/\\(.+\\)/commit/\\(\\w+\\)$" .
2 ;; 针对单个 commit
3 (lambda (url)
4 (format "https://github.com/%s/commit/%s.patch"
5 (match-string 1 url)
6 (match-string 2 url))))
7 ("^https://github.com/\\(.+\\)/pull/\\([[:digit:]]+\\)$" .
8 ;; 针对单个 Pull Request
9 (lambda (url)
10 (format "https://github.com/%s/pull/%s.patch"
11 (match-string 1 url)
12 (match-string 2 url))))
13 ("^https://github.com/\\(.+\\)/blob/\\(.+\\)" .
14 ;; 针对单个文件
15 (lambda (url)
16 (format "https://github.com/%s/raw/%s"
17 (match-string 1 url)
18 (match-string 2 url))))))
19
20(defun my/url-redirect (fn url &rest args)
21 (catch 'ret
22 (dolist (redirect-rule my/url-redirect-list)
23 (let* ((regexp (car redirect-rule))
24 (redirect-fn (cdr redirect-rule))
25 (inhibit-message t))
26 (when-let* ((matched-groups (string-match regexp url)))
27 (setq url (funcall redirect-fn url))
28 (message "Redirect URL to %s" url)
29 (throw 'ret url)))))
30 (apply fn url args))
31
32(advice-add 'eww :around 'my/url-redirect)利用 advice 机制,在使用 eww 时进行规则匹配,成功时进行 URL 改写,如果所有规则都不匹配,则浏览原始 URL。
在能以纯文本格式浏览 GitHub 后,可以根据打开的链接,开启对应的 mode,进行语法高亮,更方便阅读,代码如下:
1(defun my/eww-render-hook()
2 (let ((url (plist-get eww-data :url)))
3 (cond
4 ((string-suffix-p ".patch" url) (diff-mode))
5 ((string-suffix-p ".el" url) (emacs-lisp-mode))
6 ((string-suffix-p ".rs" url) (rust-mode))
7 ((string-suffix-p ".go" url) (go-mode))
8 (t (when (and (plist-get eww-data :source)
9 ;; 排除微信公众号内的文章
10 (not (string-match-p "weixin\\.qq\\.com" url)))
11 (eww-readable))))))
12
13(add-hook 'eww-after-render-hook 'my/eww-render-hook)收听方式

反馈
- 对节目有想法或发现内容错误?欢迎来信交流️