ターミナルでchromeの履歴をインクリメンタルサーチして開く


はじめに

Chromeで過去に訪問したことがあるページを開きたい時、アドレスバーにURLの一部を入力して表示される候補から開くことありませんか?
私はgithubで特定のリポジトリのページを開きたい時や開発中の画面を開く時によく上記操作をします。

Chromeのアドレスバーも保管してくれますが、候補が少ししか出てこなかったり、キーワード検索と混じったりで使い勝手が悪いと感じていました。

このストレスから解放される方法をずっと考えていたのですが、ターミナルを使って履歴を検索してChromeで開くコマンドができたので紹介します。

コマンドのイメージ

文章だけではわかりづらいですが、↓のようなイメージです。

  1. ターミナルでchと入力
  2. urlの一部を入力。スペース区切りで複数キーワード入れることもできます。検索の仕様はpecoのホームページを参照(https://github.com/peco/peco)
  3. 該当するURLにカーソルを合わせてreturn。カーソル移動はcontrol+n(下), control+p(上)、または矢印キーです。
  4. Chromeで該当画面が開く

コマンドの作り方

環境準備

下記の環境で作成・動作しました。

OS

macOS Mojave(10.14.5)

sqlite3

3.24.0
Chromeの履歴がsqlite形式で保存されているので履歴の読み取りで使います。
macOSであれば最初からインストールされています。

peco

履歴をインクリメンタルサーチするときに使います。
他にも色々活用できる素晴らしいコメンドなのでぜひ入れておきましょう。
下記ページを参考にインストールしておきましょう。
https://github.com/peco/peco

Chrome

75.0.3770.142

コマンド

コマンドは下記の通り。コマンド名はch.bashrcに記述しました。

.bashrc
function ch {
  # Chromeの履歴ファイル(sqlite形式)をそのまま使ったらlockされていてエラーになったので/tmpにコピー
  # たぶんChromeがLockしているんだろう
  cp -p $HOME/Library/Application\ Support/Google/Chrome/Default/History /tmp/chrome_history
  # sqliteを使ってURL履歴を取得してpecoに流す
  # pecoでインクリメンタルサーチした結果をcに格納
  local c="$(sqlite3 /tmp/chrome_history 'select url from urls' | peco)"
  if [ -n "$c" ]; then
    # 対象urlが選択されている場合、Chromeで開く
    open -a '/Applications/Google Chrome.app' "$c"
  fi
}

最後に

URL履歴の候補にfile://...chrome-extension:など余計なものが出てきて邪魔なのでsqlを改修するなど改善の余地はありそう。
あと無邪気に全履歴をselectしているけどChromeの履歴ってどれくらいたまるんだろうか。数が多いとノイズも多くなるので何らかの条件で絞れると良さそう。
まあこのへんは使っていく中で改善していきたいと思います。