# vim:ft=zsh ts=2 sw=2 sts=2 | |
# | |
# Minorister | |
# Dirty mix of agnoster and paradox theme, now only with foreground colours! | |
# I missed paradox theme of prezto even after installing oh-my-zsh | |
# | |
# | |
# # README | |
# | |
# In order for this theme to render correctly, you will need a | |
# [Powerline-patched font](https://gist.github.com/1595572). | |
# | |
# In addition, I recommend the | |
# [Solarized theme](https://github.com/altercation/solarized/) and, if you're | |
# using it on Mac OS X, [iTerm 2](http://www.iterm2.com/) over Terminal.app - | |
# it has significantly better color fidelity. | |
# | |
# # Goals | |
# | |
# The aim of this theme is to only show you *relevant* information. Like most | |
# prompts, it will only show git information when in a git working directory. | |
# However, it goes a step further: everything from the current user and | |
# hostname to whether the last call exited with an error to whether background | |
# jobs are running in this shell will all be displayed automatically when | |
# appropriate. | |
### Segments of the prompt, default order declaration | |
typeset -aHg AGNOSTER_PROMPT_SEGMENTS=( | |
prompt_status | |
prompt_context | |
prompt_virtualenv | |
prompt_dir | |
prompt_git | |
prompt_end | |
) | |
### Segment drawing | |
# A few utility functions to make it easy and re-usable to draw segmented prompts | |
CURRENT_BG='NONE' | |
if [[ -z "$PRIMARY_FG" ]]; then | |
PRIMARY_FG=black | |
fi | |
# Characters | |
# SEGMENT_SEPARATOR="\ue0b0" | |
SEGMENT_SEPARATOR="" | |
PLUSMINUS="\u00b1" | |
BRANCH="\ue0a0" | |
DETACHED="\u27a6" | |
CROSS="\u2718" | |
LIGHTNING="\u26a1" | |
GEAR="\u2699" | |
# Begin a segment | |
# Takes two arguments, background and foreground. Both can be omitted, | |
# rendering default background/foreground. | |
prompt_segment() { | |
local fg | |
bg="%k" | |
[[ -n $1 ]] && fg="%F{$1}" || fg="%f" | |
if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then | |
print -n "%{$bg%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR%{$fg%}" | |
else | |
print -n "%{$bg%}%{$fg%}" | |
fi | |
CURRENT_BG=$1 | |
[[ -n $2 ]] && print -n $2 | |
} | |
# End the prompt, closing any open segments | |
prompt_end() { | |
if [[ -n $CURRENT_BG ]]; then | |
print -n "%{%k%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR" | |
else | |
print -n "%{%k%}" | |
fi | |
print "" | |
print -n "%F{blue}❯%f" | |
CURRENT_BG='' | |
} | |
### Prompt components | |
# Each component will draw itself, and hide itself if no information needs to be shown | |
# Context: user@hostname (who am I and where am I) | |
prompt_context() { | |
local user=`whoami` | |
if [[ "$user" != "$DEFAULT_USER" || -n "$SSH_CONNECTION" ]]; then | |
prompt_segment $PRIMARY_FG "%(!.%{%F{yellow}%}.)%{%F{blue}%}$USER%{%F{red}%}@%{%F{green}%}%m " | |
fi | |
} | |
# Git: branch/detached head, dirty status | |
prompt_git() { | |
local color ref | |
is_dirty() { | |
test -n "$(git status --porcelain --ignore-submodules)" | |
} | |
ref="$vcs_info_msg_0_" | |
if [[ -n "$ref" ]]; then | |
if is_dirty; then | |
color=yellow | |
ref="${ref} $PLUSMINUS" | |
else | |
color=green | |
ref="${ref} " | |
fi | |
if [[ "${ref/.../}" == "$ref" ]]; then | |
ref="$BRANCH $ref" | |
else | |
ref="$DETACHED ${ref/.../}" | |
fi | |
prompt_segment $color | |
print -n " $ref" | |
fi | |
} | |
# Dir: current working directory | |
prompt_dir() { | |
prompt_segment blue ' %~ ' | |
} | |
# Status: | |
# - was there an error | |
# - am I root | |
# - are there background jobs? | |
prompt_status() { | |
local symbols | |
symbols=() | |
[[ $RETVAL -ne 0 ]] && symbols+="%{%F{red}%}$CROSS" | |
[[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}$LIGHTNING" | |
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}$GEAR" | |
[[ -n "$symbols" ]] && prompt_segment default " $symbols " | |
} | |
# Display current virtual environment | |
prompt_virtualenv() { | |
if [[ -n $VIRTUAL_ENV ]]; then | |
color=cyan | |
prompt_segment $color | |
print -Pn " $(basename $VIRTUAL_ENV) " | |
fi | |
} | |
## Main prompt | |
prompt_agnoster_main() { | |
RETVAL=$? | |
CURRENT_BG='NONE' | |
for prompt_segment in "${AGNOSTER_PROMPT_SEGMENTS[@]}"; do | |
[[ -n $prompt_segment ]] && $prompt_segment | |
done | |
} | |
start_time_minorister=$SECONDS | |
prompt_agnoster_precmd() { | |
timer_result=$(($SECONDS-$start_time_minorister)) | |
if [[ $timer_result -gt 10 ]]; then | |
calc_elapsed_time | |
fi | |
vcs_info | |
PROMPT='%{%f%b%k%}$(prompt_agnoster_main) ' | |
RPROMPT='%F{blue}[%f%F{green}%D{%H:%M:%S}%f%F{blue}]%f' | |
} | |
prompt_agnoster_preexec() { | |
start_time_minorister=$SECONDS | |
} | |
prompt_agnoster_setup() { | |
autoload -Uz add-zsh-hook | |
autoload -Uz vcs_info | |
prompt_opts=(cr subst percent) | |
add-zsh-hook precmd prompt_agnoster_precmd | |
add-zsh-hook preexec prompt_agnoster_preexec | |
zstyle ':vcs_info:*' enable git | |
zstyle ':vcs_info:*' check-for-changes false | |
zstyle ':vcs_info:git*' formats '%b' | |
zstyle ':vcs_info:git*' actionformats '%b (%a)' | |
} | |
calc_elapsed_time() { | |
if [[ $timer_result -ge 3600 ]]; then | |
let "timer_hours = $timer_result / 3600" | |
let "remainder = $timer_result % 3600" | |
let "timer_minutes = $remainder / 60" | |
let "timer_seconds = $remainder % 60" | |
print -P "%B%F{red}>>> elapsed time ${timer_hours}h${timer_minutes}m${timer_seconds}s%b%f" | |
elif [[ $timer_result -ge 60 ]]; then | |
let "timer_minutes = $timer_result / 60" | |
let "timer_seconds = $timer_result % 60" | |
print -P "%B%F{yellow}>>> elapsed time ${timer_minutes}m${timer_seconds}s%b%f" | |
elif [[ $timer_result -gt 10 ]]; then | |
print -P "%B%F{green}>>> elapsed time ${timer_result}s%b%f" | |
fi | |
} | |
prompt_agnoster_setup "$@" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment