Linux
shell
kawaii

コマンドが失敗したときにシェルの顔文字があわててたら、可愛いしわかりやすいよね

どうも、かちおです。突然ですが、シェルのプロンプトって普段味気ないですよね。カスタマイズしている人でも、色やgitブランチ表示していたりする程度だと思います。
そこで、今回は、直前のコマンドのリターンコードが0かそれ以外か(True or False)を判断し、失敗していたらプロンプトの顔文字が慌てるようにしようと思います。

※この記事の方法はzshのみに対応しています。

結果

k.png

コマンドが正常に動いているときは

(」・ω・)」うー▶~ $ ❯

と表示されていますが、コマンドの返り値が0以外だと

\(・ω・\)SAN値!~ $ ❯

に変わります。また、右のプロンプトもそれぞれ\(・ω・\)にゃー!(/・ω・)/ピンチ!に変化します。

方法

zshのプロンプトの文字は、$PROMPTという環境変数で設定されています。既にpowerline等のテーマを導入シている場合は、既に登録されていると思うので、テーマを読み込んだあとに、テーマが設定した文字列を変更してみてください。上書きしてしまうと、せっかくのテーマが表示されなくなってしまいます。

基本的には、$PROMPTに入れた文字がそのままシェルのプロンプトに表示され、その中で特殊文字だけが変換されます。

特殊文字は%で始まり、文字色を変更、背景色を変更、コマンドの実行結果を取得、環境変数を取得などができますが、ここでは「直前のコマンドの返り値によって分岐する」という記法を使います。特殊文字については http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html に詳しく乗っているので参考にしてください。

コードとしては、以下のようになっています。

zshrc
if [ ${UID} -eq 0 ]; then
        PROMPT="%K{green}%B%F{black}ROOT%b%k %F{cyan}%~ %f$ "
else
        UUU="%B%F{white}(」・ω・)」うー▶%b"
        NYA="%B%F{white}\(・ω・\)にゃー!%b"
        SAN="%B%F{red}\(・ω・\)SAN値!%b"
        PIN="%B%F{red}(/・ω・)/ピンチ!%b"
        PROMPT="%K{green}%(?,${UUU},${SAN})%k%F{cyan}%~ %f$ ❯ "
        RPROMPT="%K{green}%(?,${NYA},${PIN})%k${vcs_info_msg_0_}"
fi

最初に$UIDがゼロかどうか確認しているのは、ROOTだったらプロンプトを変えたいからです。rootユーザーなんてめったになりませんが、もしその場合はパット見分かるようにしています。

まず、$UUU$NYA$SAN$PINには、それぞれ表示したい顔文字を代入しています。%Bで太字、%F{color}で文字色指定、%bで装飾リセットです。
こうやって分けている理由は、単純に見やすいからです。

そして、最終的に$PROMPTに代入をしています。%(?,a,b)で、直前のコマンドの返り値が0ならa、そうじゃないならbを表示することができます。そしてそこに先程設定した$UUU$SANを指定しています。$RPROMPTもやっていることは変わりません。
また、%Kで背景色の変更、%~でカレントディレクトリのパスを表示させています。

これで、コマンドが失敗するとプロンプトが慌てて可愛くなります。

k.png


grepやシェルスクが失敗しても、これならひと目でわかりますね。ぜひ有効活用してください。