这是一个辅助文档阅读的包,有点类似kindle的xray(所以取了这个名)。
是为了解决这个问题:在阅读文档时,某个主题会在文档的不同地方多次出现,或者在多个不同的文档里出现。要想回看出现的地方,一个方式就是用搜索,但是总归不够方便,很难快速找到要找的位置。
这个包可以在主题出现的时候加一个记录(保存在单独的文件中),加的时候需要提供topic和desc,包会自动记录当前的位置(行或者页)。
文档可以分组,组内的文档的xray记录保存在同一个文件里。可以按文件查看记录,或者按组查看记录,也可以查看组内同一个topic的记录。
截图
我的配置:
(use-package xray
:ensure nil
:load-path "~/.emacs.d/packages/xray/"
:demand t
:bind (
("C-c a r" . xr-add-ray)
)
:config (progn
(setq xr-open-pdf-with-eaf t) ;; 是否用eaf打开pdf
(setq xr-default-directory "~/.emacs.d/data/unsync/xray") ;; 默认保存记录的目录
(defun xr-mode-line-function()
(add-to-list 'mode-line-format 'mode-line-xray-info t)
)
(add-hook 'find-file-hook #'xr-mode-line-function)
(with-eval-after-load 'eaf
(add-hook 'eaf-mode-hook #'xr-mode-line-function)
)
;; xr-directory-alist是为了解决在多台电脑(目录结构不同,例如两台电脑上分别有路径/A/B/C/, /a/b/C,两个C开始,目录结构和内容都相同)上共享xray文件的问题。xray文件里不记录绝对路径,而是会记录一个tag(也就是下面配置中的TEST)
(if (getenv "HOME_ENV")
(progn
(setq xr-directory-alist '(
("TEST" . ("/home/lucency/.emacs.d/packages/xray" . "/home/lucency/.emacs.d"))
))
)
(progn
(setq xr-directory-alist '(
("TEST" . ("/home/zbelial/.emacs.d/packages/xray" . "/home/zbelial/.emacs.d"))
))
)
)
(use-package counsel-xray
:ensure nil
:after (counsel xray)
:bind (
("C-c l x f" . counsel-xr-file-rays)
("C-c l x r" . counsel-xr-rays)
("C-c l x t" . counsel-xr-topic-rays)
)
:config (progn
;; 支持拼音首字母搜索,zjy/ivy-regex-pinyin是抄的 @tumashu 的,就不放代码了
(add-to-list 'ivy-re-builders-alist '(counsel-xr-topic-rays . zjy/ivy-regex-pinyin))
(add-to-list 'ivy-re-builders-alist '(counsel-xr-file-rays . zjy/ivy-regex-pinyin))
(add-to-list 'ivy-re-builders-alist '(counsel-xr-rays . zjy/ivy-regex-pinyin))
;; 排序函数后面应该会直接放到xray包里
(defun zjy/counsel-xray-sorter (&optional l r)
(let* ((lr (cdr l))
(rr (cdr r))
(lt (plist-get lr :topic))
(rt (plist-get rr :topic))
(lp (or (plist-get lr :linum) (plist-get lr :page)))
(rp (or (plist-get rr :linum) (plist-get rr :page))))
(cond
((equal lt rt)
(< lp rp)
)
((string< lt rt)
t
)
(t
nil
))
))
(ivy-configure 'counsel-xr-file-rays
:sort-fn #'zjy/counsel-xray-sorter)
(ivy-configure 'counsel-xr-rays
:sort-fn #'zjy/counsel-xray-sorter)
(defun zjy/counsel-xray-topic-sorter (&optional l r)
(let* ((lr (cdr l))
(rr (cdr r))
(lt (plist-get lr :topic))
(rt (plist-get rr :topic))
(lf (f-filename (plist-get lr :file)))
(rf (f-filename (plist-get rr :file)))
(lp (or (plist-get lr :linum) (plist-get lr :page)))
(rp (or (plist-get rr :linum) (plist-get rr :page))))
(cond
((equal lt rt)
(cond
((equal lf rf)
(< lp rp)
)
((string< lf rf)
t
)
(t
nil
)))
((string< lt rt)
t
)
(t
nil
))
))
(ivy-configure 'counsel-xr-topic-rays
:sort-fn #'zjy/counsel-xray-topic-sorter)
)
)
)
)
包在 github上。elisp不熟,代码写得一般般。
我自己已经在用了,但是肯定还会有一些bug,我现在边用边改。欢迎大家试用,提pr,提issue。
注:
- 支持对文本类文档、pdf(eaf或者pdf-tools或者doc-view打开时)、本地html(eww/w3m打开时)添加记录
- 为了记录的位置更准确,对于pdf,除了记录当前页码,还会记录可见部分在整个文档的百分比位置(用eaf查看时。这个是在我自己fork的eaf里添加了需要的代码,还没有提交pr. @manateelazycat 两个函数,一个返回当前percent,一个跳转到percent位置,我提交个pr?)或者在当前页面的百分比位置(用pdf-tools查看时)
- 依赖ivy来查看、跳转到文档的对应位置。