From e876b4eeb716cbc6de514c9ad597b5e4b8b7c7c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Sun, 10 Apr 2016 15:05:12 +0200 Subject: [PATCH] Update zsh prompt, add git integration. --- zsh/zsh/50_prompt.sh | 68 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/zsh/zsh/50_prompt.sh b/zsh/zsh/50_prompt.sh index 94ce041..c20093a 100644 --- a/zsh/zsh/50_prompt.sh +++ b/zsh/zsh/50_prompt.sh @@ -1,16 +1,62 @@ -setprompt() { - setopt prompt_subst +autoload -Uz vcs_info - topstr="%{$fg[green]%}%n@%m%{$fg[white]%} ─ %{%B$fg[yellow]%}%~${vcs_info_msg_0_}%{%b%} %{$fg[white]%}" - botstr="%B${PINFO}%#%b " +_vcsbase="%{$fg[grey]%}[%r] %{$fg[blue]%}[%B%b%{$fg[red]%}%m%{$fg[blue]%}] %{$fg[red]%}%B%c%u%f" - if _remote ; then - topstr="%{$fg[red]%}[remote]%{$fg[white]%} ${topstr}" +zstyle ':vcs_info:*' stagedstr 'I' +zstyle ':vcs_info:*' unstagedstr 'M' + +zstyle ':vcs_info:*' enable git +zstyle ':vcs_info:*' check-for-changes true +zstyle ':vcs_info:*' get-revision true + +zstyle ':vcs_info:git*' formats "$_vcsbase" +zstyle ':vcs_info:git*' actionformats "%{$fg[red]%}(%a) $_vcsbase" + +zstyle ':vcs_info:git*+set-message:*' hooks git-untracked git-st git-remotebranch + ++vi-git-untracked() { + if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \ + [[ $(git ls-files --other --directory --exclude-standard | sed q | wc -l | tr -d ' ') == 1 ]] ; then + hook_com[unstaged]+='?%f' fi - - PROMPT="%{$fg[white]%}┌─ ${topstr} -└─ ${botstr}" - RPROMPT="%{$fg[cyan]%}%*%{$fg[white]%} ─ [%?]" } -setprompt ++vi-git-st() { + local ahead behind + local -a gitstatus + + ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l) + (( $ahead )) && gitstatus+=( "+${ahead}" ) + + behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l) + (( $behind )) && gitstatus+=( "-${behind}" ) + + hook_com[misc]+=${(j:/:)gitstatus} +} + ++vi-git-remotebranch() { + local remote + + remote=${$(git rev-parse --verify ${hook_com[branch]}@{upstream} \ + --symbolic-full-name 2>/dev/null)/refs\/remotes\/} + + if [[ -n ${remote} ]] ; then + hook_com[branch]="${hook_com[branch]} %b%{$fg[grey]%}<${remote}>" + fi +} + +precmd() { + vcs_info +} + +_topstr='%{$fg[green]%}%n@%m%{$fg[white]%} ─ %{%B$fg[yellow]%}%~%{%b%} ${vcs_info_msg_0_}%{$fg[white]%} ' +botstr='%B${PINFO}%#%b ' + +if _remote ; then + _topstr="%{$fg[red]%}[remote]%{$fg[white]%} ${_topstr}" +fi + +setopt prompt_subst +PROMPT='%{$fg[white]%}┌─ '"${_topstr}"' +└─ '"${botstr}" +RPROMPT="%{$fg[cyan]%}%*%{$fg[white]%} ─ [%?]"