|
# vim:ft=zsh ts=2 sw=2 sts=2 |
|
# |
|
# agnoster's Theme - https://gist.github.com/3712874 |
|
# A Powerline-inspired theme for 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. |
|
|
|
### Segment drawing |
|
# A few utility functions to make it easy and re-usable to draw segmented prompts |
|
|
|
CURRENT_BG='NONE' |
|
PRIMARY_FG=black |
|
|
|
# Characters |
|
SEGMENT_SEPARATOR="\ue0b0" |
|
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 bg fg |
|
[[ -n $1 ]] && bg="%K{$1}" || bg="%k" |
|
[[ -n $2 ]] && fg="%F{$2}" || 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 $3 ]] && print -n $3 |
|
} |
|
|
|
# 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 -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() { |
|
local user=`whoami` |
|
|
|
if [[ "$user" != "$DEFAULT_USER" || -n "$SSH_CONNECTION" ]]; then |
|
prompt_segment $PRIMARY_FG default " %(!.%{%F{yellow}%}.)$user@%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 $PRIMARY_FG |
|
print -Pn " $ref" |
|
fi |
|
} |
|
|
|
# Dir: current working directory |
|
prompt_dir() { |
|
prompt_segment blue $PRIMARY_FG ' %~ ' |
|
} |
|
|
|
# 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 $PRIMARY_FG default " $symbols " |
|
} |
|
|
|
## Main prompt |
|
prompt_agnoster_main() { |
|
RETVAL=$? |
|
CURRENT_BG='NONE' |
|
prompt_status |
|
prompt_context |
|
prompt_dir |
|
prompt_git |
|
prompt_end |
|
} |
|
|
|
prompt_agnoster_precmd() { |
|
vcs_info |
|
PROMPT='%{%f%b%k%}$(prompt_agnoster_main) ' |
|
} |
|
|
|
prompt_agnoster_setup() { |
|
autoload -Uz add-zsh-hook |
|
autoload -Uz vcs_info |
|
|
|
prompt_opts=(cr subst percent) |
|
|
|
add-zsh-hook precmd prompt_agnoster_precmd |
|
|
|
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)' |
|
} |
|
|
|
prompt_agnoster_setup "$@" |
It's unfortunate that gist's don't have issue reporting features. Anyhow I wanted to make note of something I discovered and subsequently fixed after the agnoster theme was initially borked for me. When you are using a distro that does not name its ifconfig interfaces according to the standard naming convention (I'm looking at you, Ubuntu >-<), it causes an error to appear below every carriage return you feed into the terminal.
To fix this, I recommend introducing a loop that checks for connected and configured interfaces by calling ifconfig -a and doing some parsing to pull a list of the configured interfaces. Here is how I did it using standard bash commands:
You can further narrow it down by pulling the ethernet interface which, even though it's not convention, universally starts with 'e' in the interface name, and the same is true for 'w' on wireless interfaces. If you introduce a new function in your agnoster theme that checks for this, it can save a lot of people some headache and confusion when first running the script. 👍