zsh のプロンプト

ちょっとしたキッカケで、zsh のプロンプトをよしなにしたいと考えた。

結果こうしました、と言うお話。;

parse-git-branch()
{
    local branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
    if [ -n "${branch}" ]; then
        [ "${branch}" = "HEAD" ] && local branch=$(git rev-parse --short HEAD 2>/dev/null)
        local statusis="$(git status --porcelain 2>/dev/null)"
        echo -n " on %F{6}${branch}%f"
        [ -n "${statusis}" ] && echo -n "%F{3}*%f"
    fi
}

PROMPT="%F{6}%n%f at %F{6}%m%f in %F{6}%c%f$(parse-git-branch)
%# "

おそらく、こんな感じになるのんではなかろーか、思います。;

出典は、こちら。 ;

» mathiasbynens/dotfiles/.bash_prompt

えぇ、またもや、でございます。氏の dotfiles を参考にごちゃごちゃやっていたら、偶然、こちらの bash の設定を吸ったターミナルを見、「あ、こんなんしたい」と思いまして。

ここで、参考どころか、ほぼパクっております。恥知らず。

色々とキッカケと勉強させていただき、本当に感謝しきりです。

その他、助けて頂いたページもここに挙げておきたいと思います。;



ハマったとこ、2 点ほど、ここにメモさせてください。

エラー = not foundtest、文字列の比較演算子の等価は =

この原因知った時、自分で自分に驚いた。
もうこんなこと二度と嫌なので、あえて自虐的に、ここに恥を晒します。

test コマンドの文字列比較演算子の "等価" は == ではなく =

いつから、== だと覚えた、と言うか、思い込んだのだろう...*1

エラーは、今回のケースですとこんな感じ。;

% parse-git-branch
parse-git-branch:4: = not found

発生個所は、test コマンドの部分。;

[ "${branch}" == "HEAD" ] && local branch=$(git rev-parse --short HEAD 2>/dev/null)

これ間違い。

なお、文字列比較においてパターンへの一致を示す「=」はシェルによっては「==」と記述することもできる場合があるが、基本的に[(test)コマンドでは「==」と記述することはできない。

エラー not valid in this context: → クオートしてやる

もう一つ、ハマったエラーがこちら。 ;

% parse-git-branch
parse-git-branch:local:5: not valid in this context: .vimrc

エラー発生個所は、この部分。 ;

local statusis=$(git status --porcelain 2>/dev/null)

答えは、
コマンド置換の記述部分を "" で囲んでやるといけた。

一応、困っていた時、やったこと。;

% cd dots
% git status --porcelain
 M .vimrc
 M .zshrc

この結果見て、「あぁ、スペース区切りってやつね」と思う。

エラーの文字列で検索してみると、こんなのを見つける。

zshのオプションを調べたら、以下の設定をコメントアウトしたら、普通に動いた。
    setopt sh_word_split

sh_word_split と言うものの存在を知る。
しかし、そんな設定しているところ見当たらない。

で、今度は sh_word_split で調べみる。
と、こちらに辿り着く。

そしてこの中で気になった、こんな記述。 ;

zsh で変数宣言と同時に代入する場合はクォートが必要 (SH_WORD_SPLIT あり)
zsh で変数宣言と同時にコマンド置換する場合はクォートが必要 (SH_WORD_SPLIT 関係なし)

こう言うことなのかしら、と、コマンド置換部分をクォーティング。

一応、思い通りの動作をしてくれた。

ちなみに今回のケースだと、さっきの sh_word_split もへったくれもない、と言う事みたい。
ちなみにちなみに、zsh における sh_word_split って何、って話は、コチラが分かり易かった。

と言うことで、怖い話これまで。
おしまい。

*1:ちょっと怖くなって、過去の幾つかのソース見てみたら、たった一か所、文字列を評価しているところあった。そして "==" だった。怖い。...確かに近頃 bash 前提に作業していた。...と言うが。これのせい? ...いやいやいや。
たまたま見つかった、もうちょっと前のソースでは、"=" 書いてるし。
何か病気なのだろうか、とまで思ってくる。キモい。怖い。
さらに好奇心も助けて、test コマンド調べてみたら、いつも良く参照するサイトがバンバン引っ掛ってくるのですが、そのどれもが "="。
どうして? 何やってんの? 自分。とことん自分が嫌になる。