EMACS-DOCUMENT

=============>随便,谢谢

通过org-mode管理Chromium和Firefox会话

我是 Session Manager 的大粉丝,它是Chrome和Chromium的小插件,可以保存所有打开的选项卡,为会话命名,并在需要时恢复会话。

它非常有用,特别是如果你像我一样,白天的时候需要在多个“思维活动”之间切换——研究、开发或者新闻阅读。或者您只是单纯地希望记住几天前的工作流(和选项卡)。

在我决定放弃chromium上除了 uBlock Origin 之外的所有扩展后, 也到了寻找替代品的时候了. 我的主要目标是使之与浏览器无关同时会话链接需要保存在文本文件中, 这样我就可以享受所有纯文本的好处了. 还有什么比 org-mode 更好呢 ;)

and with some elisp sugar and coffee, here is the code: 很久以前我就发现了这个小诀窍:通过命令行获取当前在谷歌Chrome中打开的标签 再加上些elisp代码:

(require 'cl-lib)

(defun save-chromium-session ()
  "Reads chromium current session and generate org-mode heading with items."
  (interactive)
  (save-excursion
    (let* ((cmd "strings ~/'.config/chromium/Default/Current Session' | 'grep' -E '^https?://' | sort | uniq")
           (ret (shell-command-to-string cmd)))
      (insert
       (concat
        "* "
        (format-time-string "[%Y-%m-%d %H:%M:%S]")
        "\n"
        (mapconcat 'identity
                   (cl-reduce (lambda (lst x)
                                (if (and x (not (string= "" x)))
                                    (cons (concat "  - " x) lst)
                                  lst))
                              (split-string ret "\n")
                              :initial-value (list))
                   "\n"))))))

(defun restore-chromium-session ()
  "Restore session, by openning each link in list with (browse-url).
Make sure to put cursor on date heading that contains list of urls."
  (interactive)
  (save-excursion
    (beginning-of-line)
    (when (looking-at "^\\*")
      (forward-line 1)
      (while (looking-at "^[ ]+-[ ]+\\(http.?+\\)$")
        (let* ((ln (thing-at-point 'line t))
               (ln (replace-regexp-in-string "^[ ]+-[ ]+" "" ln))
               (ln (replace-regexp-in-string "\n" "" ln)))
          (browse-url ln))
        (forward-line 1)))))

那么,它的工作原理是什么呢?

运行上述代码,打开一个新org-mode文件并调用 M-x save-chromium-session 。它会创建类似这样的东西:

也就是任何在 chromium 实例中运行着的URL. 要还原的话, 则将光标置于所需日期上然后运行 M-x restore-chromium-session. 所有标签都应该恢复了。

以下是我的使用案例,其中的数据是随机生成的:

#+TITLE: Browser sessions

* [2019-12-01 23:15:00]...
* [2019-12-02 18:10:20]...
* [2019-12-03 19:00:12]
- https://www.reddit.com/r/emacs/comments/...
- https://www.reddit.com/r/Clojure
- https://news.ycombinator.com

* [2019-12-04 12:14:02]
- https://www.reddit.com/r/emacs/comments/...
- https://www.reddit.com/r/Clojure
- https://news.ycombinator.com

请注意,用于读取Chromium会话的方法并不完美: strings 将从二进制数据库中读取任何类似URL字符串的内容,有时这将产生不完整的url。不过,您可以很方便地地编辑它们,从而保持会话文件简洁。

为了真正打开标签,elisp代码中使用到了browse-url,它可以通过 browse-url-browser-function 变量进一步定制成运行Chromium, Firefox或任何其他浏览器。请务必阅读该变量的相关文档。

别忘了把会话文件放在git、mercurial或svn中,这样你就再也不会丢失会话历史记录了 :)

那么Firefox呢?

如果您正在使用Firefox(最近的版本),并且想要获取会话url,下面是操作方法。

首先,下载并编译lz4json,这是一个可以解压缩Mozilla lz4json格式的小工具,Firefox以这种格式来存储会话数据。会话数据(在撰写本文时)存储在 $HOME/.mozilla/firefox/<unique-name>/sessionstore-backup /recovery.jsonlz4 中。

如果Firefox没有运行, 则没有 recovery.jsonlz4, 这种情况下用 previous.jsonlz4 代替. =恢复。jsonlz4=将不存在,但使用=先前。jsonlz4 =。

要提取网址,尝试在终端运行:

$ lz4jsoncat recovery.jsonlz4 | grep -oP '"(http.+?)"' | sed 's/"//g' | sort | uniq

然后更新 save-chromium-session 为:

(defun save-chromium-session ()
  "Reads chromium current session and converts it to org-mode chunk."
  (interactive)
  (save-excursion
    (let* ((path "~/.mozilla/firefox/<unique-name>/sessionstore-backups/recovery.jsonlz4")
           (cmd (concat "lz4jsoncat " path " | grep -oP '\"(http.+?)\"' | sed 's/\"//g' | sort | uniq"))
(ret (shell-command-to-string cmd)))
...
;; rest of the code is unchanged

更新本函数的文档字符串、函数名以及进一步的重构都留作练习。