diff --git a/themes/gnosis.zsh-theme b/themes/gnosis.zsh-theme new file mode 100644 index 000000000..4b58a07da --- /dev/null +++ b/themes/gnosis.zsh-theme @@ -0,0 +1,134 @@ +# 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%}="