fish shell と percol で良く利用するディレクトリに飛ぶ

なんとなく fish に移ってみました。

これまでよく使うディレクトリに移動するために zsh + autojump で j として使っていたのですが、 fish のタブ補完では j 入力後にどんな候補があるのか補完してもらえず どうしたものか考えていました。

コマンド履歴の補完は mooz さんの percol

mooz/percol https://github.com/mooz/percol

を使って

bpinto/oh-my-fish https://github.com/bpinto/oh-my-fish

の中にあった percol_select_history を利用することにしました。

じゃあということで fish で percol を使って 良く利用するディレクトリに飛べるよう function を作ってみました。

zsh 用は

percol で z / autojump のようにディレクトリ高速ジャンプ - Slip Ahead Logging http://stillpedant.hatenablog.com/entry/percol-cd-history

にありますのでこれを fish 用に改造して

set CD_HISTORY_FILE $HOME/.cd_history_file # cd 履歴の記録先ファイル
# percol を使って cd 履歴の中からディレクトリを選択
# 過去の訪問回数が多いほど選択候補の上に来る
function percol_cd_history
  sort $CD_HISTORY_FILE | uniq -c | sort -r | sed -e 's/^[ ]*[0-9]*[ ]*//' | percol | read -l percolCDhistory
  if [ $percolCDhistory ]
    # commandline 'cd '
    # commandline -i $percolCDhistory
    echo 'cd' $percolCDhistory
    cd $percolCDhistory
    echo $percolCDhistory
    commandline -f repaint
  else
    commandline ''
  end
end

# キーバインドの追加 ############################################
function fish_user_key_bindings
  bind \cx percol_cd_history
  # 以下他のキーバインド
end

加えて cd 系のコマンドで return する前に

echo $PWD >> $CD_HISTORY_FILE # percol_cd_history 用

してやると、ひとまずやりたいことが出来るようになりました。

cd コマンド実行時に移動先のパスを $CD_HISTORY_FILE へ書き出して保存しています。 cd した後に ls してほしいので

commandline -f repaint

が無いとキーバインドから実行した場合に画面が止まるようでした。

また、上の function では percol で選択するとすぐに cd していますが、 if 文の中のコメントアウトを逆にすると 入力だけしてくれて cd を実行するにはエンターが必要なように変わります。 履歴から補完して入力後に編集する機会が多いのであれば こちらを利用した方が便利なように思います。

    commandline 'cd '
    commandline -i $percolCDhistory
    # echo 'cd' $percolCDhistory
    # cd $percolCDhistory
    # echo $percolCDhistory
    # commandline -f repaint