summaryrefslogtreecommitdiff
path: root/themes/agnoster.zsh-theme
diff options
context:
space:
mode:
authorTuowen Zhao <ztuowen@gmail.com>2026-01-04 22:47:54 -0800
committerTuowen Zhao <ztuowen@gmail.com>2026-01-04 22:47:54 -0800
commit2aa4cb7a52b28722816ecfd55f3b06293332c55c (patch)
treef02a9f3d59d109c70caf932a24e43368994e0e8c /themes/agnoster.zsh-theme
parent7e951c254e779ff0620537cf43ca69dd878387b4 (diff)
parentd23d3ea69fdb839088e6e5589557cce77b34aaf8 (diff)
downloadzsh-2aa4cb7a52b28722816ecfd55f3b06293332c55c.tar.gz
zsh-2aa4cb7a52b28722816ecfd55f3b06293332c55c.tar.bz2
zsh-2aa4cb7a52b28722816ecfd55f3b06293332c55c.zip
Merge remote-tracking branch 'github/master'HEADmaster
Diffstat (limited to 'themes/agnoster.zsh-theme')
-rw-r--r--themes/agnoster.zsh-theme202
1 files changed, 154 insertions, 48 deletions
diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme
index af0c33754..f646eabe8 100644
--- a/themes/agnoster.zsh-theme
+++ b/themes/agnoster.zsh-theme
@@ -35,10 +35,74 @@
CURRENT_BG='NONE'
case ${SOLARIZED_THEME:-dark} in
- light) CURRENT_FG='white';;
- *) CURRENT_FG='black';;
+ light)
+ CURRENT_FG=${CURRENT_FG:-'white'}
+ CURRENT_DEFAULT_FG=${CURRENT_DEFAULT_FG:-'white'}
+ ;;
+ *)
+ CURRENT_FG=${CURRENT_FG:-'black'}
+ CURRENT_DEFAULT_FG=${CURRENT_DEFAULT_FG:-'default'}
+ ;;
esac
+### Theme Configuration Initialization
+#
+# Override these settings in your ~/.zshrc
+
+# Current working directory
+: ${AGNOSTER_DIR_FG:=${CURRENT_FG}}
+: ${AGNOSTER_DIR_BG:=blue}
+
+# user@host
+: ${AGNOSTER_CONTEXT_FG:=${CURRENT_DEFAULT_FG}}
+: ${AGNOSTER_CONTEXT_BG:=black}
+
+# Git related
+: ${AGNOSTER_GIT_CLEAN_FG:=${CURRENT_FG}}
+: ${AGNOSTER_GIT_CLEAN_BG:=green}
+: ${AGNOSTER_GIT_DIRTY_FG:=black}
+: ${AGNOSTER_GIT_DIRTY_BG:=yellow}
+
+# Bazaar related
+: ${AGNOSTER_BZR_CLEAN_FG:=${CURRENT_FG}}
+: ${AGNOSTER_BZR_CLEAN_BG:=green}
+: ${AGNOSTER_BZR_DIRTY_FG:=black}
+: ${AGNOSTER_BZR_DIRTY_BG:=yellow}
+
+# Mercurial related
+: ${AGNOSTER_HG_NEWFILE_FG:=white}
+: ${AGNOSTER_HG_NEWFILE_BG:=red}
+: ${AGNOSTER_HG_CHANGED_FG:=black}
+: ${AGNOSTER_HG_CHANGED_BG:=yellow}
+: ${AGNOSTER_HG_CLEAN_FG:=${CURRENT_FG}}
+: ${AGNOSTER_HG_CLEAN_BG:=green}
+
+# VirtualEnv colors
+: ${AGNOSTER_VENV_FG:=black}
+: ${AGNOSTER_VENV_BG:=blue}
+
+# AWS Profile colors
+: ${AGNOSTER_AWS_PROD_FG:=yellow}
+: ${AGNOSTER_AWS_PROD_BG:=red}
+: ${AGNOSTER_AWS_FG:=black}
+: ${AGNOSTER_AWS_BG:=green}
+
+# Status symbols
+: ${AGNOSTER_STATUS_RETVAL_FG:=red}
+: ${AGNOSTER_STATUS_ROOT_FG:=yellow}
+: ${AGNOSTER_STATUS_JOB_FG:=cyan}
+: ${AGNOSTER_STATUS_FG:=${CURRENT_DEFAULT_FG}}
+: ${AGNOSTER_STATUS_BG:=black}
+
+## Non-Color settings - set to 'true' to enable
+# Show the actual numeric return value rather than a cross symbol.
+: ${AGNOSTER_STATUS_RETVAL_NUMERIC:=false}
+# Show git working dir in the style "/git/root   master  relative/dir" instead of "/git/root/relative/dir   master"
+: ${AGNOSTER_GIT_INLINE:=false}
+# Show the git branch status in the prompt rather than the generic branch symbol
+: ${AGNOSTER_GIT_BRANCH_STATUS:=true}
+
+
# Special Powerline characters
() {
@@ -83,20 +147,40 @@ prompt_end() {
CURRENT_BG=''
}
+git_toplevel() {
+ local repo_root=$(git rev-parse --show-toplevel)
+ if [[ $repo_root = '' ]]; then
+ # We are in a bare repo. Use git dir as root
+ repo_root=$(git rev-parse --git-dir)
+ if [[ $repo_root = '.' ]]; then
+ repo_root=$PWD
+ fi
+ fi
+ echo -n $repo_root
+}
+
### 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 [[ "$USERNAME" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then
- prompt_segment black default "%(!.%{%F{yellow}%}.)%n@%m"
+ prompt_segment "$AGNOSTER_CONTEXT_BG" "$AGNOSTER_CONTEXT_FG" "%(!.%{%F{$AGNOSTER_STATUS_ROOT_FG}%}.)%n@%m"
fi
}
+prompt_git_relative() {
+ local repo_root=$(git_toplevel)
+ local path_in_repo=$(pwd | sed "s/^$(echo "$repo_root" | sed 's:/:\\/:g;s/\$/\\$/g')//;s:^/::;s:/$::;")
+ if [[ $path_in_repo != '' ]]; then
+ prompt_segment "$AGNOSTER_DIR_BG" "$AGNOSTER_DIR_FG" "$path_in_repo"
+ fi;
+}
+
# Git: branch/detached head, dirty status
prompt_git() {
(( $+commands[git] )) || return
- if [[ "$(git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]]; then
+ if [[ "$(command git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]]; then
return
fi
local PL_BRANCH_CHAR
@@ -106,27 +190,29 @@ prompt_git() {
}
local ref dirty mode repo_path
- if [[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]]; then
- repo_path=$(git rev-parse --git-dir 2>/dev/null)
+ if [[ "$(command git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]]; then
+ repo_path=$(command git rev-parse --git-dir 2>/dev/null)
dirty=$(parse_git_dirty)
- ref=$(git symbolic-ref HEAD 2> /dev/null) || \
- ref="◈ $(git describe --exact-match --tags HEAD 2> /dev/null)" || \
- ref="➦ $(git rev-parse --short HEAD 2> /dev/null)"
+ ref=$(command git symbolic-ref HEAD 2> /dev/null) || \
+ ref="◈ $(command git describe --exact-match --tags HEAD 2> /dev/null)" || \
+ ref="➦ $(command git rev-parse --short HEAD 2> /dev/null)"
if [[ -n $dirty ]]; then
- prompt_segment yellow black
+ prompt_segment "$AGNOSTER_GIT_DIRTY_BG" "$AGNOSTER_GIT_DIRTY_FG"
else
- prompt_segment green $CURRENT_FG
+ prompt_segment "$AGNOSTER_GIT_CLEAN_BG" "$AGNOSTER_GIT_CLEAN_FG"
fi
- local ahead behind
- ahead=$(git log --oneline @{upstream}.. 2>/dev/null)
- behind=$(git log --oneline ..@{upstream} 2>/dev/null)
- if [[ -n "$ahead" ]] && [[ -n "$behind" ]]; then
- PL_BRANCH_CHAR=$'\u21c5'
- elif [[ -n "$ahead" ]]; then
- PL_BRANCH_CHAR=$'\u21b1'
- elif [[ -n "$behind" ]]; then
- PL_BRANCH_CHAR=$'\u21b0'
+ if [[ $AGNOSTER_GIT_BRANCH_STATUS == 'true' ]]; then
+ local ahead behind
+ ahead=$(command git log --oneline @{upstream}.. 2>/dev/null)
+ behind=$(command git log --oneline ..@{upstream} 2>/dev/null)
+ if [[ -n "$ahead" ]] && [[ -n "$behind" ]]; then
+ PL_BRANCH_CHAR=$'\u21c5'
+ elif [[ -n "$ahead" ]]; then
+ PL_BRANCH_CHAR=$'\u21b1'
+ elif [[ -n "$behind" ]]; then
+ PL_BRANCH_CHAR=$'\u21b0'
+ fi
fi
if [[ -e "${repo_path}/BISECT_LOG" ]]; then
@@ -149,6 +235,7 @@ prompt_git() {
zstyle ':vcs_info:*' actionformats ' %u%c'
vcs_info
echo -n "${${ref:gs/%/%%}/refs\/heads\//$PL_BRANCH_CHAR }${vcs_info_msg_0_%% }${mode}"
+ [[ $AGNOSTER_GIT_INLINE == 'true' ]] && prompt_git_relative
fi
}
@@ -163,17 +250,17 @@ prompt_bzr() {
done
local bzr_status status_mod status_all revision
- if bzr_status=$(bzr status 2>&1); then
+ if bzr_status=$(command bzr status 2>&1); then
status_mod=$(echo -n "$bzr_status" | head -n1 | grep "modified" | wc -m)
status_all=$(echo -n "$bzr_status" | head -n1 | wc -m)
- revision=${$(bzr log -r-1 --log-format line | cut -d: -f1):gs/%/%%}
+ revision=${$(command bzr log -r-1 --log-format line | cut -d: -f1):gs/%/%%}
if [[ $status_mod -gt 0 ]] ; then
- prompt_segment yellow black "bzr@$revision ✚"
+ prompt_segment "$AGNOSTER_BZR_DIRTY_BG" "$AGNOSTER_BZR_DIRTY_FG" "bzr@$revision ✚"
else
if [[ $status_all -gt 0 ]] ; then
- prompt_segment yellow black "bzr@$revision"
+ prompt_segment "$AGNOSTER_BZR_DIRTY_BG" "$AGNOSTER_BZR_DIRTY_FG" "bzr@$revision"
else
- prompt_segment green black "bzr@$revision"
+ prompt_segment "$AGNOSTER_BZR_CLEAN_BG" "$AGNOSTER_BZR_CLEAN_FG" "bzr@$revision"
fi
fi
fi
@@ -182,33 +269,33 @@ prompt_bzr() {
prompt_hg() {
(( $+commands[hg] )) || return
local rev st branch
- if $(hg id >/dev/null 2>&1); then
- if $(hg prompt >/dev/null 2>&1); then
- if [[ $(hg prompt "{status|unknown}") = "?" ]]; then
+ if $(command hg id >/dev/null 2>&1); then
+ if $(command hg prompt >/dev/null 2>&1); then
+ if [[ $(command hg prompt "{status|unknown}") = "?" ]]; then
# if files are not added
- prompt_segment red white
+ prompt_segment "$AGNOSTER_HG_NEWFILE_BG" "$AGNOSTER_HG_NEWFILE_FG"
st='±'
- elif [[ -n $(hg prompt "{status|modified}") ]]; then
+ elif [[ -n $(command hg prompt "{status|modified}") ]]; then
# if any modification
- prompt_segment yellow black
+ prompt_segment "$AGNOSTER_HG_CHANGED_BG" "$AGNOSTER_HG_CHANGED_FG"
st='±'
else
# if working copy is clean
- prompt_segment green $CURRENT_FG
+ prompt_segment "$AGNOSTER_HG_CLEAN_BG" "$AGNOSTER_HG_CLEAN_FG"
fi
- echo -n ${$(hg prompt "☿ {rev}@{branch}"):gs/%/%%} $st
+ echo -n ${$(command hg prompt "☿ {rev}@{branch}"):gs/%/%%} $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
+ rev=$(command hg id -n 2>/dev/null | sed 's/[^-0-9]//g')
+ branch=$(command hg id -b 2>/dev/null)
+ if command hg st | command grep -q "^\?"; then
+ prompt_segment "$AGNOSTER_HG_NEWFILE_BG" "$AGNOSTER_HG_NEWFILE_FG"
st='±'
- elif `hg st | grep -q "^[MA]"`; then
- prompt_segment yellow black
+ elif command hg st | command grep -q "^[MA]"; then
+ prompt_segment "$AGNOSTER_HG_CHANGED_BG" "$AGNOSTER_HG_CHANGED_FG"
st='±'
else
- prompt_segment green $CURRENT_FG
+ prompt_segment "$AGNOSTER_HG_CLEAN_BG" "$AGNOSTER_HG_CLEAN_FG"
fi
echo -n "☿ ${rev:gs/%/%%}@${branch:gs/%/%%}" $st
fi
@@ -217,13 +304,21 @@ prompt_hg() {
# Dir: current working directory
prompt_dir() {
- prompt_segment blue $CURRENT_FG '%~'
+ if [[ $AGNOSTER_GIT_INLINE == 'true' ]] && $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then
+ # Git repo and inline path enabled, hence only show the git root
+ prompt_segment "$AGNOSTER_DIR_BG" "$AGNOSTER_DIR_FG" "$(git_toplevel | sed "s:^$HOME:~:")"
+ else
+ prompt_segment "$AGNOSTER_DIR_BG" "$AGNOSTER_DIR_FG" '%~'
+ fi
}
# Virtualenv: current working virtualenv
prompt_virtualenv() {
+ if [ -n "$CONDA_DEFAULT_ENV" ]; then
+ prompt_segment magenta $CURRENT_FG "🐍 $CONDA_DEFAULT_ENV"
+ fi
if [[ -n "$VIRTUAL_ENV" && -n "$VIRTUAL_ENV_DISABLE_PROMPT" ]]; then
- prompt_segment blue black "(${VIRTUAL_ENV:t:gs/%/%%})"
+ prompt_segment "$AGNOSTER_VENV_BG" "$AGNOSTER_VENV_FG" "(${VIRTUAL_ENV:t:gs/%/%%})"
fi
}
@@ -234,11 +329,15 @@ prompt_virtualenv() {
prompt_status() {
local -a symbols
- [[ $RETVAL -ne 0 ]] && symbols+="%{%F{red}%}✘"
- [[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}⚡"
- [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}⚙"
+ if [[ $AGNOSTER_STATUS_RETVAL_NUMERIC == 'true' ]]; then
+ [[ $RETVAL -ne 0 ]] && symbols+="%{%F{$AGNOSTER_STATUS_RETVAL_FG}%}$RETVAL"
+ else
+ [[ $RETVAL -ne 0 ]] && symbols+="%{%F{$AGNOSTER_STATUS_RETVAL_FG}%}✘"
+ fi
+ [[ $UID -eq 0 ]] && symbols+="%{%F{$AGNOSTER_STATUS_ROOT_FG}%}⚡"
+ [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{$AGNOSTER_STATUS_JOB_FG}%}⚙"
- [[ -n "$symbols" ]] && prompt_segment black default "$symbols"
+ [[ -n "$symbols" ]] && prompt_segment "$AGNOSTER_STATUS_BG" "$AGNOSTER_STATUS_FG" "$symbols"
}
prompt_cabal_sandbox() {
@@ -258,17 +357,24 @@ prompt_cabal_sandbox() {
prompt_aws() {
[[ -z "$AWS_PROFILE" || "$SHOW_AWS_PROMPT" = false ]] && return
case "$AWS_PROFILE" in
- *-prod|*production*) prompt_segment red yellow "AWS: ${AWS_PROFILE:gs/%/%%}" ;;
- *) prompt_segment green black "AWS: ${AWS_PROFILE:gs/%/%%}" ;;
+ *-prod|*production*) prompt_segment "$AGNOSTER_AWS_PROD_BG" "$AGNOSTER_AWS_PROD_FG" "AWS: ${AWS_PROFILE:gs/%/%%}" ;;
+ *) prompt_segment "$AGNOSTER_AWS_BG" "$AGNOSTER_AWS_FG" "AWS: ${AWS_PROFILE:gs/%/%%}" ;;
esac
}
+prompt_terraform() {
+ local terraform_info=$(tf_prompt_info)
+ [[ -z "$terraform_info" ]] && return
+ prompt_segment magenta yellow "TF: $terraform_info"
+}
+
## Main prompt
build_prompt() {
RETVAL=$?
prompt_status
prompt_virtualenv
prompt_aws
+ prompt_terraform
prompt_context
prompt_dir
prompt_git