fish shell cdしたらlsしたい

確認環境

$ fish --version
fish, version 2.7.1

結論

設定ファイル(例えば~/.config/fish/config.fish)に、以下を追記する。

functions --copy cd standard_cd

function cd
  standard_cd $argv; and ls
end

説明

fish shellには2つのcdが存在する。ひとつはビルトインのcd。もうひとつは、ビルトインのcdをラップした、関数のcd。関数のcdは、おもに過去のディレクトリへの移動機能が加わっている。cd -など。

普通にcdすると、関数のほうが呼ばれる。

今回の変更では、関数のcdをさらにラップし、実行後にlsを行うようにした。

調査メモ

ググってみる。以下の2つの記事が、具体例付きで参考になりそう。

前者は、追記するコードが長い。長いということは、内容を把握するのに時間がかかる。そして自分の理解が間違っていないか不安になる。デフォルト設定に加え、lsを加えた関数を定義しているとのこと。元ネタのデフォルト設定はどこにあるんだろう?またこれだと、デフォルト設定のほうが改良されても、自動で反映されないのでは?(記事を書いてくれた方、ネガティブなことばかり書いてごめんなさい)

後者は短い。ぱっと見、自分のやりたいことにマッチしているように見える。これにしようかな? しかし、試してみると、cd - が機能しない。 というか、cd -のほかにもfish cdならではの便利機能があって、見落としてるとかはないか?その便利機能が、上記のデフォルト設定な気もする。

fishのいい感じの配慮を活かしつつ、lsを追加したい。 かつ、長い設定を書きたくない。だからfishを使ってるんです。

cd -が効かない件についてググってみる。

https://github.com/fish-shell/fish-shell/issues/4869 このisssueだ。

知りたいことは以下のコメントにすべて書いてあった。ありがとうkrader1961さん。

dirh, prevd, and nextd do not work as usual after `builtin cd` · Issue #4869 · fish-shell/fish-shell · GitHub

このコメントの方法に従うと、cd -も行ける。

コメントによると、fishでは、builtin cd をラップするfunction cdを用意しているらしい。その関数のおかけでcd -が機能するとのこと。 以下、man cdからの抜粋。

Fish also ships a wrapper function around the builtin cd that understands cd - as changing to the previous directory. See also prevd. This wrapper function maintains a history of the 25 most recently visited directories in the $dirprev and $dirnext global variables. If you make those universal variables your cd history is shared among all fish instances.

上のGithubのコメントによると、type cdで関数のファイルの場所と処理内容が確認可能とのこと。 関数での処理内容はざっと見た感じ、移動履歴の管理関係。 引数の個数による例外処理、サブシェル時はビルトインcdを起動する、 cd -で前のディレクトリへ戻る(しかも戻って戻るともとにもどる)、 戻るじゃないときは履歴に追加(cdhなどで移動できる)、など。

上で参考にした、[fish-shell] ご注文はcdしたら自動でlsですか?で言うデフォルト設定とは、function cdの処理内容の模様。

調査まとめ

追加調査メモ

builtin cdだとcdhに記憶されない。cd - も効かない。確認してみる。

Welcome to fish, the friendly interactive shell
~ $ cdh
No previous directories to select. You have to cd at least once.
~ $ builtin cd ~/Documents/work/
~/D/work $ cd -
Hit end of history…
~/D/work $ cdh
No previous directories to select. You have to cd at least once.

function cdだと履歴が記録される。cd -でひとつ前にもどれる。確認してみる。

Welcome to fish, the friendly interactive shell
~ $ cdh
No previous directories to select. You have to cd at least once.
~ $ cd Documents/
~/Documents $ cd ~/Downloads/
~/Downloads $ cdh
 b  2)  ~
 a  1)  ~/Documents
Select directory by letter or number:
~/Downloads $ cd -
~/Documents $

以上