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