Skip to content

Instantly share code, notes, and snippets.

@gvvaughan
Created August 23, 2015 13:16
Show Gist options
  • Save gvvaughan/f12ef6c8bae0a89e7243 to your computer and use it in GitHub Desktop.
Save gvvaughan/f12ef6c8bae0a89e7243 to your computer and use it in GitHub Desktop.
A colorful multi-line oh-my-zsh theme with git status etc.
# Some colors
# -----------
# Expand these right away, to minimise cycles spent expanding every prompt!
# You can override these before loading the theme.
: ${GNOSIS_C1="%{$reset_color$fg[blue]%}"}
: ${GNOSIS_C2="%{$reset_color$fg_bold[green]%}"}
: ${GNOSIS_C3="%{$reset_color$fg[cyan]%}"}
: ${GNOSIS_ACCENT1="%{$reset_color$fg[yellow]%}"}
: ${GNOSIS_ACCENT2="%{$reset_color$fg_bold[white]%}"}
: ${GNOSIS_STANDOUT="%{$fg_bold[red]%}"}
# Use ACS if the terminal supports that
typeset -A altchar
set -A altchar ${(s..)terminfo[acsc]}
# Some graphics
# -------------
# Not forgetting to set some fallbacks for non-ACS capable terminals.
# You can override these before loading too.
: ${GNOSIS_ACS_HLINE="${altchar[q]:--}"}
: ${GNOSIS_ACS_VLINE="${altchar[x]:-|}"}
: ${GNOSIS_ACS_LRCORNER="${altchar[j]:-\'}"}
: ${GNOSIS_ACS_URCORNER="${altchar[k]:-.}"}
: ${GNOSIS_ACS_ULCORNER="${altchar[l]:-,}"}
: ${GNOSIS_ACS_LLCORNER="${altchar[m]:-\`}"}
: ${GNOSIS_ACS_LTEE="${altchar[t]:-|}"}
: ${GNOSIS_ACS_RTEE="${altchar[u]:-|}"}
# Prompt fragments
# ----------------
# More early expansion where you can override things before loading.
: ${GNOSIS_PREFIX1="%{$terminfo[enacs]$terminfo[smacs]%}$GNOSIS_ACS_ULCORNER$GNOSIS_ACS_HLINE$GNOSIS_ACS_RTEE%{$terminfo[rmacs]%}"}
: ${GNOSIS_PREFIX2="%{$terminfo[smacs]%}$GNOSIS_ACS_LTEE%{$terminfo[rmacs]%}"}
: ${GNOSIS_SEP="%{$reset_color$terminfo[smacs]%}$GNOSIS_ACS_VLINE%{$terminfo[rmacs]%}"}
# Format for git_prompt_info()
ZSH_THEME_GIT_PROMPT_PREFIX=$GNOSIS_SEP
ZSH_THEME_GIT_PROMPT_SUFFIX=%{$reset_color%}
# Format for parse_git_dirty()
ZSH_THEME_GIT_PROMPT_DIRTY=$GNOSIS_STANDOUT
ZSH_THEME_GIT_PROMPT_CLEAN=$GNOSIS_ACCENT2
# Format for git_prompt_status()
ZSH_THEME_GIT_PROMPT_ADDED="${GNOSIS_C1}+"
ZSH_THEME_GIT_PROMPT_MODIFIED="${GNOSIS_C2}*"
ZSH_THEME_GIT_PROMPT_RENAMED="${GNOSIS_C3}!"
ZSH_THEME_GIT_PROMPT_UNTRACKED="${GNOSIS_ACCENT1}?"
ZSH_THEME_GIT_PROMPT_DELETED="${GNOSIS_ACCENT2}-"
ZSH_THEME_GIT_PROMPT_UNMERGED="${GNOSIS_STANDOUT}<"
# Format for git_prompt_ahead()
ZSH_THEME_GIT_PROMPT_AHEAD="${GNOSIS_STANDOUT}>"
# Format for git_prompt_long_sha() and git_prompt_short_sha()
ZSH_THEME_GIT_PROMPT_SHA_BEFORE=$GNOSIS_SEP$GNOSIS_ACCENT1
ZSH_THEME_GIT_PROMPT_SHA_AFTER=%{$reset_color%}$GNOSIS_SEP
# precmd ()
# ---------
# Recalculate terminal width and padding before every prompt!
function precmd {
local TERMWIDTH
(( TERMWIDTH = $COLUMNS - 1 )) # RPROMPT leaves one space unused
# Truncate the path if it's too long
GNOSIS_PAD=0
GNOSIS_TILDELEN=''
promptstrip=$(echo "${(e):-$GNOSIS_LEFT$GNOSIS_RIGHT}" \
|sed -e :a -e 's/%{[^}]*%}//g;/%{/N;//ba')
promptsize=${#${(%):-$promptstrip}}
pwdsize=${#${(%):-%~}}
if [[ "$promptsize + $pwdsize" -gt $TERMWIDTH ]]; then
(( GNOSIS_TILDELEN = $TERMWIDTH - $promptsize ))
else
(( GNOSIS_PAD = $TERMWIDTH - $promptsize - $pwdsize ))
fi
}
# git_prompt_info ()
# ------------------
# Overrides the oh-my-zsh definition to use $(parse_git_dirty) to change
# colors rather than print extra symbols.
function git_prompt_info() {
ref=$(git symbolic-ref HEAD 2> /dev/null) || return
echo "$ZSH_THEME_GIT_PROMPT_PREFIX$(parse_git_dirty)${ref#refs/heads/}$ZSH_THEME_GIT_PROMPT_SUFFIX"
}
# gnosis_shlvl ()
# ---------------
# Show the value of $SHLVL if it is greater than 1.
function gnosis_shlvl {
test 1 = "$SHLVL" && return
echo "$GNOSIS_SEP$GNOSIS_ACCENT2^$SHLVL%{$reset_color%}"
}
# gnosis_stopped_jobs ()
# ----------------------
# Show a reminder in the prompt if there are any stopped jobs still
# attached to the shell.
function gnosis_stopped_jobs {
local stopped=`jobs -s | wc -l | sed 's| *||'`
[ $stopped -gt 0 ] && print "$GNOSIS_SEP$GNOSIS_STANDOUT$stopped stopped%{$reset_color%}$GNOSIS_SEP"
}
## ------------- ##
## Prompt format ##
## ------------- ##
# These two form the left and right sides of the second line of the
# prompt, their widths are counted so anything that might take up
# character cells needs to be in here, and not later.
#
# Note that the function calls are escaped, because we don't want
# to call them right now, but every time the prompt is displayed!
GNOSIS_LEFT="$GNOSIS_PREFIX1$GNOSIS_C1%n%{$reset_color%}@$GNOSIS_C1%m$GNOSIS_SEP"
GNOSIS_RIGHT=" \$(git_prompt_ahead)\$(git_prompt_status)\$(parse_git_dirty)\$(git_prompt_info)%{$reset_color%}\$(git_prompt_short_sha)"
# Main prompt
# -----------
# Print GNOSIS_LEFT up against the left side of the terminal, and
# GNOSIS_RIGHT up against the right side with the current directory in
# the gap, adding any additional padding dynamically.
PROMPT="
$GNOSIS_LEFT$GNOSIS_C2%\$GNOSIS_TILDELEN<...<%~%<<%{$reset_color%}\${(l.\$GNOSIS_PAD.. .)}$GNOSIS_RIGHT
$GNOSIS_PREFIX2$GNOSIS_ACCENT1!%!\$(gnosis_shlvl)%(?,,$GNOSIS_SEP${GNOSIS_STANDOUT}?%?)%{$reset_color%}="
RPROMPT="$GNOSIS_STANDOUT\$(gnosis_stopped_jobs)%{$reset_color%}"
PS2="$GNOSIS_PREFIX2$GNOSIS_ACCENT1!%!%{$reset_color%}+${GNOSIS_C1}%_%{$reset_color%}="
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment