Created
June 18, 2017 16:43
-
-
Save louisfisch/ba0999875b73704e629636e6af0c6458 to your computer and use it in GitHub Desktop.
My custom agnoster 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 | |
# Original Agnoster's theme - https://gist.github.com/3712874 | |
# A Powerline-inspired theme for ZSH | |
# 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" | |
# 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' | |
} | |
# 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}%}.)$USER@%m" | |
fi | |
} | |
# Git VCS prompt | |
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 | |
ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="➦ $(git rev-parse --short HEAD 2> /dev/null)" | |
# If files are not added | |
if [[ $(git ls-files --exclude-standard --others) ]]; then | |
prompt_segment red black | |
# If changes are not committed | |
elif [[ -n $(parse_git_dirty) ]]; then | |
prompt_segment yellow black | |
# If working directory is clean | |
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 }${mode}" | |
fi | |
} | |
# Bazaar VCS prompt | |
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 | |
} | |
# Mercurial VCS prompt | |
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 | |
prompt_segment red white | |
st='±' | |
elif [[ -n $(hg prompt "{status|modified}") ]]; then | |
prompt_segment yellow black | |
st='±' | |
else | |
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 | |
} | |
# Current working directory | |
prompt_dir() { | |
prompt_segment blue black '%~' | |
} | |
# 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) ' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment