# wunjo prompt theme autoload -U zgitinit zgitinit autoload colors colors prompt_wunjo_help () { cat <<'EOF' prompt wunjo EOF } # We want our vim users to be able to see what mode their in. # From http://www.jukie.net/~bart/conf/zsh.d/S60_prompt coloratom() { local off=$1 atom=$2 if [[ $atom[1] == [[:upper:]] ]]; then off=$(( $off + 60 )) fi echo $(( $off + $colorcode[${(L)atom}] )) } colorword() { local fg=$1 bg=$2 att=$3 local -a s if [ -n "$fg" ]; then s+=$(coloratom 30 $fg) fi if [ -n "$bg" ]; then s+=$(coloratom 40 $bg) fi if [ -n "$att" ]; then s+=$attcode[$att] fi echo "%{"$'\e['${(j:;:)s}m"%}" } prompt_wunjo_setup() { local verbose if [[ $TERM == screen* ]] && [ -n "$STY" ]; then # verbose= # Set to 1 by Ryan... no clue why you wouldn't want it. verbose=1 else verbose=1 fi typeset -A colorcode colorcode[black]=0 colorcode[red]=1 colorcode[green]=2 colorcode[yellow]=3 colorcode[blue]=4 colorcode[magenta]=5 colorcode[cyan]=6 colorcode[white]=7 colorcode[default]=9 colorcode[k]=$colorcode[black] colorcode[r]=$colorcode[red] colorcode[g]=$colorcode[green] colorcode[y]=$colorcode[yellow] colorcode[b]=$colorcode[blue] colorcode[m]=$colorcode[magenta] colorcode[c]=$colorcode[cyan] colorcode[w]=$colorcode[white] colorcode[.]=$colorcode[default] typeset -A attcode attcode[none]=00 attcode[bold]=01 attcode[faint]=02 attcode[standout]=03 attcode[underline]=04 attcode[blink]=05 attcode[reverse]=07 attcode[conceal]=08 attcode[normal]=22 attcode[no-standout]=23 attcode[no-underline]=24 attcode[no-blink]=25 attcode[no-reverse]=27 attcode[no-conceal]=28 local -A pc pc[default]='default' pc[date]='cyan' pc[time]='Blue' pc[host]='ZSH_HOST_COLOUR' pc[user]='cyan' pc[punc]='yellow' pc[line]='magenta' pc[hist]='green' pc[path]='Cyan' pc[shortpath]='default' pc[rc]='red' pc[scm_branch]='Cyan' pc[scm_commitid]='Yellow' pc[scm_status_dirty]='Red' pc[scm_status_staged]='Green' pc[#]='Yellow' pc[insert]='green' pc[command]='red' for cn in ${(k)pc}; do pc[${cn}]=$(colorword $pc[$cn]) done pc[reset]=$(colorword . . 00) typeset -Ag wunjo_prompt_colors wunjo_prompt_colors=(${(kv)pc}) local p_date p_line p_rc p_date="$pc[date]%D{%Y-%m-%d} $pc[time]%D{%T}$pc[reset]" p_line="$pc[line]%y$pc[reset]" function zle-line-init zle-keymap-select { VIMODE="${${KEYMAP/vicmd/C}/(main|viins)/I}" VICOLOR="${${KEYMAP/vicmd/$fg[green]}/(main|viins)/$fg[red]}" zle reset-prompt } zle -N zle-line-init zle -N zle-keymap-select vi="${VICOLOR}${VIMODE}" PROMPT= if [ $verbose ]; then PROMPT+="$pc[host]%m$pc[reset] " fi PROMPT+="$pc[path]%(2~.%~.%/)$pc[reset]" PROMPT+="\$(prompt_wunjo_scm_status)" PROMPT+="%(?.. $pc[rc]exited %1v$pc[reset])" PROMPT+=" " PROMPT+="$pc[hist]%h$pc[reset] " PROMPT+="$pc[shortpath]%1~$pc[reset]" PROMPT+="\$(prompt_wunjo_scm_branch)" PROMPT+=" $vi" PROMPT+=" $pc[#]%#$pc[reset] " RPROMPT= if [ $verbose ]; then RPROMPT+="$p_date " fi RPROMPT+="$pc[user]%n$pc[reset]" RPROMPT+=" $p_line" export PROMPT RPROMPT precmd_functions+='prompt_wunjo_precmd' } prompt_wunjo_precmd() { local ex=$? psvar=() if [[ $ex -ge 128 ]]; then sig=$signals[$ex-127] psvar[1]="sig${(L)sig}" else psvar[1]="$ex" fi } prompt_wunjo_scm_status() { zgit_isgit || return local -A pc pc=(${(kv)wunjo_prompt_colors}) head=$(zgit_head) gitcommit=$(git describe --always $head 2>/dev/null) local -a commits if zgit_rebaseinfo; then orig_commit=$(git describe --always $zgit_info[rb_head]) orig_name=$(git name-rev --name-only $zgit_info[rb_head]) orig="$pc[scm_branch]$orig_name$pc[punc]($pc[scm_commitid]$orig_commit$pc[punc])" onto_commit=$(git describe --always $zgit_info[rb_onto]) onto_name=$(git name-rev --name-only $zgit_info[rb_onto]) onto="$pc[scm_branch]$onto_name$pc[punc]($pc[scm_commitid]$onto_commit$pc[punc])" if [ -n "$zgit_info[rb_upstream]" ] && [ $zgit_info[rb_upstream] != $zgit_info[rb_onto] ]; then upstream_commit=$(git describe --always $zgit_info[rb_upstream]) upstream_name=$(git name-rev --name-only $zgit_info[rb_upstream]) upstream="$pc[scm_branch]$upstream_name$pc[punc]($pc[scm_commitid]$upstream_commit$pc[punc])" commits+="rebasing $upstream$pc[reset]..$orig$pc[reset] onto $onto$pc[reset]" else commits+="rebasing $onto$pc[reset]..$orig$pc[reset]" fi local -a revs revs=($(git rev-list $zgit_info[rb_onto]..HEAD)) if [ $#revs -gt 0 ]; then commits+="\n$#revs commits in" fi if [ -f $zgit_info[dotest]/message ]; then mess=$(head -n1 $zgit_info[dotest]/message) commits+="on $mess" fi elif [ -n "$gitcommit" ]; then commits+="on $pc[scm_branch]$head$pc[punc]($pc[scm_commitid]$gitcommit$pc[punc])$pc[reset]" local track_merge=$(zgit_tracking_merge) if [ -n "$track_merge" ]; then if git rev-parse --verify -q $track_merge >/dev/null; then local track_remote=$(zgit_tracking_remote) local tracked=$(git describe --always $track_merge 2>/dev/null) local -a revs revs=($(git rev-list --reverse $track_merge..HEAD)) if [ $#revs -gt 0 ]; then local base=$(git describe --always $revs[1]~1) local base_name=$(git name-rev --name-only $base) local base_short=$(git describe --always $base) local word_commits if [ $#revs -gt 1 ]; then word_commits='commits' else word_commits='commit' fi local conj="since" if [[ "$base" == "$tracked" ]]; then conj+=" tracked" tracked= fi commits+="$#revs $word_commits $conj $pc[scm_branch]$base_name$pc[punc]($pc[scm_commitid]$base_short$pc[punc])$pc[reset]" fi if [ -n "$tracked" ]; then local track_name=$track_merge if [[ $track_remote == "." ]]; then track_name=${track_name##*/} fi tracked=$(git describe --always $tracked) commits+="tracking $pc[scm_branch]$track_name$pc[punc]" if [[ "$tracked" != "$gitcommit" ]]; then commits[$#commits]+="($pc[scm_commitid]$tracked$pc[punc])" fi commits[$#commits]+="$pc[reset]" fi fi fi fi gitsvn=$(git rev-parse --verify -q --short git-svn) if [ $? -eq 0 ]; then gitsvnrev=$(zgit_svnhead $gitsvn) gitsvn=$(git describe --always $gitsvn) if [ -n "$gitsvnrev" ]; then local svninfo='' local -a revs svninfo+="$pc[default]svn$pc[punc]:$pc[scm_branch]r$gitsvnrev" revs=($(git rev-list git-svn..HEAD)) if [ $#revs -gt 0 ]; then svninfo+="$pc[punc]@$pc[default]HEAD~$#revs" svninfo+="$pc[punc]($pc[scm_commitid]$gitsvn$pc[punc])" fi commits+=$svninfo fi fi if [ $#commits -gt 0 ]; then echo -n " ${(j: :)commits}" fi } prompt_wunjo_scm_branch() { zgit_isgit || return local -A pc pc=(${(kv)wunjo_prompt_colors}) echo -n "$pc[punc]:$pc[scm_branch]$(zgit_head)" if zgit_inworktree; then if ! zgit_isindexclean; then echo -n "$pc[scm_status_staged]+" fi local -a dirty if ! zgit_isworktreeclean; then dirty+='!' fi if zgit_hasunmerged; then dirty+='*' fi if zgit_hasuntracked; then dirty+='?' fi if [ $#dirty -gt 0 ]; then echo -n "$pc[scm_status_dirty]${(j::)dirty}" fi fi echo $pc[reset] } prompt_wunjo_setup "$@" # vim:set ft=zsh: