Posted at

[fish-shell] ご注文はcdしたら自動でlsですか?

More than 1 year has passed since last update.

fish-shell始めて2日目です。

いきなり躓いたので、ちょっと書いとこうと。

fishさん、基本的にはaliasさえ設定すれば、他は何もしなくてもいいぐらい出来のいいシェルっぽいです。

あまり深くは知らないんですけど。。。

でも、一点だけアレだったのでスクリプト書きました。

cdしたらlsしたいですよね。

あれ?もうcdしたらlsする手癖が付いてる?

そういうのは、自動化しましょ。ね?

で、alias cd = "my_cd; and ls"ってやってみたものの何故か移動してくれない。

でもlsはちゃんと移動後のパスでやってくれてる。

なんでだーーー!!!ってなったんですが、関数作ってやればいいんですね。

気付くまで結構時間かかりました(´・_・`)


config.fish

function cd

if test (count $argv) -eq 0
return 0
else if test (count $argv) -gt 1
printf "%s\n" (_ "Too many args for cd command")
return 1
end
# Avoid set completions.
set -l previous $PWD

if test "$argv" = "-"
if test "$__fish_cd_direction" = "next"
nextd
else
prevd
end
return $status
end
builtin cd $argv
set -l cd_status $status
# Log history
if test $cd_status -eq 0 -a "$PWD" != "$previous"
set -q dirprev[$MAX_DIR_HIST]
and set -e dirprev[1]
set -g dirprev $dirprev $previous
set -e dirnext
set -g __fish_cd_direction prev
end

if test $cd_status -ne 0
return 1
end
ls
return $status
end


bashだとbuiltinコマンドは、\cdって書いてたんですが、

builtin cdだと見直した時に分かり易いですね。

さすがfishさん

追加でこんな仕様にしてます。

1. 引数が0の時にホームディレクトリに行っちゃうのが嫌だったので、なにもせず正常終了する。

2. 存在しないディレクトリを指定してcdに失敗したら、lsは実行せず異常終了する。

移動に失敗したのに、lsされてもねぇ?

他の長い処理はデフォルト設定のままですね。