场景
在 emacs 中记笔记时,获取 firefox 正在浏览的页面链接和网页标题。
此前的做法
方法1:手动复制网页链接和标题,通过 org-insert-link
插入
方法2:复制网页链接,通过脚本访问该页面并获取相应的标题,参考这个
上面两个方法的缺点是无论如何都要离开一次 emacs。
新的思路:通过 recovery.jsonlz4
获取 url 和标题
firefox 会记录浏览过的页面信息并将其保存在 recovery.jsonlz4
这个文件中,可以通过 shell 脚本对其进行解析获取当前正在浏览的页面信息,然后在 emacs 通过 shell-command-to-string
获取结果。
需要依赖两个外部工具:lz4json
和 jq
。前者用来解压 firefox 的文件,后者用来解析 json 文件。
elisp 代码:
(defcustom FIREFOX-RECOVER-FILE ".mozilla/firefox/[your-profile]/sessionstore-backups/recovery.jsonlz4"
"current active firefox profile recovery.jsonlz4 file location")
(defcustom FIREFOX-GET-TAB-URL-CMD "lz4jsoncat %s | jq -r '.windows[%d].tabs[%d].entries[-1].url'"
"shell command template to get current active tab url")
(defcustom FIREFOX-GET-TAB-TITLE-CMD "lz4jsoncat %s | jq -r '.windows[%d].tabs[%d].entries[-1].title'"
"shell command template to get current active tab title")
(defun +string-trim-final-newline (string)
(let ((len (length string)))
(cond
((and (> len 0) (eql (aref string (- len 1)) ?\n))
(substring string 0 (- len 1)))
(t string))))
(defun +shell-command-to-string-no-newline (cmd)
(+string-trim-final-newline (shell-command-to-string cmd)))
(defun +get-current-active-firefox-tab-org-link ()
(interactive)
(let* ((selected-window (string-to-number (shell-command-to-string (format "lz4jsoncat %s| jq '.selectedWindow'" FIREFOX-RECOVER-FILE))))
(selected-tab (string-to-number (shell-command-to-string (format "lz4jsoncat %s| jq '.windows[%d].selected'" FIREFOX-RECOVER-FILE (- selected-window 1)))))
(url (+shell-command-to-string-no-newline (format FIREFOX-GET-TAB-URL-CMD FIREFOX-RECOVER-FILE (- selected-window 1) (- selected-tab 1) )))
(title (+shell-command-to-string-no-newline (format FIREFOX-GET-TAB-TITLE-CMD FIREFOX-RECOVER-FILE (- selected-window 1) (- selected-tab 1)))))
(insert (format "[[%s][%s]]" url title))))
新思路的缺点
firefox 并不是即时同步这个文件,在切换 tab 之后会有大约十几秒钟的延迟,所以会有一段时间得到的是错误的 tab 页。