確認環境
$ 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さん。
このコメントの方法に従うと、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の処理内容の模様。
調査まとめ
[fish-shell] ご注文はcdしたら自動でlsですか? fishのバージョンアップでfunction cdの処理内容が乖離する懸念がある。げんに、自分の環境とは差異があった。細かな差異に加え、サブシェルでは履歴に残さない処理がQiitaのほうには無い。
How to list files when changing directory with fish shell ラッパー関数がやってくれてる便利機能が使われない。具体的には、HOMEディレクトリに移動することを期待して、引数なしで
cd
すると、エラーになる。cd -
が機能しない。dirh
、prevd
、 およびnextd
が機能しない。dirh, prevd, and nextd do not work as usual after `builtin cd` · Issue #4869 · fish-shell/fish-shell · GitHub ラッパー関数を活かせる。更新にも追随できる。ありがとうkrader1961さん。
追加調査メモ
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 $
以上