weblog of key_amb

主にIT関連の技術メモ

enhancd を改修して "cd -" や "cd .." の挙動を変えずに使えるようにした

Bash で enhancd を導入することにした

cd の履歴を peco で移動したい。

シェル環境で peco を使いだした人なら、きっとそう思うことがあるでしょう。

zsh だと、cdr と組み合わせることで実現できます*1
下の記事あたりを参考に設定するといいでしょう。

さて、bash の場合、最近は b4b4r07/enhancd を使う人が多いのではないかなと思います。
いくつか作者の @b4b4r07 さんが記事を書いてます。

この enhancd は Bash の小枝集 で紹介されている cdhist.sh をベースに作られたそうです。zsh と fish にも対応しているそうです。
自分も一瞬、何か自作しようかと思ったのですが、enhancd が便利そうだったので、まずは使ってみることにしました。

使い方は README の通りですが、ソースを clone して . init.sh するだけです。
これで cd が enhancd の関数に alias されます。

色々機能がありますが、詳しくは上に挙げた Qiita の記事がわかりやすいだろうと思います。

とりあえず、自分にとって最低限必要だったのは cd - で cd の履歴を検索して移動できるようになることだけでした。
他に、 cd .. すると peco が起動してディレクトリを上方検索してくれました。

Pull Request に至る経緯と改修後の enhancd の設定方法

最初「おぉ。これは便利」と思って使っていたのですが、しばらく経ってから cd -cd .. を打つと、以前の挙動と違って peco の選択画面になるので、戸惑うことに気づきました。
慣れようと思ったこともありましたが、無理でした。

元々、それ以前に peco を使う機能にはキーボード・ショートカットを割り当てることにしていた*2ので、そちらに寄せたいと思いました。
また、以前は運用エンジニアとして色んなサーバに出入りしていたこともあって、あまりデフォルトの挙動を変えたくないという気持ちもありました。

というわけで、 cd -cd .. のデフォルトの挙動を変えずに、ディレクトリの履歴検索や上方検索を別の特別な引数に割り当てられるようにする Pull Request を送りました。

この PR を送ったのは2ヶ月ほど前のことでしたが、一昨日ようやくマージしてもらえました。

~/.bashrc の設定例は次のようになります。

ENHANCD_HYPHEN_ARG="-ls"
ENHANCD_DOT_ARG="-up"
. path/to/enhancd/init.sh
bind -x '"\C-ur": cd -ls'

ENHANCD_HYPHEN_ARGENHANCD_DOT_ARG が追加した設定用の変数です。

上のように設定すると、 cd -lsディレクトリの履歴検索、 cd -up で上方検索が可能になります。
また、 cd -, cd .. がデフォルトの挙動($OLDPWD, .. への移動)に戻ります。

キーボード・ショートカットとしては履歴検索に Ctrl-u + r を割り当てました。
cd -up には割り当てていませんが、覚えていれば問題ないです。たまに便利。

結びに

bash 環境に enhancd を導入し、 cd -, cd .. の挙動を変えずに使える機能拡張をしました。

enhancd をご利用の方や、これから利用される方の参考となれば幸いです。

余談

もう1つ enhancd による cd の挙動変更でときどき戸惑うのは、 cd 単体で実行したときです。
enhancd ではこのときもディレクトリ履歴検索による選択画面になります。

これはとりあえず諦めて受け入れることにしたのですが、今回紹介した変更のように、デフォルトの挙動を変更しないオプションがあってもいいかもしれません。

※追記:こちらについてもパッチを送って、デフォルトの挙動を変更しないオプションをサポートしてもらいました。

参考

See Also

脚注