LoginSignup
1
0

More than 3 years have passed since last update.

zsh環境でfzfを使ってディレクトリの移動履歴を簡単に辿れるようにする

Last updated at Posted at 2021-01-03

最初に

ディレクトリの移動履歴をfuzzy finederのfzfを使って、簡単に辿れるようにします。
また、起動にはショートカットコマンドのcontrol + tを使って、移動履歴の一覧を辿れるようにします。

環境

下記の環境で設定しています。
macにデフォルトで入っているzshで動くかはわかりません。古いとは思いますが、別に関係ないかしらん?

  • macOS 11.1
    • intelマシンで試しています。
    • m1マシンでは今のところ利用する予定がないので、まだ試していません。
  • zshのバージョンはこちら → zsh 5.8 (x86_64-apple-darwin20.1.0)
    • brewでinstallしたzsh環境で設定しています。

fzfのインストール

インストール方法はいくかあるようですが、私はもっぱらgit cloneでインストールしたいタイプです。

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

いくつかCLI上で聞かれると思いますが、全てyで打っています。

fzf installation(参考ドキュメント)

fzf側でディレクトリの移動履歴を辿れるようにする

これを実現するために、素晴らしいコードを記載してくれている方がQiitaにいらっしゃいました。
https://qiita.com/arks22/items/8515a7f4eab37cfbfb17#%E3%82%B3%E3%83%BC%E3%83%89

私はこのコードを参考に、中身を少し改造させて利用させていただいています。
具体的には

  • 保存するディレクトリ移動履歴の記録容量を増やした。
    • 99では足りないかもしれないので、必要に応じてもっと増やすかも。
  • 引数は利用しないので、引数ありのパターンを削除した。
  • 履歴を出力する際にgtacではなく、tail -rを使うようにしている。
  • powered_cd -> powered_cd_2 に名称変更。これはまあなんとなくです。powered_cdを改造する前の状態でも利用できる余地を残しておきたくて、一応名称を変えています。
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 = 99 ]; then
      sed -i -e "99,99d" ~/.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_2() {
  if [ $# = 0 ]; then
    cd $(tail -r ~/.powered_cd.log | fzf)
  else
    echo "powered_cd_2: This command does not accept any arguments."
  fi
}

_powered_cd() {
  _files -/
}

compdef _powered_cd powered_cd

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

本家のコードは上記URLよりご確認ください。また、上記の記事内で紹介されている enhancd も便利そうです。
(私自身はなるべく普段使っている fzf で全てまかないたい気分でしたので、このやり方でやっています。)

ショートカットコマンドで起動できるようにする

zshでショートカットを設定するには関数を作成して設定するのが楽だと思います。
(というか、関数を作成して設定する以外のやり方は調べていません。)

ショートカットキーの設定については、下記の記述がかなりシンプルなものになるかと思うので、zshでショートカットキーの設定を行う際には下記の中身を書き換えれば、楽に設定できそうかと思います。

# run powered_cd with shortcut ^t
function run_powered_cd_2() {
  echo "run powered_cd_2";
  powered_cd_2;
  zle reset-prompt;
  zle redisplay
}
zle -N run_powered_cd_2
bindkey '^t' run_powered_cd_2

内容自体は何となく文言から読み取れるかと思いますが、一応の自分用メモとして一部挙動に関するメモを残しておきます。

  • zle reset-promptをつけないと実行後のプロンプトが表示されない
    • 履歴リストからの移動を実行した際に、ちゃんと移動したことがわかるような挙動になります。
    • (これをつけないと、関数実行後のディレクトリがプロンプトに反映されません)
  • zle redisplayで実行後の画面リフレッシュを実施
    • 実行したあとにプロンプトの画面リフレッシュを行うためにつけています。

最後に

設定はこれで以上となります。
使い始めてまだ1~2日ですが、使用感も良く満足です。

1
0
0

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
1
0