cdの履歴を保存してpecoとかfzfとか使ってディレクトリ移動する


こんな感じ

何をしているか

  • auto_cdでも普通のcdでも、ディレクトリ移動時にそのディレクトリのログを溜め込む
  • 引数なしでEnterを押せば、ログをもとに選択的インターフェイスで移動先をサジェスト
  • 普通のcdみたいにも使える

上のgifでは、fzfを使用しています。また、powered_cdcにエイリアスしています。
ログについては、同じディレクトリは二つ以上溜めないようになっていて、新しい順からサジェストされるためあまり無駄はないと思います。

コード

以下を.zshrcとかにコピペしてもらえば動くと思います。

.zshrc
function chpwd() {
  powered_cd_add_log
}

function powered_cd_add_log() {
  local i=0
  cat ~/.powered_cd.log | while read line; do
    (( i++ ))
    if [ i = 30 ]; then
      sed -i -e "30,30d" ~/.powered_cd.log
    elif [ "$line" = "$PWD" ]; then
      sed -i -e "${i},${i}d" ~/.powered_cd.log 
    fi
  done
  echo "$PWD" >> ~/.powered_cd.log
}

function powered_cd() {
  if [ $# = 0 ]; then
    cd $(gtac ~/.powered_cd.log | fzf)
  elif [ $# = 1 ]; then
    cd $1
  else
    echo "powered_cd: too many arguments"
  fi
}

_powered_cd() {
  _files -/
}

compdef _powered_cd powered_cd

[ -e ~/.powered_cd.log ] || touch ~/.powered_cd.log

fzfのところは使っているもの(pecoとかpercolとか)に変えてください。
あとgtacってのはtacのGNU版で、OS Xにはデフォルトでgtacが入っているのでgtacにしています。他のOSの方はtacにしてください。

あとcとか短いコマンドにエイリアスすると便利です(というか必須)

.zshrc
alias c="powered_cd"

また,もともとは

こちらの記事にフィーチャーされたものです。リンク先のenhancdの方がこの記事のものより高機能です。ですが、zshユーザーなら誰でも使っているであろうauto_cdにログ追加が反応しなかったり、cd -を打つのは少し面倒(もちろんpowered_cdの方が打つのはめんどくさいですがエイリアスでなんとかできる)なので 1 このコマンドを作りました。


  1. enhancdも`alias c="__enhancd::cd -"でコマンドのタイプ数削減は可能です