EmacsTalk

优化 EWW 浏览 GitHub 体验

  tags: eww GitHub

文章目录

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

https://img.alicdn.com/imgextra/i3/581166664/O1CN011PhiLe1z6A81ihblc_!!581166664.png
默认 EWW 浏览 GitHub 时的界面

可以看到,EWW 展示 GitHub 时充斥了大量类似导航栏之类的内容,比较影响代码阅读。优化思路也很简单,就是尽量用 GitHub 提供的功能,以纯文本的方式来浏览,方式如下:

  1. 对于项目中的每一个文件,都对于一个纯文本的 raw 版本
  2. 在每个 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)

收听方式

反馈