# vim:ft=zsh ts=2 sw=2 sts=2 # brethil oh-my-zsh theme # See "EXPANSION OF PROMPT SEQUENCES" in `man zshmisc` # Note: Most of the expansions/color sequences can be tested using `print -P` local user='%(!.%K{160}%F{255}%B%n%b%k%f.)' # prints 'root' on a red background if user is root local host='%K{202}%B%F{255}%m%f%k%b' # bold host name on an orange background local open_bracket='%(!.[.)' local close_bracket='%(!.].)' local at='%(!.@.)' local user_prompt if [[ -n $SSH_CONNECTION ]]; then user_prompt="[${user}${at}${host}]" else user_prompt="${open_bracket}${user}${close_bracket}" fi local job_prompt="%(1j.%B%K{202}%F{220} %j %k%b.)" local shlvl_prompt # Shows SHLVL on a magenta background if SHLVL > 1 (2 if in a tmux session) if [[ -z "$TMUX" ]]; then shlvl_prompt="%(2L.%K{161}%F{255}%B %L %f%b%k.)" else shlvl_prompt="%(3L.%K{161}%F{255}%B $((SHLVL-1)) %f%b%k.)" fi # Shows last 3 items in path if there are more than 4 local path_prompt='[%F{green}%(4~:…/%3~:%~)%f]' # PREFIX/SUFFIX are added before/after `git_prompt_info` ZSH_THEME_GIT_PROMPT_PREFIX=" %f%{$fg[yellow]%} " ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} |" ZSH_THEME_GIT_PROMPT_DIRTY=" %{$fg[red]%}x%{$reset_color%}" ZSH_THEME_GIT_PROMPT_CLEAN=" %{$fg[green]%}√%{$reset_color%}" # The following are part of `git_prompt_status` # Rules: # ? : untracked # * : modified # + : added # $ : stashed ZSH_THEME_GIT_PROMPT_STASHED="%B%F{32}$%b%f" # blue # ZSH_THEME_GIT_PROMPT_MODIFIED="%{$fg[red]%}✗ " # this is equivalent to DIRTY, if DISABLE_UNTRACKED_FILES_DIRTY is set ZSH_THEME_GIT_PROMPT_ADDED="%B%F{34}+%b%f" # green ZSH_THEME_GIT_PROMPT_UNTRACKED="%B%F{red}?%b%f" # red # The following are part of `git_remote_status` # ZSH_THEME_GIT_PROMPT_EQUAL_REMOTE="%{$fg[green]%}=" ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE=">" ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE="<" ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE="<>" local BOLD_PURPLE='%B%F{5}' local CLEAR='%f%b' local venv function __virtualenv_info { [ -z "$VIRTUAL_ENV" ] && return venv="$(basename "$VIRTUAL_ENV")" if [[ "$venv" == ".venv" ]]; then venv="$(basename $(dirname "$VIRTUAL_ENV") )" fi # bold (%B) purple (%F{5}) echo -n " %B%F{5}<$venv>%b%f " } local git_prompt='$(git_prompt_info)$(git_prompt_status)$(git_remote_status)' local return_code_RPS1='%(?..%B%F{88}-$?-%f%b)' local success="%B%F{28} →%f%b" local failure="%B%{$fg[red]%} x%b%{$reset_color%}" local prompt_with_previous_return_status="%(?:$success:$failure)" function __prompt_too_long(){ # prints a newline if less than $COLUMNS/2 characters remain to the right margin, see end of `man zshmisc` echo "%-$((COLUMNS/2))(l..\n)" } function __print_prompt_marker(){ # prints the escape sequence that tmux interprets as prompt start (see next-prompt/previous-prompt in `man tmux`) printf '\033]133;A\033\\' } ## oh-my-zsh vi-mode plugins indicators: export MODE_INDICATOR="[%B%K{red}nav%k%b]" # red background export INSERT_MODE_INDICATOR="[%B%K{28}ins%k%b]" # green background ## put it all together # Note: wrapping __print_prompt_marker in extra %{...%} works around an issue with zsh autosuggestions with escape sequences # see https://github.com/zsh-users/zsh-autosuggestions/issues/570 for more information PROMPT='$(__virtualenv_info)'"${user_prompt}${path_prompt}${git_prompt}${job_prompt}${shlvl_prompt}$(__prompt_too_long)${prompt_with_previous_return_status}%{$(__print_prompt_marker)%} " # right prompt indicator: return code, vi mode prompt info and current time RPS1="${return_code_RPS1}"'$(vi_mode_prompt_info)[%*]'