Last active
February 8, 2017 01:51
-
-
Save Mnkai/291682e97f866c4beaa315330451b9fd to your computer and use it in GitHub Desktop.
Minorister oh-my-zsh theme
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# vim:ft=zsh ts=2 sw=2 sts=2 | |
# | |
# Minorister | |
# Dirty mix of agnoster and paradox theme | |
# 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://github.com/Lokaltog/powerline-fonts). | |
# Make sure you have a recent version: the code points that Powerline | |
# uses changed in 2012, and older versions will display incorrectly, | |
# in confusing ways. | |
### Segment drawing | |
# A few utility functions to make it easy and re-usable to draw segmented prompts | |
CURRENT_BG='NONE' | |
# Special Powerline characters | |
() { | |
local LC_ALL="" LC_CTYPE="en_US.UTF-8" | |
# NOTE: This segment separator character is correct. In 2012, Powerline changed | |
# the code points they use for their special characters. This is the new code point. | |
# If this is not working for you, you probably have an old version of the | |
# Powerline-patched fonts installed. Download and install the new version. | |
# Do not submit PRs to change this unless you have reviewed the Powerline code point | |
# history and have new information. | |
# This is defined using a Unicode escape sequence so it is unambiguously readable, regardless of | |
# what font the user is viewing this source code in. Do not replace the | |
# escape sequence with a single literal character. | |
# Do not change this! Do not make it '\u2b80'; that is the old, wrong code point. | |
SEGMENT_SEPARATOR=$'\ue0b0' | |
autoload -Uz add-zsh-hook | |
add-zsh-hook preexec prompt_paradox_preexec | |
add-zsh-hook precmd prompt_paradox_precmd | |
# Empty line for first startup | |
echo -n " | |
" | |
} | |
# Begin a segment | |
# Takes two arguments, background and foreground. Both can be omitted, | |
# rendering default background/foreground. | |
prompt_segment() { | |
local bg fg | |
[[ -n $1 ]] && bg="%K{$1}" || bg="%k" | |
[[ -n $2 ]] && fg="%F{$2}" || fg="%f" | |
if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then | |
echo -n " %{$bg%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR%{$fg%} " | |
else | |
echo -n "%{$bg%}%{$fg%} " | |
fi | |
CURRENT_BG=$1 | |
[[ -n $3 ]] && echo -n $3 | |
} | |
# End the prompt, closing any open segments | |
prompt_end() { | |
if [[ -n $CURRENT_BG ]]; then | |
echo -n " %{%k%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR" | |
else | |
echo -n "%{%k%}" | |
fi | |
echo -n "%{%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() { | |
if [[ "$USER" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then | |
prompt_segment black default "%(!.%{%F{yellow}%}.)%{%F{blue}%}$USER%{%F{red}%}@%{%F{green}%}%m" | |
fi | |
} | |
# Git: branch/detached head, dirty status | |
prompt_git() { | |
(( $+commands[git] )) || return | |
local PL_BRANCH_CHAR | |
() { | |
local LC_ALL="" LC_CTYPE="en_US.UTF-8" | |
PL_BRANCH_CHAR=$'\ue0a0' # | |
} | |
local ref dirty mode repo_path | |
repo_path=$(git rev-parse --git-dir 2>/dev/null) | |
if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then | |
dirty=$(parse_git_dirty) | |
ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="➦ $(git rev-parse --short HEAD 2> /dev/null)" | |
if [[ -n $dirty ]]; then | |
prompt_segment yellow black | |
else | |
prompt_segment green black | |
fi | |
if [[ -e "${repo_path}/BISECT_LOG" ]]; then | |
mode=" <B>" | |
elif [[ -e "${repo_path}/MERGE_HEAD" ]]; then | |
mode=" >M<" | |
elif [[ -e "${repo_path}/rebase" || -e "${repo_path}/rebase-apply" || -e "${repo_path}/rebase-merge" || -e "${repo_path}/../.dotest" ]]; then | |
mode=" >R>" | |
fi | |
setopt promptsubst | |
autoload -Uz vcs_info | |
zstyle ':vcs_info:*' enable git | |
zstyle ':vcs_info:*' get-revision true | |
zstyle ':vcs_info:*' check-for-changes true | |
zstyle ':vcs_info:*' stagedstr '✚' | |
zstyle ':vcs_info:*' unstagedstr '●' | |
zstyle ':vcs_info:*' formats ' %u%c' | |
zstyle ':vcs_info:*' actionformats ' %u%c' | |
vcs_info | |
echo -n "${ref/refs\/heads\//$PL_BRANCH_CHAR }${vcs_info_msg_0_%% }${mode}" | |
fi | |
} | |
prompt_bzr() { | |
(( $+commands[bzr] )) || return | |
if (bzr status >/dev/null 2>&1); then | |
status_mod=`bzr status | head -n1 | grep "modified" | wc -m` | |
status_all=`bzr status | head -n1 | wc -m` | |
revision=`bzr log | head -n2 | tail -n1 | sed 's/^revno: //'` | |
if [[ $status_mod -gt 0 ]] ; then | |
prompt_segment yellow black | |
echo -n "bzr@"$revision "✚ " | |
else | |
if [[ $status_all -gt 0 ]] ; then | |
prompt_segment yellow black | |
echo -n "bzr@"$revision | |
else | |
prompt_segment green black | |
echo -n "bzr@"$revision | |
fi | |
fi | |
fi | |
} | |
prompt_hg() { | |
(( $+commands[hg] )) || return | |
local rev status | |
if $(hg id >/dev/null 2>&1); then | |
if $(hg prompt >/dev/null 2>&1); then | |
if [[ $(hg prompt "{status|unknown}") = "?" ]]; then | |
# if files are not added | |
prompt_segment red white | |
st='±' | |
elif [[ -n $(hg prompt "{status|modified}") ]]; then | |
# if any modification | |
prompt_segment yellow black | |
st='±' | |
else | |
# if working copy is clean | |
prompt_segment green black | |
fi | |
echo -n $(hg prompt "☿ {rev}@{branch}") $st | |
else | |
st="" | |
rev=$(hg id -n 2>/dev/null | sed 's/[^-0-9]//g') | |
branch=$(hg id -b 2>/dev/null) | |
if `hg st | grep -q "^\?"`; then | |
prompt_segment red black | |
st='±' | |
elif `hg st | grep -q "^[MA]"`; then | |
prompt_segment yellow black | |
st='±' | |
else | |
prompt_segment green black | |
fi | |
echo -n "☿ $rev@$branch" $st | |
fi | |
fi | |
} | |
# Dir: current working directory | |
prompt_dir() { | |
prompt_segment blue black '%~' | |
} | |
# Virtualenv: current working virtualenv | |
prompt_virtualenv() { | |
local virtualenv_path="$VIRTUAL_ENV" | |
if [[ -n $virtualenv_path && -n $VIRTUAL_ENV_DISABLE_PROMPT ]]; then | |
prompt_segment blue black "(`basename $virtualenv_path`)" | |
fi | |
} | |
# Status: | |
# - was there an error | |
# - am I root | |
# - are there background jobs? | |
prompt_status() { | |
local symbols | |
symbols=() | |
[[ $RETVAL -ne 0 ]] && symbols+="%{%F{red}%}✘" | |
[[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}⚡" | |
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}⚙" | |
[[ -n "$symbols" ]] && prompt_segment black default "$symbols" | |
} | |
## Main prompt | |
build_prompt() { | |
RETVAL=$? | |
prompt_status | |
prompt_virtualenv | |
prompt_context | |
prompt_dir | |
prompt_git | |
prompt_bzr | |
prompt_hg | |
prompt_end | |
} | |
PROMPT='%{%f%b%k%}$(build_prompt) | |
%F{blue}❯%f ' | |
RPROMPT='%F{blue}[%f%F{green}%D{%H:%M:%S}%f%F{blue}]%f' | |
SPROMPT='zsh: correct %F{red}%R%f to %F{green}%r%f [nyae]? ' | |
start_time_minorister=$SECONDS | |
function prompt_paradox_preexec { | |
start_time_minorister=$SECONDS | |
} | |
function prompt_paradox_precmd { | |
timer_result=$(($SECONDS-$start_time_minorister)) | |
if [[ $timer_result -gt 10 ]]; then | |
calc_elapsed_time | |
fi | |
start_time_minorister=$SECONDS | |
} | |
function 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" | |
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" | |
elif [[ $timer_result -gt 10 ]]; then | |
print -P "%B%F{green}>>> elapsed time ${timer_result}s%b" | |
fi | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment