fishシェルのディレクトリ移動履歴管理はとても簡単

「bashからfishへ乗り換えました」の第2回になります。 fishシェルを使うと ディレクトリの移動履歴管理がとても簡単になります、という話。

fishシェルではbuild-inコマンドで cd コマンドを使ったディレクトリ移動履歴を簡単に管理できます。

bashシェルでは

bashシェルでも pushd コマンド、 popd コマンド、 dirs コマンドを使うと、移動したディレクトリの履歴を管理できます。

# サンプル用ディレクトリ(~/tmp、~/tmp2)の作製
$ mkdir tmp
$ mkdir tmp2
# ~/tmp に pushd で移動
$ pushd tmp
~/tmp ~
# カレントディレクトリの確認
$pwd
/Users/goroyanagi/tmp
# ~/tmp2 に pushd で移動
$ pushd ~/tmp2/
~/tmp2 ~/tmp ~
# カレントディレクトリの確認
$pwd
/Users/goroyanagi/tmp2
# ディレクトリ移動履歴の確認
$ dirs
~/tmp2 ~/tmp ~
# ひとつ前のディレクトリに移動
$ popd
~/tmp ~
# カレントディレクトリの確認
$ pwd
/Users/goroyanagi/tmp
# もうひとつ前のディレクトリに移動
$ popd
~
# カレントディレクトリの確認
$ pwd
/Users/goroyanagi

ディレクトリの移動履歴を管理する、という目的は達成出来るのですが、いくつか問題があります。

問題1) cd コマンドで移動した履歴が記録されない

通常、ディレクトリを移動するのに使うコマンドは cd コマンドです。しかし、困ったことに cd コマンドで移動した場合、履歴が記録されません。したがって popd コマンドで戻ることもできません。 ディレクトリの移動履歴を管理したい場合はpushd コマンドを使う必要があります。

問題2) 履歴をジャンプできない

先ほどの例で ~ -> tmp -> tmp2 という順に移動しました。この場合、tmp2 から ~popd コマンドで戻ることはできません。

問題3) 前に進めない

popd コマンドで移動した後、もとのディレクトリに戻ることはできません。 つまりtmp2 から ~popd コマンドで戻った後、再び tmp2 に戻るには改めて、 pushd コマンドで移動する必要があります。

さてfishシェルでは

もちろんfishシェルでも同様のコマンドがあります。しかも、もっと便利です。

cd コマンドで移動した履歴を記録する

# サンプル用ディレクトリ(~/tmp、~/tmp2)の作製
❯ mkdir tmp
❯ mkdir tmp2
# ~/tmp に cd で移動
❯ cd tmp
# カレントディレクトリの確認
❯ pwd
/Users/goroyanagi/tmp
# ~/tmp2 に cd で移動
❯ cd ~/tmp2
# カレントディレクトリの確認
❯ pwd
/Users/goroyanagi/tmp2
# ディレクトリ移動履歴の確認
❯ dirh
2) /Users/goroyanagi
1) /Users/goroyanagi/tmp
/Users/goroyanagi/tmp2
# ひとつ前のディレクトリに移動
❯ prevd
# カレントディレクトリの確認
❯ pwd
/Users/goroyanagi/tmp
# ひとつ前のディレクトリに移動
❯ prevd
# カレントディレクトリの確認
❯ pwd
/Users/goroyanagi

cd コマンドで移動したディレクトリが記録されており、 prevd コマンドで戻ることができます。 dirh コマンドはで移動したディレクトリの履歴が確認できます。

履歴をジャンプする

# ディレクトリ移動履歴の確認
❯ dirh
2) /Users/goroyanagi
1) /Users/goroyanagi/tmp
/Users/goroyanagi/tmp2

移動したディレクトリのリストを表示したときに、行頭に番号が表示されています。 prevd コマンドの引数にこの番号を指定すると、そのディレクトリに移動できます。つまり履歴をジャンプできます。

# ディレクトリ移動履歴の確認
❯ dirh
2) /Users/goroyanagi
1) /Users/goroyanagi/tmp
/Users/goroyanagi/tmp2
# /Users/goroyanagi (2つ前のディレクトリ)に移動
❯ prevd 2
# カレントディレクトリの確認
❯ pwd
/Users/goroyanagi
# ディレクトリ移動履歴の確認
❯ dirh
/Users/goroyanagi
1) /Users/goroyanagi/tmp2
2) /Users/goroyanagi/tmp

前に進む

nextd コマンドを使って、 prevd コマンドで戻ったディレクトリを進むことができます。

# /Users/goroyanagi/tmp (2つ先のディレクトリ)に移動
❯ nextd 2
# ディレクトリ移動履歴の確認
❯ dirh
2) /Users/goroyanagi
1) /Users/goroyanagi/tmp
/Users/goroyanagi/tmp2

これで、bashシェルのディレクトリの移動履歴管理で挙げた3つの問題が解消されていることが確認できました。

もっと便利に

fishシェルには高性能なプラグイン管理の仕組み(fisher)があります。fisherを使って以下のプラグインをインストールしてください。

fisherがあれば、以下のコマンドでインストール出来ます。

❯ fisher add jethrokuan/z

インストール後、新たにfishシェルを起動すると z コマンドが使えるようになります。

新たに起動したfishシェルでディレクトリをいくつか移動したあとに、 z コマンドを使ってみてください。

❯ mkdir tmp
❯ mkdir tmp2
❯ cd tmp
❯ cd ../tmp2
❯ z [tab]
…royanagi/tmp …royanagi/tmp2

tab キーを連打すると過去の移動履歴が表示され、移動可能なディレクトリが順にフォーカスされます。 prevd/dirh/nextd コマンドを利用するよりも簡単に移動できますね。


fishシェルは friendly interactive shellの略です。標準の状態でもbashシェルよりも便利です。

プラグインを入れるともっと便利になりますが、fishシェルの面目躍如ですね。