Created
December 11, 2012 00:08
-
-
Save mollifier/4254565 to your computer and use it in GitHub Desktop.
zsh の vcs\_info に独自の処理を追加して stash 数とか push していない件数とか何でも表示する ref: http://qiita.com/items/8d5a627d773758dd8078
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# vcs_info 設定 | |
RPROMPT="" | |
autoload -Uz vcs_info | |
autoload -Uz add-zsh-hook | |
autoload -Uz is-at-least | |
autoload -Uz colors | |
# 以下の3つのメッセージをエクスポートする | |
# $vcs_info_msg_0_ : 通常メッセージ用 (緑) | |
# $vcs_info_msg_1_ : 警告メッセージ用 (黄色) | |
# $vcs_info_msg_2_ : エラーメッセージ用 (赤) | |
zstyle ':vcs_info:*' max-exports 3 | |
zstyle ':vcs_info:*' enable git svn hg bzr | |
# 標準のフォーマット(git 以外で使用) | |
# misc(%m) は通常は空文字列に置き換えられる | |
zstyle ':vcs_info:*' formats '(%s)-[%b]' | |
zstyle ':vcs_info:*' actionformats '(%s)-[%b]' '%m' '<!%a>' | |
zstyle ':vcs_info:(svn|bzr):*' branchformat '%b:r%r' | |
zstyle ':vcs_info:bzr:*' use-simple true | |
if is-at-least 4.3.10; then | |
# git 用のフォーマット | |
# git のときはステージしているかどうかを表示 | |
zstyle ':vcs_info:git:*' formats '(%s)-[%b]' '%c%u %m' | |
zstyle ':vcs_info:git:*' actionformats '(%s)-[%b]' '%c%u %m' '<!%a>' | |
zstyle ':vcs_info:git:*' check-for-changes true | |
zstyle ':vcs_info:git:*' stagedstr "+" # %c で表示する文字列 | |
zstyle ':vcs_info:git:*' unstagedstr "-" # %u で表示する文字列 | |
fi | |
# hooks 設定 | |
if is-at-least 4.3.11; then | |
# git のときはフック関数を設定する | |
# formats '(%s)-[%b]' '%c%u %m' , actionformats '(%s)-[%b]' '%c%u %m' '<!%a>' | |
# のメッセージを設定する直前のフック関数 | |
# 今回の設定の場合はformat の時は2つ, actionformats の時は3つメッセージがあるので | |
# 各関数が最大3回呼び出される。 | |
zstyle ':vcs_info:git+set-message:*' hooks \ | |
git-hook-begin \ | |
git-untracked \ | |
git-push-status \ | |
git-nomerge-branch \ | |
git-stash-count | |
# フックの最初の関数 | |
# git の作業コピーのあるディレクトリのみフック関数を呼び出すようにする | |
# (.git ディレクトリ内にいるときは呼び出さない) | |
# .git ディレクトリ内では git status --porcelain などがエラーになるため | |
function +vi-git-hook-begin() { | |
if [[ $(command git rev-parse --is-inside-work-tree 2> /dev/null) != 'true' ]]; then | |
# 0以外を返すとそれ以降のフック関数は呼び出されない | |
return 1 | |
fi | |
return 0 | |
} | |
# untracked フィアル表示 | |
# | |
# untracked ファイル(バージョン管理されていないファイル)がある場合は | |
# unstaged (%u) に ? を表示 | |
function +vi-git-untracked() { | |
# zstyle formats, actionformats の2番目のメッセージのみ対象にする | |
if [[ "$1" != "1" ]]; then | |
return 0 | |
fi | |
if command git status --porcelain 2> /dev/null \ | |
| awk '{print $1}' \ | |
| command grep -F '??' > /dev/null 2>&1 ; then | |
# unstaged (%u) に追加 | |
hook_com[unstaged]+='?' | |
fi | |
} | |
# push していないコミットの件数表示 | |
# | |
# リモートリポジトリに push していないコミットの件数を | |
# pN という形式で misc (%m) に表示する | |
function +vi-git-push-status() { | |
# zstyle formats, actionformats の2番目のメッセージのみ対象にする | |
if [[ "$1" != "1" ]]; then | |
return 0 | |
fi | |
if [[ "${hook_com[branch]}" != "master" ]]; then | |
# master ブランチでない場合は何もしない | |
return 0 | |
fi | |
# push していないコミット数を取得する | |
local ahead | |
ahead=$(command git rev-list origin/master..master 2>/dev/null \ | |
| wc -l \ | |
| tr -d ' ') | |
if [[ "$ahead" -gt 0 ]]; then | |
# misc (%m) に追加 | |
hook_com[misc]+="(p${ahead})" | |
fi | |
} | |
# マージしていない件数表示 | |
# | |
# master 以外のブランチにいる場合に、 | |
# 現在のブランチ上でまだ master にマージしていないコミットの件数を | |
# (mN) という形式で misc (%m) に表示 | |
function +vi-git-nomerge-branch() { | |
# zstyle formats, actionformats の2番目のメッセージのみ対象にする | |
if [[ "$1" != "1" ]]; then | |
return 0 | |
fi | |
if [[ "${hook_com[branch]}" == "master" ]]; then | |
# master ブランチの場合は何もしない | |
return 0 | |
fi | |
local nomerged | |
nomerged=$(command git rev-list master..${hook_com[branch]} 2>/dev/null | wc -l | tr -d ' ') | |
if [[ "$nomerged" -gt 0 ]] ; then | |
# misc (%m) に追加 | |
hook_com[misc]+="(m${nomerged})" | |
fi | |
} | |
# stash 件数表示 | |
# | |
# stash している場合は :SN という形式で misc (%m) に表示 | |
function +vi-git-stash-count() { | |
# zstyle formats, actionformats の2番目のメッセージのみ対象にする | |
if [[ "$1" != "1" ]]; then | |
return 0 | |
fi | |
local stash | |
stash=$(command git stash list 2>/dev/null | wc -l | tr -d ' ') | |
if [[ "${stash}" -gt 0 ]]; then | |
# misc (%m) に追加 | |
hook_com[misc]+=":S${stash}" | |
fi | |
} | |
fi | |
function _update_vcs_info_msg() { | |
local -a messages | |
local prompt | |
LANG=en_US.UTF-8 vcs_info | |
if [[ -z ${vcs_info_msg_0_} ]]; then | |
# vcs_info で何も取得していない場合はプロンプトを表示しない | |
prompt="" | |
else | |
# vcs_info で情報を取得した場合 | |
# $vcs_info_msg_0_ , $vcs_info_msg_1_ , $vcs_info_msg_2_ を | |
# それぞれ緑、黄色、赤で表示する | |
[[ -n "$vcs_info_msg_0_" ]] && messages+=( "%F{green}${vcs_info_msg_0_}%f" ) | |
[[ -n "$vcs_info_msg_1_" ]] && messages+=( "%F{yellow}${vcs_info_msg_1_}%f" ) | |
[[ -n "$vcs_info_msg_2_" ]] && messages+=( "%F{red}${vcs_info_msg_2_}%f" ) | |
# 間にスペースを入れて連結する | |
prompt="${(j: :)messages}" | |
fi | |
RPROMPT="$prompt" | |
} | |
add-zsh-hook precmd _update_vcs_info_msg |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
zstyle ':vcs_info:git+set-message:*' hooks \ | |
git-hook-begin \ | |
git-untracked \ | |
git-push-status \ | |
git-nomerge-branch \ | |
git-nomerge-master \ # <= 追加 | |
git-stash-count | |
function +vi-git-nomerge-master() { | |
# vcs_info_msg_1_ を設定する場合のみ処理の対象とする | |
if [[ "$1" != "1" ]]; then | |
return 0 | |
fi | |
if [[ "${hook_com[branch]}" == "master" ]]; then | |
return 0 | |
fi | |
if command git branch --no-merged 2>/dev/null | command grep 'master' > /dev/null 2>&1 ; then | |
hook_com[misc]+="(R)" | |
fi | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment