我是会话管理器 的铁粉,它是 Chrome 和 Chromium 的小插件,可以保存所有打开的选项卡,为会话命名,并在需要时恢复会话。
它非常有用,特别是如果你像我一样,白天的时候需要在多个“思维活动”之间切换——研究、开发或者阅读新闻。或者你只是单纯地希望记住几天前的工作流(和选项卡)。
在我决定放弃 chromium 上除了 uBlock Origin 之外的所有扩展后,就必须寻找一些替代品了。我的主要目标是使之与浏览器无关,同时会话链接必须保存在文本文件中,这样我就可以享受所有纯文本的好处了。还有什么比 org 模式 更好呢 ;)
很久以前我就发现了这个小诀窍:通过命令行获取当前在谷歌 Chrome 中打开的标签 再加上些 elisp 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 (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 模式文件并调用 M-x save-chromium-session
。它会创建类似这样的东西:
1 2 3 4 * [2019 -12 -04 12 :14 :02 ] - https:// www.reddit.com/r/ emacs/comments/ ... - https:// www.reddit.com/r/ Clojure - https:// news.ycombinator.com
也就是任何在 chromium 实例中运行着的 URL。要还原的话,则将光标置于所需日期上然后运行 M-x restore-chromium-session
。所有标签都应该恢复了。
以下是我的使用案例,其中的数据是随机生成的:
1 2 3 4 5 6 7 8 9 10 11 12 13 * [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
代替。
要提取网址,尝试在终端运行:
1 $ lz4jsoncat recovery.jsonlz4 | grep -oP '"(http.+?)"' | sed 's/"//g' | sort | uniq
然后更新 save-chromium-session
为:
1 2 3 4 5 6 7 8 9 (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))) ...
更新本函数的文档字符串、函数名以及进一步的重构都留作练习。
via: https://acidwords.com/posts/2019-12-04-handle-chromium-and-firefox-sessions-with-org-mode.html
作者:Sanel Z 选题:lujun9972 译者:lujun9972 校对:wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出