Skip to content

Commit

Permalink
feat(colors): support names, 8-bit, and 24-bit
Browse files Browse the repository at this point in the history
  • Loading branch information
olets committed Apr 21, 2020
1 parent 3fa257f commit f49117b
Showing 1 changed file with 39 additions and 33 deletions.
72 changes: 39 additions & 33 deletions porcelain-prompt.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ PORCELAIN_PROMPT_SYMBOL_STASH=${PORCELAIN_PROMPT_SYMBOL_STASH-⇲ }
PORCELAIN_PROMPT_SYMBOL_TAG=${PORCELAIN_PROMPT_SYMBOL_TAG:-}

# Configurable colors
# Use one of zsh's eight color names, or an integer 1-255 for an 8-bit color, or a #-prefixed RRGGBB value for 24-bit color.
# If using on single configuration dotfile across terminal emulators that may or may not support 24-bit color, add
# [[ $COLORTERM = *(24bit|truecolor)* ]] || zmodload zsh/nearcolor
# before setting the colors.
# See http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Character-Highlighting
# and http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fnearcolor-Module
PORCELAIN_PROMPT_COLOR_ACTION=${PORCELAIN_PROMPT_COLOR_ACTION:-199}
PORCELAIN_PROMPT_COLOR_ACTIVE_STAGED=${PORCELAIN_PROMPT_COLOR_ACTIVE_STAGED:-2}
PORCELAIN_PROMPT_COLOR_ACTIVE_UNSTAGED=${PORCELAIN_PROMPT_COLOR_ACTIVE_UNSTAGED:-1}
Expand Down Expand Up @@ -83,89 +89,89 @@ function gitstatus_prompt_update() {
# Git status: stashes

if (( VCS_STATUS_STASHES || PORCELAIN_PROMPT_SHOW_INACTIVE )); then
p+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
(( VCS_STATUS_STASHES )) && p+="%${PORCELAIN_PROMPT_COLOR_STASH}F$VCS_STATUS_STASHES"
p+="%F{PORCELAIN_PROMPT_COLOR_INACTIVE}"
(( VCS_STATUS_STASHES )) && p+="%F{$PORCELAIN_PROMPT_COLOR_STASH}$VCS_STATUS_STASHES"
p+="$PORCELAIN_PROMPT_SYMBOL_STASH "
fi

# Git status: files with the assume-unchanged bit set

if (( VCS_STATUS_NUM_ASSUME_UNCHANGED || PORCELAIN_PROMPT_SHOW_INACTIVE )); then
p+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
(( VCS_STATUS_NUM_ASSUME_UNCHANGED )) && p+="%${PORCELAIN_PROMPT_COLOR_ASSUME_UNCHANGED}F$VCS_STATUS_NUM_ASSUME_UNCHANGED"
p+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
(( VCS_STATUS_NUM_ASSUME_UNCHANGED )) && p+="%F{$PORCELAIN_PROMPT_COLOR_ASSUME_UNCHANGED}$VCS_STATUS_NUM_ASSUME_UNCHANGED"
p+="$PORCELAIN_PROMPT_SYMBOL_ASSUME_UNCHANGED "
fi

# Git status: files with the skip-worktree bit set

if (( VCS_STATUS_NUM_SKIP_WORKTREE || PORCELAIN_PROMPT_SHOW_INACTIVE )); then
p+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
(( VCS_STATUS_NUM_SKIP_WORKTREE )) && p+="%${PORCELAIN_PROMPT_COLOR_SKIP_WORKTREE}F$VCS_STATUS_NUM_SKIP_WORKTREE"
p+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
(( VCS_STATUS_NUM_SKIP_WORKTREE )) && p+="%F{$PORCELAIN_PROMPT_COLOR_SKIP_WORKTREE}$VCS_STATUS_NUM_SKIP_WORKTREE"
p+="$PORCELAIN_PROMPT_SYMBOL_SKIP_WORKTREE "
fi

# Git status: unstaged added (new) files

if (( VCS_STATUS_NUM_UNTRACKED || PORCELAIN_PROMPT_SHOW_INACTIVE )); then
p+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
(( VCS_STATUS_NUM_UNTRACKED )) && p+="%${PORCELAIN_PROMPT_COLOR_ACTIVE_UNSTAGED}F$VCS_STATUS_NUM_UNTRACKED" && dirty=1
p+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
(( VCS_STATUS_NUM_UNTRACKED )) && p+="%F{$PORCELAIN_PROMPT_COLOR_ACTIVE_UNSTAGED}$VCS_STATUS_NUM_UNTRACKED" && dirty=1
p+="$PORCELAIN_PROMPT_SYMBOL_ADDED "
fi

# Git status: conflicted files

if (( VCS_STATUS_NUM_CONFLICTED || PORCELAIN_PROMPT_SHOW_INACTIVE )); then
p+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
(( VCS_STATUS_NUM_CONFLICTED )) && p+="%${PORCELAIN_PROMPT_COLOR_ACTIVE_UNSTAGED}F$VCS_STATUS_NUM_CONFLICTED" && dirty=1
p+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
(( VCS_STATUS_NUM_CONFLICTED )) && p+="%F{$PORCELAIN_PROMPT_COLOR_ACTIVE_UNSTAGED}$VCS_STATUS_NUM_CONFLICTED" && dirty=1
p+="$PORCELAIN_PROMPT_SYMBOL_CONFLICTED "
fi

# Git status: unstaged deleted files

if (( VCS_STATUS_NUM_UNSTAGED_DELETED || PORCELAIN_PROMPT_SHOW_INACTIVE )); then
p+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
(( VCS_STATUS_NUM_UNSTAGED_DELETED )) && p+="%${PORCELAIN_PROMPT_COLOR_ACTIVE_UNSTAGED}F$VCS_STATUS_NUM_UNSTAGED_DELETED" && dirty=1
p+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
(( VCS_STATUS_NUM_UNSTAGED_DELETED )) && p+="%F{$PORCELAIN_PROMPT_COLOR_ACTIVE_UNSTAGED}$VCS_STATUS_NUM_UNSTAGED_DELETED" && dirty=1
p+="$PORCELAIN_PROMPT_SYMBOL_DELETED "
fi

# Git status: unstaged modified files

if (( unstaged_count || PORCELAIN_PROMPT_SHOW_INACTIVE )); then
p+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
(( $unstaged_count )) && p+="%${PORCELAIN_PROMPT_COLOR_ACTIVE_UNSTAGED}F$unstaged_count" && dirty=1
p+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
(( $unstaged_count )) && p+="%F{$PORCELAIN_PROMPT_COLOR_ACTIVE_UNSTAGED}$unstaged_count" && dirty=1
p+="$PORCELAIN_PROMPT_SYMBOL_MODIFIED "
fi

# Git status: staged added (new) files

if (( VCS_STATUS_NUM_STAGED_NEW || PORCELAIN_PROMPT_SHOW_INACTIVE )); then
p+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
(( VCS_STATUS_NUM_STAGED_NEW )) && p+="%${PORCELAIN_PROMPT_COLOR_ACTIVE_STAGED}F$VCS_STATUS_NUM_STAGED_NEW" && dirty=1
p+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
(( VCS_STATUS_NUM_STAGED_NEW )) && p+="%F{$PORCELAIN_PROMPT_COLOR_ACTIVE_STAGED}$VCS_STATUS_NUM_STAGED_NEW" && dirty=1
p+="$PORCELAIN_PROMPT_SYMBOL_ADDED_STAGED "
fi

# Git status: staged deleted files

if (( VCS_STATUS_NUM_STAGED_DELETED || PORCELAIN_PROMPT_SHOW_INACTIVE )); then
p+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
(( VCS_STATUS_NUM_STAGED_DELETED )) && p+="%${PORCELAIN_PROMPT_COLOR_ACTIVE_STAGED}F$VCS_STATUS_NUM_STAGED_DELETED" && dirty=1
p+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
(( VCS_STATUS_NUM_STAGED_DELETED )) && p+="%F{$PORCELAIN_PROMPT_COLOR_ACTIVE_STAGED}$VCS_STATUS_NUM_STAGED_DELETED" && dirty=1
p+="$PORCELAIN_PROMPT_SYMBOL_DELETED_STAGED "
fi

# Git status: staged modified files

if (( added_staged_count || PORCELAIN_PROMPT_SHOW_INACTIVE )); then
p+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
(( added_staged_count )) && p+="%${PORCELAIN_PROMPT_COLOR_ACTIVE_STAGED}F$added_staged_count" && dirty=1
p+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
(( added_staged_count )) && p+="%F{$PORCELAIN_PROMPT_COLOR_ACTIVE_STAGED}$added_staged_count" && dirty=1
p+="$PORCELAIN_PROMPT_SYMBOL_MODIFIED_STAGED "
fi

# Git "where": colorize if Git status is dirty

if (( dirty )); then
w+="%${PORCELAIN_PROMPT_COLOR_WHERE}F"
w+="%F{$PORCELAIN_PROMPT_COLOR_WHERE}"
else
w+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
w+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
fi

# Git "where": committish
Expand All @@ -179,31 +185,31 @@ function gitstatus_prompt_update() {
if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then
w+="$PORCELAIN_PROMPT_SYMBOL_BRANCH$VCS_STATUS_LOCAL_BRANCH "

w+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
w+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
if [[ -z $VCS_STATUS_REMOTE_BRANCH ]]; then
w+="%${PORCELAIN_PROMPT_COLOR_REMOTE}Flocal "
w+="%F{$PORCELAIN_PROMPT_COLOR_REMOTE}local "
else
if (( VCS_STATUS_COMMITS_BEHIND || PORCELAIN_PROMPT_SHOW_INACTIVE )); then
(( VCS_STATUS_COMMITS_BEHIND )) && w+="%${PORCELAIN_PROMPT_COLOR_WHERE}F$VCS_STATUS_COMMITS_BEHIND"
(( VCS_STATUS_COMMITS_BEHIND )) && w+="%F{$PORCELAIN_PROMPT_COLOR_WHERE}$VCS_STATUS_COMMITS_BEHIND"
w+="$PORCELAIN_PROMPT_SYMBOL_BEHIND "
fi

if (( VCS_STATUS_COMMITS_AHEAD || PORCELAIN_PROMPT_SHOW_INACTIVE )); then
(( VCS_STATUS_COMMITS_AHEAD )) && w+="%${PORCELAIN_PROMPT_COLOR_REMOTE}F$VCS_STATUS_COMMITS_AHEAD"
(( VCS_STATUS_COMMITS_AHEAD )) && w+="%F{$PORCELAIN_PROMPT_COLOR_REMOTE}$VCS_STATUS_COMMITS_AHEAD"
w+="$PORCELAIN_PROMPT_SYMBOL_AHEAD "
fi

if [[ $VCS_STATUS_LOCAL_BRANCH != $VCS_STATUS_REMOTE_BRANCH ]]; then
w+="%${PORCELAIN_PROMPT_COLOR_REMOTE}F${PORCELAIN_PROMPT_SYMBOL_BRANCH}${VCS_STATUS_REMOTE_BRANCH}"
w+="%F{$PORCELAIN_PROMPT_COLOR_REMOTE}${PORCELAIN_PROMPT_SYMBOL_BRANCH}${VCS_STATUS_REMOTE_BRANCH}"

if (( not_default_remote )); then
w+="/"
fi
w+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
w+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
fi

if (( not_default_remote )); then
w+="%${PORCELAIN_PROMPT_COLOR_REMOTE}F$VCS_STATUS_REMOTE_NAME "
w+="%F{$PORCELAIN_PROMPT_COLOR_REMOTE}$VCS_STATUS_REMOTE_NAME "
fi
fi
else
Expand All @@ -212,8 +218,8 @@ function gitstatus_prompt_update() {

# Git "where": tag

w+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
[[ -n $VCS_STATUS_TAG ]] && w+="%${PORCELAIN_PROMPT_COLOR_TAG}F$PORCELAIN_PROMPT_SYMBOL_TAG$VCS_STATUS_TAG "
w+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
[[ -n $VCS_STATUS_TAG ]] && w+="%F{$PORCELAIN_PROMPT_COLOR_TAG}$PORCELAIN_PROMPT_SYMBOL_TAG$VCS_STATUS_TAG "

# Git "where": placement
# If showing inline with directory, save for later use in prompt build;
Expand All @@ -227,8 +233,8 @@ function gitstatus_prompt_update() {

# Git status: action (e.g. rebasing)

p+="%${PORCELAIN_PROMPT_COLOR_INACTIVE}F"
[[ -n $VCS_STATUS_ACTION ]] && p+=" %${PORCELAIN_PROMPT_COLOR_ACTION}F$VCS_STATUS_ACTION"
p+="%F{$PORCELAIN_PROMPT_COLOR_INACTIVE}"
[[ -n $VCS_STATUS_ACTION ]] && p+=" %F{$PORCELAIN_PROMPT_COLOR_ACTION}$VCS_STATUS_ACTION"

# Git: optionally prefix prompt
(( PORCELAIN_PROMPT_HIDE_TOOL_NAMES )) || GITSTATUS_PROMPT+="Git "
Expand Down

0 comments on commit f49117b

Please sign in to comment.