bureau.zsh-theme
3647 bytes
1# oh-my-zsh Bureau Theme
2
3### NVM
4
5ZSH_THEME_NVM_PROMPT_PREFIX="%B⬡%b "
6ZSH_THEME_NVM_PROMPT_SUFFIX=""
7
8### Git [±master ▾●]
9
10ZSH_THEME_GIT_PROMPT_PREFIX="[%{$fg_bold[green]%}±%{$reset_color%}%{$fg_bold[white]%}"
11ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}]"
12ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg_bold[green]%}✓%{$reset_color%}"
13ZSH_THEME_GIT_PROMPT_AHEAD="%{$fg[cyan]%}▴%{$reset_color%}"
14ZSH_THEME_GIT_PROMPT_BEHIND="%{$fg[magenta]%}▾%{$reset_color%}"
15ZSH_THEME_GIT_PROMPT_STAGED="%{$fg_bold[green]%}●%{$reset_color%}"
16ZSH_THEME_GIT_PROMPT_UNSTAGED="%{$fg_bold[yellow]%}●%{$reset_color%}"
17ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg_bold[red]%}●%{$reset_color%}"
18ZSH_THEME_GIT_PROMPT_STASHED="(%{$fg_bold[blue]%}✹%{$reset_color%})"
19
20bureau_git_info () {
21 local ref
22 ref=$(command git symbolic-ref HEAD 2> /dev/null) || \
23 ref=$(command git rev-parse --short HEAD 2> /dev/null) || return
24 echo "${ref#refs/heads/}"
25}
26
27bureau_git_status() {
28 local result gitstatus
29 gitstatus="$(command git status --porcelain -b 2>/dev/null)"
30
31 # check status of files
32 local gitfiles="$(tail -n +2 <<< "$gitstatus")"
33 if [[ -n "$gitfiles" ]]; then
34 if [[ "$gitfiles" =~ $'(^|\n)[AMRD]. ' ]]; then
35 result+="$ZSH_THEME_GIT_PROMPT_STAGED"
36 fi
37 if [[ "$gitfiles" =~ $'(^|\n).[MTD] ' ]]; then
38 result+="$ZSH_THEME_GIT_PROMPT_UNSTAGED"
39 fi
40 if [[ "$gitfiles" =~ $'(^|\n)\\?\\? ' ]]; then
41 result+="$ZSH_THEME_GIT_PROMPT_UNTRACKED"
42 fi
43 if [[ "$gitfiles" =~ $'(^|\n)UU ' ]]; then
44 result+="$ZSH_THEME_GIT_PROMPT_UNMERGED"
45 fi
46 else
47 result+="$ZSH_THEME_GIT_PROMPT_CLEAN"
48 fi
49
50 # check status of local repository
51 local gitbranch="$(head -n 1 <<< "$gitstatus")"
52 if [[ "$gitbranch" =~ '^## .*ahead' ]]; then
53 result+="$ZSH_THEME_GIT_PROMPT_AHEAD"
54 fi
55 if [[ "$gitbranch" =~ '^## .*behind' ]]; then
56 result+="$ZSH_THEME_GIT_PROMPT_BEHIND"
57 fi
58 if [[ "$gitbranch" =~ '^## .*diverged' ]]; then
59 result+="$ZSH_THEME_GIT_PROMPT_DIVERGED"
60 fi
61
62 # check if there are stashed changes
63 if command git rev-parse --verify refs/stash &> /dev/null; then
64 result+="$ZSH_THEME_GIT_PROMPT_STASHED"
65 fi
66
67 echo $result
68}
69
70bureau_git_prompt() {
71 # ignore non git folders and hidden repos (adapted from lib/git.zsh)
72 if ! command git rev-parse --git-dir &> /dev/null \
73 || [[ "$(command git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then
74 return
75 fi
76
77 # check git information
78 local gitinfo=$(bureau_git_info)
79 if [[ -z "$gitinfo" ]]; then
80 return
81 fi
82
83 # quote % in git information
84 local output="${gitinfo:gs/%/%%}"
85
86 # check git status
87 local gitstatus=$(bureau_git_status)
88 if [[ -n "$gitstatus" ]]; then
89 output+=" $gitstatus"
90 fi
91
92 echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${output}${ZSH_THEME_GIT_PROMPT_SUFFIX}"
93}
94
95
96_PATH="%{$fg_bold[white]%}%~%{$reset_color%}"
97
98if [[ $EUID -eq 0 ]]; then
99 _USERNAME="%{$fg_bold[red]%}%n"
100 _LIBERTY="%{$fg[red]%}#"
101else
102 _USERNAME="%{$fg_bold[white]%}%n"
103 _LIBERTY="%{$fg[green]%}$"
104fi
105_USERNAME="$_USERNAME%{$reset_color%}@%m"
106_LIBERTY="$_LIBERTY%{$reset_color%}"
107
108
109get_space () {
110 local STR=$1$2
111 local zero='%([BSUbfksu]|([FB]|){*})'
112 local LENGTH=${#${(S%%)STR//$~zero/}}
113 local SPACES=$(( COLUMNS - LENGTH - ${ZLE_RPROMPT_INDENT:-1} ))
114
115 (( SPACES > 0 )) || return
116 printf ' %.0s' {1..$SPACES}
117}
118
119_1LEFT="$_USERNAME $_PATH"
120_1RIGHT="[%*]"
121
122bureau_precmd () {
123 _1SPACES=`get_space $_1LEFT $_1RIGHT`
124 print
125 print -rP "$_1LEFT$_1SPACES$_1RIGHT"
126}
127
128setopt prompt_subst
129PROMPT='> $_LIBERTY '
130RPROMPT='$(nvm_prompt_info) $(bureau_git_prompt)'
131
132autoload -U add-zsh-hook
133add-zsh-hook precmd bureau_precmd