|
|
51CTO旗下网站
|
|
移动端

通过Org模式管理Chromium和Firefox会话

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

作者:Sanel Z来源:Linux中国|2020-02-24 21:46

通过Org模式管理Chromium和Firefox会话

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

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

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

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

  1. (require 'cl-lib)
  2.  
  3. (defun save-chromium-session ()
  4. "Reads chromium current session and generate org-mode heading with items."
  5. (interactive)
  6. (save-excursion
  7. (let* ((cmd "strings ~/'.config/chromium/Default/Current Session' | 'grep' -E '^https?://' | sort | uniq")
  8. (ret (shell-command-to-string cmd)))
  9. (insert
  10. (concat
  11. "* "
  12. (format-time-string "[%Y-%m-%d %H:%M:%S]")
  13. "\n"
  14. (mapconcat 'identity
  15. (cl-reduce (lambda (lst x)
  16. (if (and x (not (string= "" x)))
  17. (cons (concat " - " x) lst)
  18. lst))
  19. (split-string ret "\n")
  20. :initial-value (list))
  21. "\n"))))))
  22.  
  23. (defun restore-chromium-session ()
  24. "Restore session, by openning each link in list with (browse-url).
  25. Make sure to put cursor on date heading that contains list of urls."
  26. (interactive)
  27. (save-excursion
  28. (beginning-of-line)
  29. (when (looking-at "^\\*")
  30. (forward-line 1)
  31. (while (looking-at "^[ ]+-[ ]+\\(http.?+\\)$")
  32. (let* ((ln (thing-at-point 'line t))
  33. (ln (replace-regexp-in-string "^[ ]+-[ ]+" "" ln))
  34. (ln (replace-regexp-in-string "\n" "" ln)))
  35. (browse-url ln))
  36. (forward-line 1)))))

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

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

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

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

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

  1. #+TITLE: Browser sessions
  2.  
  3. * [2019-12-01 23:15:00]...
  4. * [2019-12-02 18:10:20]...
  5. * [2019-12-03 19:00:12]
  6. - https://www.reddit.com/r/emacs/comments/...
  7. - https://www.reddit.com/r/Clojure
  8. - https://news.ycombinator.com
  9.  
  10. * [2019-12-04 12:14:02]
  11. - https://www.reddit.com/r/emacs/comments/...
  12. - https://www.reddit.com/r/Clojure
  13. - 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. (defun save-chromium-session ()
  2. "Reads chromium current session and converts it to org-mode chunk."
  3. (interactive)
  4. (save-excursion
  5. (let* ((path "~/.mozilla/firefox/<unique-name>/sessionstore-backups/recovery.jsonlz4")
  6. (cmd (concat "lz4jsoncat " path " | grep -oP '\"(http.+?)\"' | sed 's/\"//g' | sort | uniq"))
  7. (ret (shell-command-to-string cmd)))
  8. ...
  9. ;; rest of the code is unchanged

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

【编辑推荐】

  1. Firefox和Google浏览器最新隐私保护功能带来了新的风险
  2. 微软全新Chromium版Edge浏览器正式版发布
  3. 性能测试:Firefox 73 vs Chrome 80
  4. Firefox 73为开发者带来的亮点一览
  5. 同为 Chromium 浏览器,Microsoft Edge 却被谷歌“特别关照”
【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

消息队列Kafka运维实践攻略

消息队列Kafka运维实践攻略

入门级消息队列
共3章 | 独行侠梦

45人订阅学习

编程零基础,Scratch 开发小游戏

编程零基础,Scratch 开发小游戏

游戏化编程
共5章 | googlingman

22人订阅学习

Docker一键部署,3小时学以致用

Docker一键部署,3小时学以致用

Docker学以致用
共3章 | jextop

103人订阅学习

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微