zshでプロンプトにカレントブランチ名を表示する

@hmmrjn さんの [5分でターミナルの「MacBook:~ Taro$」を見やすくして絶頂する方法](https://qiita.com/hmmrjn/items/15d0fe15e5d03586ad46)を元にプロンプト(bash)をカスタマイズしていましたが、マシン乗り換えを機にzshに引っ越したので、同じようなカスタマイズをzshでも行いました。

**完成品はこちら**
カレントディレクトリと(git配下なら)カレントブランチを表示します。
<img width="851" alt="zsh_screenshot" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159912/017a7876-f529-6cf5-8c20-65173a1f499b.png">

# 前準備
## フォントインストール

[Menlo for Powerline.ttf](https://github.com/abertsch/Menlo-for-Powerline/blob/master/Menlo%20for%20Powerline.ttf)をダウンロードしてインストールします。
ディレクトリとブランチ名の後ろの右三角「▶︎」を使いたいためです。落ちてきた.ttfファイルをダブルクリックすればインストーラーが起動します。
<img width="1029" alt="github.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159912/42870536-44f9-e984-f953-e60ab2733bab.png">

## フォント切り替え
インストールしたらターミナルの環境設定(⌘,)の プロファイル>テキスト>フォントをインストールした「Menlo for Powerline」に変更します。
変更したらターミナルを再起動する。

# .zshrcに追記
.zshrcに以下を追記します。

```shell:.zshrc
autoload -Uz vcs_info
setopt prompt_subst

# vcs_info_msg_0_変数をどのように表示するかフォーマットの指定  %b: ブランチ名
zstyle ':vcs_info:git:*' formats '%b'
precmd () { vcs_info }

# プロンプトを見やすくする
export PROMPT='%K{250} %F{016}%C%k%K{118}%f%F{250}%f%F{016}%{${vcs_info_msg_0_}%f%k%F{118}%f $'
```
が化けていますがMenlo for Powerlineなら「▶︎」のように表示されるはずです。
とりあえず完成させたい人はここで終わり。以下解説です。


## 2行めまで

```
autoload -Uz vcs_info
setopt prompt_subst
```

`autoload`で$FPATHにあるビルトイン関数を読み込んできます。
`-U`は読み込み時にユーザーが定義したaliasを無視して読み込みます。`-z`はシェルを明示的にzshとして読み込みます。

vcs_infoはバージョン管理システムから情報をとってくる関数です。git以外にsvnなどでも利用できます。
`autoload -Uz vcs_info`だけだと読み込むだけで実行はしません。今回はあとの行でプロンプトを表示する度に毎回実行するように設定するため、ここでの実行は不要です。

`setopt prompt_subst`することで後ほどセットするPROMPT変数内で変数展開するようになります。

## 6行めまで

```
zstyle ':vcs_info:git:*' formats '%b'
precmd () { vcs_info }
```

`zstyle`でgitの情報が入る変数`vcs_info_msg_0_ `のフォーマットを設定します。`%b`はカレントブランチを表します。
他にはどのバージョン管理システムを使っているかを表す`%s`などもあります。詳しくは[The Z Shell Manual](http://zsh.sourceforge.net/Doc/Release/User-Contributions.html#Version-Control-Information)へ

`precmd () {}`はプロンプトを表示する度に実行する関数です。ここでgitから情報を取得する`vcs_info`を実行することで、プロンプトを表示する度に変数`vcs_info_msg_0_ `の中身を最新に書き換えます。

## 9行め
```
export PROMPT='%K{250} %F{016}%C%k%K{118}%f%F{250}%f%F{016}%{${vcs_info_msg_0_}%f%k%F{118}%f $'
```
PROMPTに表示するフォーマットを設定します。

`${vcs_info_msg_0_}`で、先ほとフォーマットを指定した`vcs_info_msg_0_`に入っているgitの情報を展開します。

また背景色は`%K{色番号}`で開始地点を指定し、`%k`で終了地点を指定します。
文字色は`%F{色番号}`で開始地点を指定し、`%f`で終了地点を指定します。

図示すると
<img width="382" alt="colour_set.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159912/0949e740-37ab-bc0d-f41b-c774e0a1e113.png">
右三角「▶︎」の部分の色は`%F{色番号}`で指定するため、文字色指定がやや入り組んでいます。

また`{}`内で使える色番号は `for c in {000..255}; do echo -n "\e[38;5;${c}m $c" ; [ $(($c%16)) -eq 15 ] && echo;done;echo`で確認することができます。
<img width="818" alt="colour_number.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159912/30fd9b26-52b6-8f18-38ba-88d96507be8c.png">

解説は以上です。
git配下外では緑の背景が出ないようにしたりしたいなあ(vcs_info_msg_0_でPROMPTを条件分岐すれば多分できる。)

最後にコメントをベタベタ書いたバージョンを貼っておきます。(私の.zshrcそのまま)

```shell:.zshrc
#gitのブランチ名を表示する
autoload -Uz vcs_info
# vcs_info_msg_0_変数をどのように表示するかフォーマットの指定
## デフォルトのフォーマット
### %s: どのバージョン管理システムを使っているか（git, svnなど）
### %b: ブランチ名
zstyle ':vcs_info:git:*' formats '%b'
# プロンプトを表示する直前に毎回実行する
precmd () { vcs_info }

# ターミナルを見やすくする
# PROMPT変数内で変数展開する
setopt prompt_subst
## 使える色の確認は for c in {000..255}; do echo -n "\e[38;5;${c}m $c" ; [ $(($c%16)) -eq 15 ] && echo;done;echo
## 背景色の変更 %K{色番号}で開始 %kで終了
## 文字色の変更 %F{色番号}で開始 %fで終了
export PROMPT='%K{250} %F{016}%C%k%K{118}%f%F{250}%f%F{016}%{${vcs_info_msg_0_}%f%k%F{118}%f $'
```


# 参考リンク
* [The Z Shell Manual(26.5 Gathering information from version control systems)](http://zsh.sourceforge.net/Doc/Release/User-Contributions.html#Version-Control-Information)
* [zshのcompinitに指定してるautoloadのオプション -Uz について](https://medium.com/@rukurx/zsh%E3%81%AEcompinit%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E3%82%8Bautoload%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-uz-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-ad471efd84c3)
* [zshのターミナルにリポジトリの情報を表示してみる -けんごのお屋敷
](http://tkengo.github.io/blog/2013/05/12/zsh-vcs-info/)
* [Zshのpromptの色を変えた話 -たくさん寝太郎の寝床](https://kaworu-mk6.hatenablog.com/entry/2018/10/13/061607)