最初に
ディレクトリの移動履歴を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日ですが、使用感も良く満足です。