EmacsTalk

优化 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 重定向,解决代码如下:

(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,进行语法高亮,更方便阅读,代码如下:

(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)

反馈


Menu