zshのプロンプト設定-改良ver-

以前書いた[zshのプロンプト設定を晒す](http://qiita.com/yasuto777/items/627f9d4b2f3ac432d6ce "Qiita")の改良verです。

```以前の.zshrc
autoload -U promptinit
autoload -U colors && colors

# 直前の返り値によって色変更 #
local p_color="%(?.%{${fg[cyan]}%}.%{${fg[magenta]}%})"

# スクリーン番号を（あれば）変数に格納 #
local window_no="${WINDOW:+"[$WINDOW]"}"

PROMPT="
%{$fg[cyan]%}User:%n%{${reset_color}%}
$p_color [%~] > %{${reset_color}%}"


#
# 今回はこのRPROMPTを改良していきます。
#
RPROMPT="$p_color return:[%?]%{${reset_color}%}"

# ちょいメモ 
# このちょいメモも改良していきます。
function memo() {RPROMPT="%S$1%s $p_color return:[%?]%{${reset_color}%}";}

# Googleカラーでサジェスト #
setopt correct
SPROMPT="( ´・ω・) ＜ %{$fg[blue]%}も%{${reset_color}%}%{$fg[red]%}し%{${reset_color}%}%{$fg[yellow]%}か%{${reset_color}%}%{$fg[green]%}し%{${reset_color}%}%{$fg[red]%}て%{${reset_color}%}: %{$fg[red]%}%r%{${reset_color}%}？ [(y)es,(n)o,(a)bort,(e)dit]
-> "
```


変更点
･ vcs_infoを使ってgitのリポジトリ情報を表示しました。
･ ちょいメモのメモ内容にスペースを使えるよう改良

#vcs_info
gitやCVSなどのいわゆるバージョン管理システムから情報を取得してくれる便利な関数。
##vcs_infoを使う準備
まず最初にこの __vcs_info__を使うための宣言をします。

```
autoload -Uz vcs_info
setopt prompt_subst	#プロンプト表示する度に変数を展開
```
これで __vcs_info__を使う準備は出来ました。
ですが実際に呼び出す前に少しカスタマイズしてしまいましょう。

```
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{yellow}!"
zstyle ':vcs_info:git:*' unstagedstr "%F{red}+"
zstyle ':vcs_info:*' formats "%F{green}%c%u[%b]%f"
zstyle ':vcs_info:*' actionformats '[%b|%a]'
```

* __check-for-changes__
__true__または __false__を指定(デフォルトは __false__)。
__true__にすると _formats_という項目で``%c``と``%u``というフォーマットが使えるようになる。これは、リポジトリにコミットされていないファイルがあった場合に``%c``または``%u``に文字列が格納される。

* __stagedstr__
ステージされていてコミットされていない(git addだけされてる)ファイルがあった場合、 _formats_の設定に``%c``があれば、ここで指定した文字列が表示されます。
私の場合は黄色で``+``が表示されるようにしています。

* __unstagedstr__
ステージされていない(git addされていない)変更ファイルがあった場合、 _formats_ の設定に``%u``があれば、ここで指定した文字列が表示されます。
私の場合は赤色で``!``が表示されるようにしています。

* __formats__
``$vcs_info_msg_0_``で表示する内容をここに指定します。

* __actionformats__
_merge_でコンフリクトが起きたり、何かしら特殊な状況になった場合に _formats_の代わりに _actionformats_で指定した文字列が``$vcs_info_msg_0_``に格納される。

|変数|変数の説明|
|:--|:--|
|%c|ステージされていてコミットされていない(git addだけされている)ファイルがあった場合、 _stagedstr_ で指定した文字列に展開されます。ない場合は空です。|
|%u|ステージされていない(git addされていない)変更ファイルがあった場合、 _unstagedstr_ で指定した文字列に展開されます。ない場合は空です。|
|%b|カレントブランチ名|
|$vcs_info_msg_0_|通常メッセージが格納される。|
|$vcs_info_msg_1_|警告メッセージが格納される。|
|$vcs_info_msg_2_|エラーメッセージが格納される。|

##vcs_infoを呼び出す
カスタマイズが無事終わったので、 __vcs_info__を呼び出しましょう。
``precmd(){ vcs_info }``
``precmd``という関数はzshのプロンプトが表示される度に実行される関数で、この関数の中で呼び出すことによって何かコマンドを叩く度に __vcs_info__が情報を取得してきてくれます。

##実際にRPROMPTにリポジトリ情報を表示する。

```.zshrc
RPROMPT='${vcs_info_msg_0_}'"$p_color return:[%?]%{${reset_color}%}"
```

#ちょいメモ改良ver
以前の書き方ではメモにスペースを入れられませんでした。初めはホントにちょっとした一言を一時的にメモしておくだけのつもりなのでスルーしていましたが、実際に使ってみると、｢豚肉 もやし｣みたいな感じにメモしたい事があったので改良しました。

```.zshrc
function memo(){
	if[ $# -eq 0]; then
		unset memotxt
		return
	fi
	for str in $@
	do
	memotxt="${memotxt} ${str}"
	done
}
```

以前と同様にメモを消すときは引数なしで
``$ memo``
とすれば消えます。

#vcs_info + ちょいメモ
リポジトリ情報とちょいメモを合体させたプロンプトの書き方です。
今回変更したのは __RPROMPT__だけですのでそれ以外の部分は前回のまま流用で大丈夫です。

```.zshrc
autoload -Uz vcs_info
setopt prompt_subst

zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{yellow}!"
zstyle ':vcs_info:git:*' unstagedstr "%F{red}+"
zstyle ':vcs_info:*' formats "%F{green}%c%u[%b]%f"
zstyle ':vcs_info:*' actionformats '[%b|%a]'
precmd(){ vcs_info }

function memo(){
    if[ $# -eq 0]; then
        unset memotxt
        return
    fi
    for str in $@
    do
    memotxt="${memotxt} ${str}"
    done
}

RPROMPT='${memotxt}''${vcs_info_msg_0_}'"$p_color return:[%?]%{${reset_color}%}"
```

![scsh.png](https://qiita-image-store.s3.amazonaws.com/0/83976/d4b08c22-aa53-4cf8-61aa-0ce8e9a0277f.png)

リポジトリ情報は、バージョン管理システムで管理しているディレクトリを抜けると表示が消えます。