fish

[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されてもねぇ?
他の長い処理はデフォルト設定のままですね。