A zsh
theme inspired by Cmder with some additional git
related prompt features.
Clone this repository into your .oh-my-zsh/custom/themes
directory:
git clone https://github.com/bwpge/zcmder "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/zcmder"
Set the theme in your .zshrc
:
ZSH_THEME=zcmder/zcmder
Clone this repository to your machine (e.g., ~/.zsh
):
git clone https://github.com/bwpge/zcmder ~/.zsh/zcmder
Source the theme in your .zshrc
:
source ~/.zsh/zcmder/zcmder.zsh-theme
To update, pull any new commits from this repository:
cd "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/zcmder" && git pull
Be sure to reload (e.g., omz reload
) or source the new file (e.g., source zcmder.zsh-theme
) for any active sessions.
Environment variables used by this theme are always prefixed with ZCMDER_
. This theme uses following associative arrays:
When the theme is sourced, these variables are reset to ensure proper declaration and initial values. To customize them, set your desired values after sourcing the theme (or oh-my-zsh.sh
).
Example .zshrc
:
ZSH_THEME=zcmder/zcmder
source $ZSH/oh-my-zsh.sh
# zcmder options
ZCMDER_STYLES[cwd]="fg=green,underline" # use green fg and underline effect on cwd
ZCMDER_STYLES[git_branch_default]='fg=blue' # use blue for default git branch color
ZCMDER_STYLES[git_new_repo]='bg=#2277ff,standout' # use RGB value for new repo bg color
ZCMDER_COMPONENTS[python_env]=false # disable python env component
ZCMDER_STRINGS[git_separator]='' # don't print 'on ' before git prompt
ZCMDER_STRINGS[git_prefix]='■ ' # use different branch icon
The following tables explains each option and usage.
Controls which components or segments of the prompt are printed. These values are evaluated with arithmetic evaluation (e.g., (( $foo ))
), so to disable a component set the value to 0
. To enable it, use a non-zero value:
ZCMDER_COMPONENTS[git_status]=0 # disable git prompt
ZCMDER_COMPONENTS[username]=1 # enable username
Key | Type | Usage |
---|---|---|
cwd |
bool | Print the current working directory in the prompt |
git_status |
bool | Print a git status (if in a git repo) in the prompt |
hostname |
bool | Print the hostname (zsh expanded %M ) in the prompt |
python_env |
bool | Print the current python environment (conda or venv ) in the prompt |
username |
bool | Print the username (zsh expanded %n ) in the prompt |
Controls colors and text effects of the various items in the prompt.
This associative array uses very similar syntax as "types of highlighting" in zshzle(1)
:
- Values must be a string
- Tokens are separated by commas (without leading or trailing spaces)
Valid style tokens:
fg=<color>
: see below for color formatsbg=<color>
: same asfg
bold
: render bold or "intense" text (some terminals render this with "bright" colors and no font weight)dim
: render faint text (some terminals treat this as bold)italic
: render italicized text (some terminals treat this as inverse or blink effect)underline
: render underlined textstandout
: uses zsh's%S
prompt expansion for the terminal's standout mode, typically "reverse video" (seeinvert
)invert
: explicitly writes\x1b[7m
for reverse video (not supported by all terminals)- Note: prefer using
standout
- If both
standout
andinvert
are specified in a style,invert
is ignored
- Note: prefer using
Valid colors have the following form (see fg
section of Character Highlighting in zshzle(1)
for more information):
- Common name (
black
,red
,green
,yellow
,blue
,magenta
,cyan
andwhite
) - 256-color integer value (e.g.,
8
for "bright black" or142
forGold3
, see this reference) - Hex RGB string
#RRGGBB
Example usage:
# green and bold text, inverted (green/default-bg swapped)
ZCMDER_STYLES[cwd]='fg=2,bold,standout'
# white on black in italic/underline
ZCMDER_STYLES[cwd]='fg=#ffffff,bg=#000000,italic,underline'
Git status styles have the following priority:
git_staged
git_unmerged
git_untracked
git_modified
git_repo_new
git_branch_default
Key | Type | Usage |
---|---|---|
caret |
style | Default caret style |
caret_error |
style | Caret style when the last exit code was non-zero |
cwd |
style | style of the current working directory |
cwd_readonly |
style | style when the current working directory is read-only |
git_branch_default |
style | Default git status style |
git_modified |
style | Git status style when only tracked files are modified |
git_new_repo |
style | Git status style when in a new repository |
git_staged |
style | Git status style when all local changes are staged |
git_unmerged |
style | Git status when there are unmerged changes |
git_untracked |
style | Git status when untracked (dirty) files are present |
python_env |
style | The style for current python environment name |
user_and_host |
style | style for both username and hostname components |
Controls general behavior of the prompt.
Key | Type | Usage |
---|---|---|
git_show_remote |
bool | Show the remote with git status (e.g., main:origin/main ) |
newline_before_prompt |
bool | Print an empty line before the next prompt (excluding the first prompt) |
Controls values or tokens in each component that are printed.
Key | Type | Usage |
---|---|---|
caret |
string | Prompt string (the value printed directly before user input area) |
caret_root |
string | Prompt string when running with elevated permissions |
git_ahead_postfix |
string | Printed when repo is ahead of upstream (initialized with $ZSH_THEME_GIT_PROMPT_AHEAD ) |
git_behind_postfix |
string | Printed when repo is behind upstream (initialized with $ZSH_THEME_GIT_PROMPT_BEHIND ) |
git_clean_postfix |
string | Printed when repo has no local changes (initialized with $ZSH_THEME_GIT_PROMPT_CLEAN ) |
git_dirty_postfix |
string | Printed when repo contains unstaged changes (initialized with $ZSH_THEME_GIT_PROMPT_DIRTY ) |
git_diverged_postfix |
string | Printed when repo is both ahead and behind (diverged from) upstream (initialized with $ZSH_THEME_GIT_PROMPT_DIVERGED ) |
git_label_new |
string | Label to use for a new repository |
git_prefix |
string | Prefix always printed for git status e.g., a branch icon or git( (initialized with $ZSH_THEME_GIT_PROMPT_PREFIX ) |
git_separator |
string | A separator or preamble before the git status is printed e.g., ' on ' |
git_stashed_modifier |
string | Printed when repo contains stashes (initialized with $ZSH_THEME_GIT_PROMPT_STASHED ) |
git_suffix |
string | Suffix always printed for git status e.g., ) (initialized with $ZSH_THEME_GIT_PROMPT_SUFFIX ) |
readonly_prefix |
string | Printed before current working directory when read-only (see man test , -w flag) |
By default, this theme will set/change several ZSH_THEME_GIT_PROMPT_*
environment variables since ZCMDER_STRINGS
initializes values from these variables. Changes to these variables will persist through omz reload
, so this behavior may not be desireable.
To disable this behavior, set ZCMDER_NO_MODIFY_ZSH_THEME
prior to loading oh-my-zsh
or sourcing the theme.
Example .zshrc
:
# ...
ZSH_THEME=zcmder/zcmder
ZCMDER_NO_MODIFY_ZSH_THEME=1
source $ZSH/oh-my-zsh.sh
# ... zcmder config
To use the zcmder
git status style without modifying ZSH_THEME_GIT_PROMPT_*
variables, use the following options after sourcing this theme:
ZSH_THEME=zcmder/zcmder
ZCMDER_NO_MODIFY_ZSH_THEME=1
source $ZSH/oh-my-zsh.sh
# zcmder config
ZCMDER_STRINGS[git_ahead_postfix]=" ↑"
ZCMDER_STRINGS[git_behind_postfix]=" ↓"
ZCMDER_STRINGS[git_clean_postfix]=" ✓"
ZCMDER_STRINGS[git_dirty_postfix]=" *"
ZCMDER_STRINGS[git_diverged_postfix]=" ↑↓"
ZCMDER_STRINGS[git_prefix]=" "
ZCMDER_STRINGS[git_stashed_modifier]=" ⚑"
ZCMDER_STRINGS[git_suffix]=""