JSL (日本システム技研) Advent Calendar 2018 - Qiita の12日目の記事です。
モチベーション
- Chromeの履歴が見辛いのでいい感じに表示したい
- 履歴を見やすくするプラグインはいくつかあるが、ターミナルから「履歴閲覧→開く」ができるとシームレスにWebブラウジングに移れそう
なので今回は、sqliteを使ってユーザのローカルに保存してある履歴ファイルを閲覧 + fzfを使ってインクリメンタルサーチ するコマンドを実現するための方法を書く。
最終的にやったこと
fzfの公式サンプルに載ってた。
サンプルに沿って、パスの通った場所に以下のようなコマンドを置きました。名前はChromeHistoryで ch
としました。
#!/usr/bin/env zsh
ch() {
local cols sep google_history open
cols=$(( COLUMNS / 3 ))
sep='{::}'
if [ "$(uname)" = "Darwin" ]; then
google_history="$HOME/Library/Application Support/Google/Chrome/Default/History"
open=open
else
google_history="$HOME/.config/google-chrome/Default/History"
open=xdg-open
fi
cp -f "$google_history" /tmp/h
sqlite3 -separator $sep /tmp/h \
"select substr(title, 1, $cols), url
from urls order by last_visit_time desc" |
awk -F $sep '{printf "%-'$cols's \x1b[36m%s\x1b[m\n", $1, $2}' |
fzf --ansi --multi --preview-window down:1 | sed 's#.*\(https*://\)#\1#' | xargs $open > /dev/null 2> /dev/null
}
ch $@
以下のように動作する。
解説
以下簡単な解説。
fzf
fzfはターミナル上であいまい検索を実現するコマンドです。
junegunn/fzf: A command-line fuzzy finder
簡単な使い方としては以下のように標準出力をパイプを通してfzfに渡すとあいまい検索をしてくれる。
$ find . | fzf
セットアップ時によく使うコマンドをキーバインドとして提供してくれるのが便利。
junegunn/fzf: A command-line fuzzy finder#key-bindings-for-command-line
CTRL + R
でhistoryコマンドの実行結果をfzfに渡したコマンドを実行してくれるし、 CTRL + T
でカレンドティレクトリ以下のファイルとディレクトリを検索した結果をfzfに渡したコマンドを実行してくれる。
また、fzfで選択した結果は更に標準出力されるのでパイプや xargs
を使えばその用途が多岐に渡るのが想像できると思う。
例えば、プロセスIDの検索結果を kill
コマンドに渡してあげるとか、gitブランチの検索結果をgit checkoutに渡してあげるとか、そういった用途に便利に使うことができる。
以下の記事がとてもわかり易いです。
fzf(fuzzy finder)の便利な使い方をREADME, Wikiを読んで学ぶ - もた日記
類似のツールには peco
というものがありますが、どちらも実現できることを一緒なので好きな方を使えばいいと思う。両者ともに日本語の知見は豊富。
Chromeの履歴ファイルの場所
執筆時のChromeのバージョンは以下。
- バージョン: 70.0.3538.110(Official Build) (64 ビット)
Chromeの履歴を見る方法は3つぐらいあって、
CMD + Y
- Chromeの検索バーに
chrome://history
と入力する - 右上の三点リータのボタンから履歴 > 履歴
1が最も簡単だと思う。
ただこの履歴ページ、日付検索ができないという欠陥がありとても不便である。
まともに履歴を見ようとするならば、
- Chromeのプラグインを入れる このへんとか Chrome Better History - Chrome ウェブストア
- 履歴ファイルはローカルに保存されているので、sqliteで読む Chromeの閲覧履歴を取得する。 - mirandora.commirandora.com
のようにハックをすると便利。
OS Xの場合履歴ファイルの場所が以下となる。
$HOME/Library/Application Support/Google/Chrome/Default/History
公式サンプルではコマンド実行の都度、 /tmp/
に履歴ファイルをコピーしsqliteで読む→awkで整形→fzfで検索 のような流れとなっている。
まとめ
fzfを使ってChromeの履歴をインクリメンタルサーチできるコマンドを定義しました。
やはりCUIからなんでもできるのは便利です。
GUIでなくCUIを使うメリットはCUIだからとしか言えないのですが、今後も不便だと感じるところについては効率化していきたいですね。