diff --git a/themes/brethil.zsh-theme b/themes/brethil.zsh-theme index cba3ebd..ddb1c5b 100644 --- a/themes/brethil.zsh-theme +++ b/themes/brethil.zsh-theme @@ -1,58 +1,40 @@ # vim:ft=zsh ts=2 sw=2 sts=2 -# color chart available at https://www.calmar.ws/vim/256-xterm-24bit-rgb-color-chart.html -# %F{202}: orange -# %K{202}: background orange -# 255: white -# See the prompt expansion section in `info zsh` for more info +# 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` function user_prompt(){ - # prints info about username/hostname - # for ssh connections - local p - local host - if [[ $UID -eq 0 ]]; then - # root - echo -n "%F{255}[%f" # open square bracket - echo -n "%K{160}%F{255}%Broot%b%k%f" - if [[ $SSH_CONNECTION ]]; then - # add the white @ - # echo -n '%F{255} at %f' - echo -n "%F{255}@%f" - fi + # prints hostname on an orange background if on an ssh connection, adds username if root + + 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='%(!.@.)' + if [[ -n $SSH_CONNECTION ]]; then + echo "${open_bracket}${user}${at}${host}${close_bracket}" + else + echo "${open_bracket}${user}${close_bracket}" fi - if [[ $SSH_CONNECTION ]]; then - if [[ $UID -ne 0 ]]; then - echo -n "%F{255}[%f" # open square bracket - fi - # underlined orange hostname (%m) - echo -n "%K{202}%B%F{255}%m%f%k%b" - if [[ $UID -ne 0 ]]; then - echo -n "%F{255}]%f" # close square bracket - fi - fi - # close square bracket - if [[ $UID -eq 0 ]]; then echo "%F{255}]%f"; fi } function job_prompt() { - local JOB_PROMPT="%(1j.%B%K{202}%F{220} %j %k%b.)" # Shows jobs number on an orange background if there are background jobs - echo "$JOB_PROMPT" + # Shows jobs number on an orange background if there are background jobs + echo "%(1j.%B%K{202}%F{220} %j %k%b.)" } function shlvl_prompt() { - local SHLVL_PROMPT - if [[ -n "$TMUX" ]]; then - SHLVL_PROMPT="%(3L.%K{161}%F{255}%B $((SHLVL-1)) %f%b%k.)" # Shows SHLVL on a magenta background if SHLVL > 1 + # Shows SHLVL on a magenta background if SHLVL > 1 (2 if in a tmux session) + if [[ -z "$TMUX" ]]; then + echo "%(2L.%K{161}%F{255}%B %L %f%b%k.)" else - SHLVL_PROMPT="%(2L.%K{161}%F{255}%B %L %f%b%k.)" # Shows SHLVL on a magenta background if SHLVL > 1 + echo "%(3L.%K{161}%F{255}%B $((SHLVL-1)) %f%b%k.)" fi - echo "$SHLVL_PROMPT" } function path_prompt(){ # Shows last 3 items in path if there are more than 4 - local PATH_PROMPT="%F{white}[%F{green}%(4~:…/%3~:%~)%F{white}]%f" - echo "$PATH_PROMPT" + echo "[%F{green}%(4~:…/%3~:%~)%f]" } # PREFIX/SUFFIX are added before/after `git_prompt_info` @@ -75,9 +57,9 @@ 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="%F{255}>%f" -ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE="%F{255}<%f" -ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE="%F{255}<>%f" +ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE=">" +ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE="<" +ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE="<>" function virtualenv_info { [ -z "$VIRTUAL_ENV" ] && return @@ -90,70 +72,42 @@ function virtualenv_info { venv="$(basename $(dirname "$VIRTUAL_ENV") )" fi - echo -n "$BOLD_PURPLE" - echo -n " <$venv> " - echo -n "$CLEAR" + echo -n " $BOLD_PURPLE<$venv>$CLEAR " } function git_prompt() { - if [[ -n "$(git status 2>/dev/null)" ]]; then - local GIT_PROMPT=" %F{255}$(git_prompt_info)%B%F{255} |%f%b$(git_prompt_status)$(git_remote_status)" - echo "$GIT_PROMPT" - else - echo "" + # prints git info if in a git repo + if ! git rev-parse --git-dir &>/dev/null; then + return fi + + echo " $(git_prompt_info) |$(git_prompt_status)$(git_remote_status)" } -function check_last_exit_code() { - local LAST_EXIT_CODE=$? - if [[ $LAST_EXIT_CODE -ne 0 ]]; then - local EXIT_CODE_PROMPT - EXIT_CODE_PROMPT+="%B%F{88}-$LAST_EXIT_CODE-%f%b" - echo "$EXIT_CODE_PROMPT" - fi -} function return_code_RPS1() { - # For right-side prompt - local return_code="%(?..$(check_last_exit_code))" # for RPS1 - echo "$return_code" + # red status code if last exit code is non-zero + echo "%(?..%B%F{88}-$?-%f%b)" } -function ret_status() { - local ret_status="%(?:%B%F{28} →%f%b:%{$fg[red]%} x%{$reset_color%})" - echo "$ret_status" +function prompt_with_previous_return_status() { + local success="%B%F{28} →%f%b" + local failure="%B%{$fg[red]%} x%b%{$reset_color%}" + echo "%(?:$success:$failure)" } -export MODE_INDICATOR="[%B%K{88}nav%k%b]" -export INSERT_MODE_INDICATOR="[%B%K{28}ins%k%b]" - -_PROMPT_PROTO='$(virtualenv_info)$(user_prompt)$(path_prompt)$(git_prompt)$(job_prompt)$(shlvl_prompt)' function prompt_too_long(){ - local zero='%([BSUbfksu]|([FK]|){*})' - if [[ -x $commands[gsed] ]]; then # fuck darwin - sed='gsed' - elif [[ "$(uname)" == "Darwin" ]]; then - local msg="error: multi-line prompt requires GNU sed" - msg+="install with \"brew install gnu-sed\"" - echo "$msg" - return - else - sed='sed' - fi - - local stripped="$(echo ${(S%%)_PROMPT_PROTO//$~zero/} | $sed 's|\x1B\[[0-9;]*[a-zA-Z]||g')" - local prompt_len=${#stripped} - local max_len=$(($COLUMNS/2)) - if [[ $prompt_len -ge $max_len ]]; then - echo true - fi + # prints a newline if more than $COLUMNS/2 characters have been printed + local newline=$'\n' + echo "%-$((COLUMNS/2))(l..${newline})" } -PROMPT="$(echo "$_PROMPT_PROTO")" -NEWLINE=$'\n' -PROMPT+='${$(prompt_too_long)/true/${NEWLINE}}' -PROMPT+='$(ret_status) ' +## 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 + +PROMPT='$(virtualenv_info)$(user_prompt)$(path_prompt)$(git_prompt)$(job_prompt)$(shlvl_prompt)$(prompt_too_long)$(prompt_with_previous_return_status) ' # Right prompt is just return code and time -RPS1='$(return_code_RPS1)$(vi_mode_prompt_info)%F{255}[%*]%f' +RPS1='$(return_code_RPS1)$(vi_mode_prompt_info)[%*]'