LoginSignup
14
12

More than 1 year has passed since last update.

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

Last updated at Posted at 2016-07-22

こんな感じ

powered_cd.gif

###何をしているか

  • 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 -"でコマンドのタイプ数削減は可能です。すみません

14
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12