blob: 21fab1ee20404f619010193c35edebb99fd267cc (
plain) (
tree)
|
|
# 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:
|