From cd42812c9bbeff378612482a8f34886d062d0931 Mon Sep 17 00:00:00 2001 From: Richard Maynard Date: Wed, 6 Nov 2013 13:06:22 -0600 Subject: [PATCH 1/4] fix virtualenv's with virtualenv plugin / prompt display Virtual Env modifies the prompt in such a way that when used with agnoster the virtualenv will be displayed twice. Using the virtualenv oh-my-zsh plugin disables this behavior (simply because it disables the virtual env prompt mangling) however when using the plugin it would be nice to keep the single prompt display as expected, and still allow for the function to provide prompt info which other themes may use. --- plugins/virtualenv/virtualenv.plugin.zsh | 1 + themes/agnoster.zsh-theme | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/virtualenv/virtualenv.plugin.zsh b/plugins/virtualenv/virtualenv.plugin.zsh index 8e06450b1..774bf88b5 100644 --- a/plugins/virtualenv/virtualenv.plugin.zsh +++ b/plugins/virtualenv/virtualenv.plugin.zsh @@ -6,3 +6,4 @@ function virtualenv_prompt_info(){ # disables prompt mangling in virtual_env/bin/activate export VIRTUAL_ENV_DISABLE_PROMPT=1 +export VIRTUAL_ENV_DISABLE_PROMPT_BY_PLUGIN=1 diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme index 2db565266..3b720feb2 100644 --- a/themes/agnoster.zsh-theme +++ b/themes/agnoster.zsh-theme @@ -137,7 +137,11 @@ prompt_dir() { # Virtualenv: current working virtualenv prompt_virtualenv() { local virtualenv_path="$VIRTUAL_ENV" - if [[ -n $virtualenv_path && -z $VIRTUAL_ENV_DISABLE_PROMPT ]]; then + if [[ -n $virtualenv_path && + ( -z $VIRTUAL_ENV_DISABLE_PROMPT || + ( -n $VIRTUAL_ENV_DISABLE_PROMPT && + -n $VIRTUAL_ENV_DISABLE_PROMPT_BY_PLUGIN ) + ) ]]; then prompt_segment blue black "(`basename $virtualenv_path`)" fi } From ee3a77b146300b1565ad2629a79ae8d155023956 Mon Sep 17 00:00:00 2001 From: Richard Maynard Date: Wed, 6 Nov 2013 14:01:00 -0600 Subject: [PATCH 2/4] adapting agnoster for my personal use --- themes/ephur.zsh-theme | 197 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 themes/ephur.zsh-theme diff --git a/themes/ephur.zsh-theme b/themes/ephur.zsh-theme new file mode 100644 index 000000000..69482cf11 --- /dev/null +++ b/themes/ephur.zsh-theme @@ -0,0 +1,197 @@ +# 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' +SEGMENT_SEPARATOR='' + +# 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() { + local user=`whoami` + + if [[ "$user" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then + prompt_segment black default "%(!.%{%F{yellow}%}.)$user@%m" + fi +} + +# Git: branch/detached head, dirty status +prompt_git() { + local ref dirty + 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 show-ref --head -s --abbrev |head -n1 2> /dev/null)" + if [[ -n $dirty ]]; then + prompt_segment yellow black + else + prompt_segment green black + 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:git:*' unstagedstr '●' + zstyle ':vcs_info:*' formats ' %u%c' + zstyle ':vcs_info:*' actionformats '%u%c' + vcs_info + echo -n "${ref/refs\/heads\//± }${vcs_info_msg_0_}" + fi +} + +prompt_hg() { + 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 -Eq "^\?"`; then + prompt_segment red black + st='±' + elif `hg st | grep -Eq "^(M|A)"`; 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 && + ( -z $VIRTUAL_ENV_DISABLE_PROMPT || + ( -n $VIRTUAL_ENV_DISABLE_PROMPT && + -n $VIRTUAL_ENV_DISABLE_PROMPT_BY_PLUGIN ) + ) ]]; 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" +} + + +prompt_battery_pct() { + local pct=$(battery_pct_remaining) + local color + if [ ${pct} = "External" ]; then + color='green' + pct='∞' + elif [ ${pct} -gt 50 ]; then + color='green' + pct="${pct}%%" + elif [ ${pct} -gt 25 ]; then + color='yellow' + pct="LOW:${pct}%%" + else + color='red' + pct="DANGER:${pct}%%" + fi + prompt_segment ${color} default ${pct} +} + + +## Main prompt +build_prompt() { + RETVAL=$? + prompt_status + prompt_battery_pct + prompt_virtualenv + prompt_context + prompt_dir + prompt_git + prompt_hg + prompt_end +} + +PROMPT='%{%f%b%k%}$(build_prompt) ' From e6483745a3b84a9d0593d68c90c9e41ad092d781 Mon Sep 17 00:00:00 2001 From: Richard Maynard Date: Wed, 6 Nov 2013 14:27:17 -0600 Subject: [PATCH 3/4] fixed colorize for OSX exit -1 destroys a terminal, now returns -1 which doesn't return just a path, so awked out the last field --- plugins/colorize/colorize.plugin.zsh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/colorize/colorize.plugin.zsh b/plugins/colorize/colorize.plugin.zsh index 0696607d9..bc597328a 100644 --- a/plugins/colorize/colorize.plugin.zsh +++ b/plugins/colorize/colorize.plugin.zsh @@ -6,9 +6,9 @@ alias colorize='colorize_via_pygmentize' colorize_via_pygmentize() { - if [ ! -x $(which pygmentize) ]; then + if [ ! -x $(which pygmentize | awk ' { print $(NF) } ') ]; then echo package \'pygmentize\' is not installed! - exit -1 + return -1 fi if [ $# -eq 0 ]; then @@ -25,4 +25,4 @@ colorize_via_pygmentize() { pygmentize -g "$FNAME" fi done -} \ No newline at end of file +} From 2315523996fec8980e4759939d3cc1984699a405 Mon Sep 17 00:00:00 2001 From: Richard Maynard Date: Mon, 3 Feb 2014 12:11:44 -0600 Subject: [PATCH 4/4] my modified prompt --- themes/ephur.zsh-theme | 46 ++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/themes/ephur.zsh-theme b/themes/ephur.zsh-theme index 69482cf11..c755bb639 100644 --- a/themes/ephur.zsh-theme +++ b/themes/ephur.zsh-theme @@ -1,26 +1,32 @@ # vim:ft=zsh ts=2 sw=2 sts=2 # -# agnoster's Theme - https://gist.github.com/3712874 -# A Powerline-inspired theme for ZSH +# Adapted from agnoster's theme (a great work) +# agnoster's Theme - https://gist.github.com/3712874 +# 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. +# Requirements +# A powerline patched font +# Solarized colors look best as in agnosters original theme +# Oh My ZSH Plugins Used by me: +# git +# gem +# urltools +# sublime +# ssh-agent +# screen +# ruby +# python +# osx +# nyan +# brew +# knife +# gnu-utils +# github +# git-flow +# virtualenv +# git-remote-branch +# battery +# ### Segment drawing # A few utility functions to make it easy and re-usable to draw segmented prompts