推荐一个自己写的包:xray

这是一个辅助文档阅读的包,有点类似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。

注:

  1. 支持对文本类文档、pdf(eaf或者pdf-tools或者doc-view打开时)、本地html(eww/w3m打开时)添加记录
  2. 为了记录的位置更准确,对于pdf,除了记录当前页码,还会记录可见部分在整个文档的百分比位置(用eaf查看时。这个是在我自己fork的eaf里添加了需要的代码,还没有提交pr. @manateelazycat 两个函数,一个返回当前percent,一个跳转到percent位置,我提交个pr?)或者在当前页面的百分比位置(用pdf-tools查看时)
  3. 依赖ivy来查看、跳转到文档的对应位置。
9 个赞

欢迎PR, 哈哈哈哈哈哈哈