まなびやりはく

諸事情で移転しましたゆるめにいきます

zshのプロンプトにお天気表示してみた

【この記事は旧ブログから移転しています】

どうもみなさんこんにちは、@kanufyです。

今日はきっとエンジニアのみなさんが
一番目にする場所であろうシェルをいじろうと思います。

プロンプトに天気でてきたらかわいい気がする。
うんきっとかわいいに違いない。

f:id:kanu1102:20150111023205p:plain

お天気を調べる

天気調べるなにかがあるはず
さくっとgoogle先生に質問したら、curl使ってlivedoorのお天気とってくるAPIしばいてる記事があったので参考に。

shell - シェルで今日の天気予報表示 - Qiita

上記より

$ curl -s http://weather.livedoor.com/forecast/webservice/json/v1\?city\=XXXXXX | jq -r '.forecasts[] | select(.dateLabel == "今日").telop'


でお天気が表示されることが判明。

JSON見づらい

jqいれます。

brew intall jq

でサクッとインストール。
jqJSONパーサーで結構フィルタリングいっぱいできて便利です。

  • jq公式リファレンス

  jq Manual (development version)

  • ざっくり日本語訳してくれた記事

  軽量JSONパーサー『jq』のドキュメント:『jq Manual』をざっくり日本語訳してみました | Developers.IO

お天気をだす

無事jqコマンドが使えるようになったので
curlするとこんなのが返ってきます。

f:id:kanu1102:20150111030413p:plain

曇時々晴...まてよこれって天気の種類めっちゃあるやつじゃ...

お天気Webサービス仕様 - Weather Hacks - livedoor 天気情報

仕様に天気の種類のってないってことで
適当にいろんな都道府県の天気しらべてみて
こんくらいあったらなんとかなるでしょーくらいまででやめた(18種類くらい

返ってきた天気をシェルスクリプトの変数にぶちこむ。

WEATHER=$(curl -s http://weather.livedoor.com/forecast/webservice/json/v1\?city\=260010 | jq -r '.forecasts[] | select(.dateLabel == "今日").telop' );

ちなみにcityは260010は京都南部です。
東京は130010で滋賀は250010。
これもlivedoor天気の各都道府県の天気調べたらURLにかいてあるのでそれを参考に。
(一覧でだしてよねとかもちろん思ったり。)

この天気によって case文 で場合分け(めんどくさい)
時々は / 使って、のちは -> で表現してみました。

case $WEATHER in
   曇時々晴) WE="☁ /☀";;
   曇時々雨) WE="☁ /☂";;
   曇時々雪) WE="☁ /☃";;
   晴時々曇) WE="☀ /☁";;
   晴時々雨) WE="☀ /☂";;
   雨時々曇) WE="☂ /☁";;
   晴のち曇) WE="☀ ->☁";;
   晴のち雨) WE="☀ ->☂";;
   曇のち晴) WE="☁ ->☀";;
   曇のち雨) WE="☁ ->☂";;
   雨のち晴) WE="☂ ->☀";;
   雨のち曇) WE="☂ ->☁";;
   雪のち曇) WE="☃ ->☁";;
   曇のち雪) WE="☁ ->☃";; 
   雨) WE="☂";;
   晴れ) WE="☀";;
   曇り) WE="☁";;
   雪) WE="☃";;
   *) WE="♡";;
esac

これでだいたい準備はおっけーです。
登録されてない天気がでると♡がでるので
そんなときは

echo $WEATHER

なりして調べて追加してください(糞設計でごめんなさい)

プロンプトに表示させる

天気を $WE に入れたので、プロンプトに入れます。

tmp_prompt="%{${fg[cyan]}%}%n%{${reset_color}%} %{${fg[red]}%}${WE}%{${reset_color}%} %{${fg[magenta]}%}>%{${reset_color}%}"  


私の場合、kanae 天気 >にしてるので、ユーザ名 %n をシアンではさんでます。
%{${fg[cyan]}%}%n%{${reset_color}%}ここまでで1つ。
色は%{${fg[cyan]}%}でつけて%{${reset_color}%}で色を戻す。
天気毎に色変えたかったんですがすごくめんどそうだったので諦めて全部赤色に。
%{${fg[red]}%}${WE}%{${reset_color}%}の部分ですね。
ちなみに色つけるためにはautoload -U colors; colorsをかかないとダメです。

f:id:kanu1102:20150111023205p:plain


さてこれでプロンプトにお天気がでたはずです!
確認はコマンドライン

exec -l $SHELL

つかうとシェル再起動できるので
あたらしく開いてたしかめなくていいので便利です。

ついでにシェルスクリプトについても調べたりしてたので参考に。

シェルスクリプト入門 書き方のまとめ | Memo on the Web


以下私の.zshrcのお天気部分とプロンプト表示部分抜粋

ネットで漁った.zshrcをベースにしてます。
ちなみに右プロンプトにはカレントディレクトリだしてます。
明日の天気とかにしたければcurl(.dateLabel == "今日")を明日にするとできます。

[お天気をzshのプロンプトに表示させる部分の.zshrc](https://gist.github.com/63d3e899face3677f781)