読者です 読者をやめる 読者になる 読者になる

( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

(zsh版)pushし忘れないようにプロンプトに表示するようにした

今日はPython-hack-a-thonなんだけど結局行けなかったため、一人発火村イェーー……。


ってことで pushし忘れないようにプロンプトに表示するようにした - ぱせらんメモを参考に、zshのRPROMPTにremoteにpushしているかを表示するようにしてみた。


f:id:yuroyoro:20110219125336p:image


今.zshrcに設定してる内容は、zsh で Git の作業コピーに変更があるかどうかをプロンプトに表示する方法 - ess supを参考にさせてもらいました。そこに、上記のエントリの内容を追加してます。

autoload -Uz add-zsh-hook
autoload -Uz vcs_info

zstyle ':vcs_info:*' enable git svn hg bzr
zstyle ':vcs_info:*' formats '(%s)-[%b]'
zstyle ':vcs_info:*' actionformats '(%s)-[%b|%a]'
zstyle ':vcs_info:(svn|bzr):*' branchformat '%b:r%r'
zstyle ':vcs_info:bzr:*' use-simple true

autoload -Uz is-at-least
if is-at-least 4.3.10; then
  # この check-for-changes が今回の設定するところ
  zstyle ':vcs_info:git:*' check-for-changes true
  zstyle ':vcs_info:git:*' stagedstr "+"    # 適当な文字列に変更する
  zstyle ':vcs_info:git:*' unstagedstr "-"  # 適当の文字列に変更する
  zstyle ':vcs_info:git:*' formats '(%s)-[%c%u%b]'
  zstyle ':vcs_info:git:*' actionformats '(%s)-[%c%u%b|%a]'
fi

function _update_vcs_info_msg() {
    psvar=()
    LANG=en_US.UTF-8 vcs_info
    psvar[2]=$(_git_not_pushed)
    [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"
}
add-zsh-hook precmd _update_vcs_info_msg

function _git_not_pushed()
{
  if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
    head="$(git rev-parse HEAD)"
    for x in $(git rev-parse --remotes)
    do
      if [ "$head" = "$x" ]; then
        return 0
      fi
    done
    echo "{?}"
  fi
  return 0
}

RPROMPT="%1(v|%F${CYAN}%1v%2v%f|)${vcs_info_git_pushed}${RESET}${WHITE}[${BLUE}%(5~,%-2~/.../%2~,%~)% ${WHITE}]${WINDOW:+"[$WINDOW]"} ${RESET}"


自分は、必ずしもremoteにpushするbranchばかりな訳ではなく、ローカルのtopic brachで作業することも多いので、表示は控えめに"{?}"にしておいた。
RPROMPTに出す文字列は、psvar[2]を経由して出しているのだけど、もっとスマートな方法ないかしらん?


zshvcs_info周りはzsh: 26. User Contributionsを読むとよいです。俺はよく理解してませんが。


あと、俺の.zshrcなどdotfiles関連です。

yuroyoro/dotfiles · GitHub