diff --git a/colorschemes/dark.colorscheme.bash b/colorschemes/dark.colorscheme.bash index 9a8503e2..1af18f4d 100644 --- a/colorschemes/dark.colorscheme.bash +++ b/colorschemes/dark.colorscheme.bash @@ -1,8 +1,10 @@ -CLOCK_THEME_PROMPT_COLOR=92 -CWD_THEME_PROMPT_COLOR=29 +CLOCK_THEME_PROMPT_COLOR=124 +CWD_THEME_PROMPT_COLOR=311 HOST_THEME_PROMPT_COLOR=6 SCM_THEME_PROMPT_CLEAN_COLOR=4 -SCM_THEME_PROMPT_DIRTY_COLOR=214 +SCM_THEME_PROMPT_DIRTY_COLOR=202 SCM_THEME_PROMPT_STAGED_COLOR=30 SCM_THEME_PROMPT_UNSTAGED_COLOR=129 USER_INFO_THEME_PROMPT_COLOR=196 +GO_THEME_PROMPT_COLOR=19 +POWERLINE_GO_COLOR=33 diff --git a/colorschemes/light.colorscheme.bash b/colorschemes/light.colorscheme.bash index f90a30fa..5b4aa1e0 100644 --- a/colorschemes/light.colorscheme.bash +++ b/colorschemes/light.colorscheme.bash @@ -7,3 +7,5 @@ SCM_THEME_PROMPT_DIRTY_COLOR=9 SCM_THEME_PROMPT_STAGED_COLOR=121 SCM_THEME_PROMPT_UNSTAGED_COLOR=210 USER_INFO_THEME_PROMPT_COLOR=46 +GO_THEME_PROMPT_COLOR=33 +POWERLINE_GO_COLOR=33 diff --git a/themes/base.theme.bash b/themes/base.theme.bash index f0864cf4..8f76146d 100644 --- a/themes/base.theme.bash +++ b/themes/base.theme.bash @@ -83,35 +83,49 @@ RBENV_THEME_PROMPT_SUFFIX='|' RBFU_THEME_PROMPT_PREFIX=' |' RBFU_THEME_PROMPT_SUFFIX='|' -GIT_EXE=`which git 2> /dev/null || true` -P4_EXE=`which p4 2> /dev/null || true` -HG_EXE=`which hg 2> /dev/null || true` -SVN_EXE=`which svn 2> /dev/null || true` +GIT_EXE=$(which git 2>/dev/null || true) +P4_EXE=$(which p4 2>/dev/null || true) +HG_EXE=$(which hg 2>/dev/null || true) +SVN_EXE=$(which svn 2>/dev/null || true) -function scm { - if [[ "$SCM_CHECK" = false ]]; then SCM=$SCM_NONE - elif [[ -f .git/HEAD ]] && [[ -x "$GIT_EXE" ]]; then SCM=$SCM_GIT - elif [[ -x "$GIT_EXE" ]] && [[ -n "$(git rev-parse --is-inside-work-tree 2> /dev/null)" ]]; then SCM=$SCM_GIT - elif [[ -x "$P4_EXE" ]] && [[ -n "$(p4 set P4CLIENT 2> /dev/null)" ]]; then SCM=$SCM_P4 - elif [[ -d .hg ]] && [[ -x "$HG_EXE" ]]; then SCM=$SCM_HG - elif [[ -x "$HG_EXE" ]] && [[ -n "$(hg root 2> /dev/null)" ]]; then SCM=$SCM_HG - elif [[ -d .svn ]] && [[ -x "$SVN_EXE" ]]; then SCM=$SCM_SVN - elif [[ -x "$SVN_EXE" ]] && [[ -n "$(svn info --show-item wc-root 2>/dev/null)" ]]; then SCM=$SCM_SVN - else SCM=$SCM_NONE +function scm() { + if [[ "$SCM_CHECK" = false ]]; then + SCM=$SCM_NONE + elif [[ -f .git/HEAD ]] && [[ -x "$GIT_EXE" ]]; then + SCM=$SCM_GIT + elif [[ -x "$GIT_EXE" ]] && [[ -n "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]]; then + SCM=$SCM_GIT + elif [[ -x "$P4_EXE" ]] && [[ -n "$(p4 set P4CLIENT 2>/dev/null)" ]]; then + SCM=$SCM_P4 + elif [[ -d .hg ]] && [[ -x "$HG_EXE" ]]; then + SCM=$SCM_HG + elif [[ -x "$HG_EXE" ]] && [[ -n "$(hg root 2>/dev/null)" ]]; then + SCM=$SCM_HG + elif [[ -d .svn ]] && [[ -x "$SVN_EXE" ]]; then + SCM=$SCM_SVN + elif [[ -x "$SVN_EXE" ]] && [[ -n "$(svn info --show-item wc-root 2>/dev/null)" ]]; then + SCM=$SCM_SVN + else + SCM=$SCM_NONE fi } -function scm_prompt_char { +function scm_prompt_char() { if [[ -z $SCM ]]; then scm; fi - if [[ $SCM == $SCM_GIT ]]; then SCM_CHAR=$SCM_GIT_CHAR - elif [[ $SCM == $SCM_P4 ]]; then SCM_CHAR=$SCM_P4_CHAR - elif [[ $SCM == $SCM_HG ]]; then SCM_CHAR=$SCM_HG_CHAR - elif [[ $SCM == $SCM_SVN ]]; then SCM_CHAR=$SCM_SVN_CHAR - else SCM_CHAR=$SCM_NONE_CHAR + if [[ $SCM == $SCM_GIT ]]; then + SCM_CHAR=$SCM_GIT_CHAR + elif [[ $SCM == $SCM_P4 ]]; then + SCM_CHAR=$SCM_P4_CHAR + elif [[ $SCM == $SCM_HG ]]; then + SCM_CHAR=$SCM_HG_CHAR + elif [[ $SCM == $SCM_SVN ]]; then + SCM_CHAR=$SCM_SVN_CHAR + else + SCM_CHAR=$SCM_NONE_CHAR fi } -function scm_prompt_vars { +function scm_prompt_vars() { scm scm_prompt_char SCM_DIRTY=0 @@ -122,19 +136,19 @@ function scm_prompt_vars { [[ $SCM == $SCM_SVN ]] && svn_prompt_vars && return } -function scm_prompt_info { +function scm_prompt_info() { scm scm_prompt_char scm_prompt_info_common } -function scm_prompt_char_info { +function scm_prompt_char_info() { scm_prompt_char echo -ne "${SCM_THEME_CHAR_PREFIX}${SCM_CHAR}${SCM_THEME_CHAR_SUFFIX}" scm_prompt_info_common } -function scm_prompt_info_common { +function scm_prompt_info_common() { SCM_DIRTY=0 SCM_STATE='' @@ -155,15 +169,15 @@ function scm_prompt_info_common { { [[ ${SCM} == ${SCM_SVN} ]] && svn_prompt_info && return; } || true } -function terraform_workspace_prompt { - if _command_exists terraform ; then - if [ -d .terraform ]; then - echo -e "$(terraform workspace show 2>/dev/null)" - fi +function terraform_workspace_prompt() { + if _command_exists terraform; then + if [ -d .terraform ]; then + echo -e "$(terraform workspace show 2>/dev/null)" fi + fi } -function git_prompt_minimal_info { +function git_prompt_minimal_info() { SCM_STATE=${SCM_THEME_PROMPT_CLEAN} _git-hide-status && return @@ -181,15 +195,15 @@ function git_prompt_minimal_info { echo -e "${SCM_PREFIX}${SCM_BRANCH}${SCM_STATE}${SCM_SUFFIX}" } -function git_prompt_vars { - if _git-branch &> /dev/null; then +function git_prompt_vars() { + if _git-branch &>/dev/null; then SCM_GIT_DETACHED="false" SCM_BRANCH="${SCM_THEME_BRANCH_PREFIX}\$(_git-friendly-ref)$(_git-remote-info)" else SCM_GIT_DETACHED="true" local detached_prefix - if _git-tag &> /dev/null; then + if _git-tag &>/dev/null; then detached_prefix=${SCM_THEME_TAG_PREFIX} else detached_prefix=${SCM_THEME_DETACHED_PREFIX} @@ -197,7 +211,7 @@ function git_prompt_vars { SCM_BRANCH="${detached_prefix}\$(_git-friendly-ref)" fi - IFS=$'\t' read -r commits_behind commits_ahead <<< "$(_git-upstream-behind-ahead)" + IFS=$'\t' read -r commits_behind commits_ahead <<<"$(_git-upstream-behind-ahead)" if [[ "${commits_ahead}" -gt 0 ]]; then SCM_BRANCH+="${SCM_GIT_AHEAD_BEHIND_PREFIX_CHAR}${SCM_GIT_AHEAD_CHAR}" [[ "${SCM_GIT_SHOW_COMMIT_COUNT}" = "true" ]] && SCM_BRANCH+="${commits_ahead}" @@ -209,13 +223,13 @@ function git_prompt_vars { if [[ "${SCM_GIT_SHOW_STASH_INFO}" = "true" ]]; then local stash_count - stash_count="$(git stash list 2> /dev/null | wc -l | tr -d ' ')" + stash_count="$(git stash list 2>/dev/null | wc -l | tr -d ' ')" [[ "${stash_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_GIT_STASH_CHAR_PREFIX}${stash_count}${SCM_GIT_STASH_CHAR_SUFFIX}" fi SCM_STATE=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN} if ! _git-hide-status; then - IFS=$'\t' read -r untracked_count unstaged_count staged_count <<< "$(_git-status-counts)" + IFS=$'\t' read -r untracked_count unstaged_count staged_count <<<"$(_git-status-counts)" if [[ "${untracked_count}" -gt 0 || "${unstaged_count}" -gt 0 || "${staged_count}" -gt 0 ]]; then SCM_DIRTY=1 if [[ "${SCM_GIT_SHOW_DETAILS}" = "true" ]]; then @@ -235,11 +249,11 @@ function git_prompt_vars { SCM_CHANGE=$(_git-short-sha 2>/dev/null || echo "") } -function p4_prompt_vars { +function p4_prompt_vars() { IFS=$'\t' read -r \ - opened_count non_default_changes default_count \ - add_file_count edit_file_count delete_file_count \ - <<< "$(_p4-opened-counts)" + opened_count non_default_changes default_count \ + add_file_count edit_file_count delete_file_count \ + <<<"$(_p4-opened-counts)" if [[ "${opened_count}" -gt 0 ]]; then SCM_DIRTY=1 SCM_STATE=${SCM_THEME_PROMPT_DIRTY} @@ -255,8 +269,8 @@ function p4_prompt_vars { SCM_SUFFIX=${P4_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX} } -function svn_prompt_vars { - if [[ -n $(svn status |head -c1 2> /dev/null) ]]; then +function svn_prompt_vars() { + if [[ -n $(svn status | head -c1 2>/dev/null) ]]; then SCM_DIRTY=1 SCM_STATE=${SVN_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY} else @@ -265,8 +279,8 @@ function svn_prompt_vars { fi SCM_PREFIX=${SVN_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX} SCM_SUFFIX=${SVN_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX} - SCM_BRANCH=$(svn info --show-item=url 2> /dev/null | awk -F/ '{ for (i=0; i<=NF; i++) { if ($i == "branches" || $i == "tags" ) { print $(i+1); break }; if ($i == "trunk") { print $i; break } } }') || return - SCM_CHANGE=$(svn info --show-item=revision 2> /dev/null) + SCM_BRANCH=$(svn info --show-item=url 2>/dev/null | awk -F/ '{ for (i=0; i<=NF; i++) { if ($i == "branches" || $i == "tags" ) { print $(i+1); break }; if ($i == "trunk") { print $i; break } } }') || return + SCM_CHANGE=$(svn info --show-item=revision 2>/dev/null) } # this functions returns absolute location of .hg directory if one exists @@ -276,62 +290,71 @@ function svn_prompt_vars { # - lets say we cd into ~/Projects/Foo/Bar # - .hg is located in ~/Projects/Foo/.hg # - get_hg_root starts at ~/Projects/Foo/Bar and sees that there is no .hg directory, so then it goes into ~/Projects/Foo -function get_hg_root { - local CURRENT_DIR=$(pwd) +function get_hg_root() { + local CURRENT_DIR=$(pwd) - while [ "$CURRENT_DIR" != "/" ]; do - if [ -d "$CURRENT_DIR/.hg" ]; then - echo "$CURRENT_DIR/.hg" - return - fi + while [ "$CURRENT_DIR" != "/" ]; do + if [ -d "$CURRENT_DIR/.hg" ]; then + echo "$CURRENT_DIR/.hg" + return + fi - CURRENT_DIR=$(dirname $CURRENT_DIR) - done + CURRENT_DIR=$(dirname $CURRENT_DIR) + done } -function hg_prompt_vars { - if [[ -n $(hg status 2> /dev/null) ]]; then - SCM_DIRTY=1 - SCM_STATE=${HG_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY} - else - SCM_DIRTY=0 - SCM_STATE=${HG_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN} - fi - SCM_PREFIX=${HG_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX} - SCM_SUFFIX=${HG_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX} +function hg_prompt_vars() { + if [[ -n $(hg status 2>/dev/null) ]]; then + SCM_DIRTY=1 + SCM_STATE=${HG_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY} + else + SCM_DIRTY=0 + SCM_STATE=${HG_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN} + fi + SCM_PREFIX=${HG_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX} + SCM_SUFFIX=${HG_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX} - HG_ROOT=$(get_hg_root) + HG_ROOT=$(get_hg_root) - if [ -f "$HG_ROOT/branch" ]; then - # Mercurial holds it's current branch in .hg/branch file - SCM_BRANCH=$(cat "$HG_ROOT/branch") - else - SCM_BRANCH=$(hg summary 2> /dev/null | grep branch: | awk '{print $2}') - fi + if [ -f "$HG_ROOT/branch" ]; then + # Mercurial holds it's current branch in .hg/branch file + SCM_BRANCH=$(cat "$HG_ROOT/branch") + else + SCM_BRANCH=$(hg summary 2>/dev/null | grep branch: | awk '{print $2}') + fi - if [ -f "$HG_ROOT/dirstate" ]; then - # Mercurial holds various information about the working directory in .hg/dirstate file. More on http://mercurial.selenic.com/wiki/DirState - SCM_CHANGE=$(hexdump -n 10 -e '1/1 "%02x"' "$HG_ROOT/dirstate" | cut -c-12) - else - SCM_CHANGE=$(hg summary 2> /dev/null | grep parent: | awk '{print $2}') - fi + if [ -f "$HG_ROOT/dirstate" ]; then + # Mercurial holds various information about the working directory in .hg/dirstate file. More on http://mercurial.selenic.com/wiki/DirState + SCM_CHANGE=$(hexdump -n 10 -e '1/1 "%02x"' "$HG_ROOT/dirstate" | cut -c-12) + else + SCM_CHANGE=$(hg summary 2>/dev/null | grep parent: | awk '{print $2}') + fi } -function nvm_version_prompt { +function nvm_version_prompt() { local node - if declare -f -F nvm &> /dev/null; then - node=$(nvm current 2> /dev/null) + if declare -f -F nvm &>/dev/null; then + node=$(nvm current 2>/dev/null) [[ "${node}" == "system" ]] && return echo -e "${NVM_THEME_PROMPT_PREFIX}${node}${NVM_THEME_PROMPT_SUFFIX}" fi } -function node_version_prompt { +function npm_version_prompt() { + local node + if declare -f -F npm &>/dev/null; then + node=$(nvm current 2>/dev/null) + [[ "${node}" == "system" ]] && return + echo -e "${NVM_THEME_PROMPT_PREFIX}${node}${NVM_THEME_PROMPT_SUFFIX}" + fi +} + +function node_version_prompt() { echo -e "$(nvm_version_prompt)" } -function rvm_version_prompt { - if which rvm &> /dev/null; then +function rvm_version_prompt() { + if which rvm &>/dev/null; then rvm=$(rvm-prompt) || return if [ -n "$rvm" ]; then echo -e "$RVM_THEME_PROMPT_PREFIX$rvm$RVM_THEME_PROMPT_SUFFIX" @@ -339,25 +362,25 @@ function rvm_version_prompt { fi } -function rbenv_version_prompt { - if which rbenv &> /dev/null; then - rbenv=$(rbenv version-name) || return - $(rbenv commands | grep -q gemset) && gemset=$(rbenv gemset active 2> /dev/null) && rbenv="$rbenv@${gemset%% *}" +function rbenv_version_prompt() { + if which rbenv &>/dev/null; then + rbenv=$(rbenv version-name) || return: + $(rbenv commands | grep -q gemset) && gemset=$(rbenv gemset active 2>/dev/null) && rbenv="$rbenv@${gemset%% *}" if [ $rbenv != "system" ]; then echo -e "$RBENV_THEME_PROMPT_PREFIX$rbenv$RBENV_THEME_PROMPT_SUFFIX" fi fi } -function rbfu_version_prompt { +function rbfu_version_prompt() { if [[ $RBFU_RUBY_VERSION ]]; then echo -e "${RBFU_THEME_PROMPT_PREFIX}${RBFU_RUBY_VERSION}${RBFU_THEME_PROMPT_SUFFIX}" fi } -function chruby_version_prompt { - if declare -f -F chruby &> /dev/null; then - if declare -f -F chruby_auto &> /dev/null; then +function chruby_version_prompt() { + if declare -f -F chruby &>/dev/null; then + if declare -f -F chruby_auto &>/dev/null; then chruby_auto fi @@ -370,39 +393,39 @@ function chruby_version_prompt { fi } -function ruby_version_prompt { +function ruby_version_prompt() { if [[ "${THEME_SHOW_RUBY_PROMPT}" = "true" ]]; then echo -e "$(rbfu_version_prompt)$(rbenv_version_prompt)$(rvm_version_prompt)$(chruby_version_prompt)" fi } -function k8s_context_prompt { - echo -e "$(kubectl config current-context 2> /dev/null)" +function k8s_context_prompt() { + echo -e "$(kubectl config current-context 2>/dev/null)" } -function virtualenv_prompt { +function virtualenv_prompt() { if [[ -n "$VIRTUAL_ENV" ]]; then - virtualenv=`basename "$VIRTUAL_ENV"` + virtualenv=$(basename "$VIRTUAL_ENV") echo -e "$VIRTUALENV_THEME_PROMPT_PREFIX$virtualenv$VIRTUALENV_THEME_PROMPT_SUFFIX" fi } -function condaenv_prompt { +function condaenv_prompt() { if [[ $CONDA_DEFAULT_ENV ]]; then echo -e "${CONDAENV_THEME_PROMPT_PREFIX}${CONDA_DEFAULT_ENV}${CONDAENV_THEME_PROMPT_SUFFIX}" fi } -function py_interp_prompt { +function py_interp_prompt() { py_version=$(python --version 2>&1 | awk 'NR==1{print "py-"$2;}') || return echo -e "${PYTHON_THEME_PROMPT_PREFIX}${py_version}${PYTHON_THEME_PROMPT_SUFFIX}" } -function python_version_prompt { +function python_version_prompt() { echo -e "$(virtualenv_prompt)$(condaenv_prompt)$(py_interp_prompt)" } -function git_user_info { +function git_user_info() { # support two or more initials, set by 'git pair' plugin SCM_CURRENT_USER=$(git config user.initials | sed 's% %+%') # if `user.initials` weren't set, attempt to extract initials from `user.name` @@ -410,7 +433,7 @@ function git_user_info { [[ -n "${SCM_CURRENT_USER}" ]] && printf "%s" "$SCM_THEME_CURRENT_USER_PREFFIX$SCM_CURRENT_USER$SCM_THEME_CURRENT_USER_SUFFIX" } -function clock_char { +function clock_char() { CLOCK_CHAR=${THEME_CLOCK_CHAR:-"⌚"} CLOCK_CHAR_COLOR=${THEME_CLOCK_CHAR_COLOR:-"$normal"} SHOW_CLOCK_CHAR=${THEME_SHOW_CLOCK_CHAR:-"true"} @@ -420,7 +443,7 @@ function clock_char { fi } -function clock_prompt { +function clock_prompt() { CLOCK_COLOR=${THEME_CLOCK_COLOR:-"$normal"} CLOCK_FORMAT=${THEME_CLOCK_FORMAT:-"%H:%M:%S"} [ -z $THEME_SHOW_CLOCK ] && THEME_SHOW_CLOCK=${THEME_CLOCK_CHECK:-"true"} @@ -432,14 +455,14 @@ function clock_prompt { fi } -function user_host_prompt { +function user_host_prompt() { if [[ "${THEME_SHOW_USER_HOST}" = "true" ]]; then - echo -e "${USER_HOST_THEME_PROMPT_PREFIX}\u@\h${USER_HOST_THEME_PROMPT_SUFFIX}" + echo -e "${USER_HOST_THEME_PROMPT_PREFIX}\u@\h${USER_HOST_THEME_PROMPT_SUFFIX}" fi } # backwards-compatibility -function git_prompt_info { +function git_prompt_info() { _git-hide-status && return git_prompt_vars echo -e "${SCM_PREFIX}${SCM_BRANCH}${SCM_STATE}${SCM_SUFFIX}" @@ -450,7 +473,7 @@ function p4_prompt_info() { echo -e "${SCM_PREFIX}${SCM_BRANCH}:${SCM_CHANGE}${SCM_STATE}${SCM_SUFFIX}" } -function svn_prompt_info { +function svn_prompt_info() { svn_prompt_vars echo -e "${SCM_PREFIX}${SCM_BRANCH}${SCM_STATE}${SCM_SUFFIX}" } @@ -460,39 +483,39 @@ function hg_prompt_info() { echo -e "${SCM_PREFIX}${SCM_BRANCH}:${SCM_CHANGE#*:}${SCM_STATE}${SCM_SUFFIX}" } -function scm_char { +function scm_char() { scm_prompt_char echo -e "${SCM_THEME_CHAR_PREFIX}${SCM_CHAR}${SCM_THEME_CHAR_SUFFIX}" } -function prompt_char { - scm_char +function prompt_char() { + scm_char } -function battery_char { - if [[ "${THEME_BATTERY_PERCENTAGE_CHECK}" = true ]]; then - echo -e "${bold_red}$(battery_percentage)%" - fi +function battery_char() { + if [[ "${THEME_BATTERY_PERCENTAGE_CHECK}" = true ]]; then + echo -e "${bold_red}$(battery_percentage)%" + fi } -if ! _command_exists battery_charge ; then - # if user has installed battery plugin, skip this... - function battery_charge (){ - # no op - echo -n - } +if ! _command_exists battery_charge; then + # if user has installed battery plugin, skip this... + function battery_charge() { + # no op + echo -n + } fi # The battery_char function depends on the presence of the battery_percentage function. # If battery_percentage is not defined, then define battery_char as a no-op. -if ! _command_exists battery_percentage ; then - function battery_char (){ - # no op - echo -n - } +if ! _command_exists battery_percentage; then + function battery_char() { + # no op + echo -n + } fi -function aws_profile { +function aws_profile() { if [[ $AWS_DEFAULT_PROFILE ]]; then echo -e "${AWS_DEFAULT_PROFILE}" else @@ -501,43 +524,43 @@ function aws_profile { } function __check_precmd_conflict() { - local f - for f in "${precmd_functions[@]}"; do - if [[ "${f}" == "${1}" ]]; then - return 0 - fi - done - return 1 + local f + for f in "${precmd_functions[@]}"; do + if [[ "${f}" == "${1}" ]]; then + return 0 + fi + done + return 1 } -function safe_append_prompt_command { - local prompt_re +function safe_append_prompt_command() { + local prompt_re - prompt_colorscheme + prompt_colorscheme - if [ "${__bp_imported}" == "defined" ]; then - # We are using bash-preexec - if ! __check_precmd_conflict "${1}" ; then - precmd_functions+=("${1}") - fi - else - # Set OS dependent exact match regular expression - if [[ ${OSTYPE} == darwin* ]]; then - # macOS - prompt_re="[[:<:]]${1}[[:>:]]" - else - # Linux, FreeBSD, etc. - prompt_re="\<${1}\>" - fi - - if [[ ${PROMPT_COMMAND} =~ ${prompt_re} ]]; then - return - elif [[ -z ${PROMPT_COMMAND} ]]; then - PROMPT_COMMAND="${1}" - else - PROMPT_COMMAND="${1};${PROMPT_COMMAND}" - fi + if [ "${__bp_imported}" == "defined" ]; then + # We are using bash-preexec + if ! __check_precmd_conflict "${1}"; then + precmd_functions+=("${1}") fi + else + # Set OS dependent exact match regular expression + if [[ ${OSTYPE} == darwin* ]]; then + # macOS + prompt_re="[[:<:]]${1}[[:>:]]" + else + # Linux, FreeBSD, etc. + prompt_re="\<${1}\>" + fi + + if [[ ${PROMPT_COMMAND} =~ ${prompt_re} ]]; then + return + elif [[ -z ${PROMPT_COMMAND} ]]; then + PROMPT_COMMAND="${1}" + else + PROMPT_COMMAND="${1};${PROMPT_COMMAND}" + fi + fi } function _save-and-reload-history() { @@ -545,18 +568,18 @@ function _save-and-reload-history() { [[ $autosave -eq 1 ]] && history -a && history -c && history -r } -function prompt_colorscheme { - [[ -z "${BASH_IT_COLORSCHEME}" ]] && return +function prompt_colorscheme() { + [[ -z "${BASH_IT_COLORSCHEME}" ]] && return - local -a colorscheme_locations=( - "${HOME}/.${BASH_IT_COLORSCHEME}.colorscheme.bash" - "$BASH_IT/custom/${BASH_IT_COLORSCHEME}.colorscheme.bash" - "$BASH_IT/colorschemes/${BASH_IT_COLORSCHEME}.colorscheme.bash" - ) + local -a colorscheme_locations=( + "${HOME}/.${BASH_IT_COLORSCHEME}.colorscheme.bash" + "$BASH_IT/custom/${BASH_IT_COLORSCHEME}.colorscheme.bash" + "$BASH_IT/colorschemes/${BASH_IT_COLORSCHEME}.colorscheme.bash" + ) - for scheme_file in ${colorscheme_locations[@]}; do - if [[ -f ${scheme_file} ]]; then - source "${scheme_file}" - fi - done + for scheme_file in ${colorscheme_locations[@]}; do + if [[ -f ${scheme_file} ]]; then + source "${scheme_file}" + fi + done } diff --git a/themes/powerline-multiline/powerline-multiline.base.bash b/themes/powerline-multiline/powerline-multiline.base.bash index 7ae33f86..378739d8 100644 --- a/themes/powerline-multiline/powerline-multiline.base.bash +++ b/themes/powerline-multiline/powerline-multiline.base.bash @@ -1,4 +1,6 @@ . "$BASH_IT/themes/powerline/powerline.base.bash" +. "$BASH_IT/themes/powerline/powerline.helpers.bash" + function __powerline_last_status_prompt { [[ "$1" -ne 0 ]] && echo "$(set_color ${LAST_STATUS_THEME_PROMPT_COLOR} -) ${1} ${normal}" diff --git a/themes/powerline-multiline/powerline-multiline.theme.bash b/themes/powerline-multiline/powerline-multiline.theme.bash index 583905fc..0d1b53e8 100644 --- a/themes/powerline-multiline/powerline-multiline.theme.bash +++ b/themes/powerline-multiline/powerline-multiline.theme.bash @@ -49,6 +49,12 @@ RBENV_THEME_PROMPT_SUFFIX="" RUBY_THEME_PROMPT_COLOR=${POWERLINE_RUBY_COLOR:=161} RUBY_CHAR=${POWERLINE_RUBY_CHAR:="❲r❳ "} +GO_THEME_PROMPT_COLOR=${POWERLINE_GO_COLOR:=33} +GO_CHAR=${POWERLINE_GO_CHAR:="(go) "} + +CWD_SHORTEN_TO=${POWERLINE_CWD_SHORTEN_TO:=30} +CWD_SHORTEN_SCREEN_PERCENT=${CWD_SHORTEN_SCREEN_PERCENT:=25} + TERRAFORM_THEME_PROMPT_COLOR=${POWERLINE_TERRAFORM_COLOR:=161} TERRAFORM_CHAR=${POWERLINE_TERRAFORM_CHAR:="❲t❳ "} diff --git a/themes/powerline/powerline.base.bash b/themes/powerline/powerline.base.bash index 8c983a7b..70ce92c9 100644 --- a/themes/powerline/powerline.base.bash +++ b/themes/powerline/powerline.base.bash @@ -1,6 +1,8 @@ # Define this here so it can be used by all of the Powerline themes THEME_CHECK_SUDO=${THEME_CHECK_SUDO:=true} +. "$BASH_IT/themes/powerline/powerline.helpers.bash" + function set_color { set +u if [[ "${1}" != "-" ]]; then @@ -67,6 +69,32 @@ function __powerline_ruby_prompt { [[ -n "${ruby_version}" ]] && echo "${RUBY_CHAR}${ruby_version}|${RUBY_THEME_PROMPT_COLOR}" } +function __find_nearest_go_mod() { + local path="${PWD}" + while true; do + [[ -z "${path}" || ${path} == "/" ]] && break + if [[ -f "${path}/go.mod" ]]; then + printf "${path}/go.mod" + return 0 + fi + path=$(dirname ${path}) + done +} + +function __powerline_go_prompt { + local go_version="" + + if _command_exists go ; then + local go_mod=$(__find_nearest_go_mod) + [[ -n "${go_mod}" && -f "${go_mod}" ]] || return + local -a go_version_output + mapfile -t go_version_output < <(egrep '^go ' ${go_mod} | tr ' ' '\n') + go_version="${go_version_output[1]}" + fi + + [[ -n "${go_version}" ]] && echo "${GO_CHAR}${go_version}|${GO_THEME_PROMPT_COLOR}" +} + function __powerline_k8s_context_prompt { local kubernetes_context="" @@ -121,8 +149,21 @@ function __powerline_scm_prompt { } function __powerline_cwd_prompt { - local cwd=$(pwd | sed "s|^${HOME}|~|") + local cwd + local max_width + local screen_width + if [[ -n "${CWD_SHORTEN_SCREEN_PERCENT}" ]]; then + screen_width=$(.powerline.screen-width) + max_width=$(( screen_width * CWD_SHORTEN_SCREEN_PERCENT / 100 )) + elif [[ -n "${CWD_SHORTEN_TO}" ]]; then + max_width=${CWD_SHORTEN_TO} + fi + if [[ -n ${max_width} ]]; then + cwd=$(cwd.shorten "${max_width}" "${PWD}") + else + cwd=$(pwd | sed "s|^${HOME}|~|") + fi echo "${cwd}|${CWD_THEME_PROMPT_COLOR}" } diff --git a/themes/powerline/powerline.helpers.bash b/themes/powerline/powerline.helpers.bash new file mode 100644 index 00000000..477d210f --- /dev/null +++ b/themes/powerline/powerline.helpers.bash @@ -0,0 +1,265 @@ +# A bunch of Powerline Prompt Helper functions that +# change which compnents are shown, and to what level of detail to +# render the Git/SCM info. + +# Minimizing the list of components and showing less Git info can significantly +# speed up your prompt rendering. +# +# For instance, on the most recent MacBook Pro 16 (2020) with 3GHZ CPU it takes 1 second +# to render the `powerline.prompt.git.max()` and powerline.prompt.all + +# @description +# This function returns a shortened +# @see: https://stackoverflow.com/questions/1616678/bash-pwd-shortening +export POWERLINE_SHORT_CWD_WIDTH=30 + +function cwd.shorten() { + local begin="" # The unshortened beginning of the path. + local shortbegin="" # The shortened beginning of the path. + local current="" # The section of the path we're currently working on. + local end="${2:-$(pwd)}/" # The unmodified rest of the path. + + if [[ "$end" =~ "${HOME}" ]]; then + INHOME=1 + end="${end#$HOME}" #strip /home/username from start of string + begin="$HOME" #start expansion from the right spot + else + INHOME=0 + fi + + local end="${end#/}" # Strip the first / + local shortenedpath="$end" # The whole path, to check the length. + local maxlength="${1:-${POWERLINE_SHORT_CWD_WIDTH}}" + + shopt -q nullglob && NGV="-s" || NGV="-u" # Store the value for later. + shopt -s nullglob # Without this, anything that doesn't exist in the filesystem turns into */*/*/... + + while [[ "$end" ]] && (( ${#shortenedpath} > maxlength )) + do + current="${end%%/*}" # everything before the first / + end="${end#*/}" # everything after the first / + + shortcurstar="$current" # No star if we don't shorten it. + + for ((i=${#current}-2; i>=0; i--)); do + subcurrent="${current:0:i}" + matching=("$begin/$subcurrent"*) # Array of all files that start with $subcurrent. + (( ${#matching[*]} != 1 )) && break # Stop shortening if more than one file matches. + shortcurstar="${subcurrent}…" + done + + #a dvance + begin="$begin/$current" + shortbegin="$shortbegin/$shortcurstar" + shortenedpath="$shortbegin/$end" + done + + shortenedpath="${shortenedpath%/}" # strip trailing / + shortenedpath="${shortenedpath#/}" # strip leading / + + if [ $INHOME -eq 1 ]; then + echo "~/$shortenedpath" #make sure it starts with ~/ + else + echo "/$shortenedpath" # Make sure it starts with / + fi + + shopt "$NGV" nullglob # Reset nullglob in case this is being used as a function. +} + +# Powerline Prompt Configuration +function powerline.prompt.git.max() { + export SCM_GIT_SHOW_MINIMAL_INFO=false + + export SCM_GIT_SHOW_COMMIT_COUNT=true + export SCM_GIT_SHOW_CURRENT_USER=true + export SCM_GIT_SHOW_DETAILS=true + export SCM_GIT_SHOW_REMOTE_INFO=true + export SCM_GIT_SHOW_STASH_INFO=true + +} + +function powerline.prompt.git.min() { + export SCM_GIT_SHOW_MINIMAL_INFO=true + + export SCM_GIT_SHOW_CURRENT_USER=false + export SCM_GIT_SHOW_DETAILS=false + export SCM_GIT_SHOW_COMMIT_COUNT=false + export SCM_GIT_SHOW_REMOTE_INFO=false + export SCM_GIT_SHOW_STASH_INFO=false +} + +function powerline.prompt.git.default() { + export SCM_GIT_SHOW_MINIMAL_INFO=false + + export SCM_GIT_SHOW_CURRENT_USER=true + export SCM_GIT_SHOW_DETAILS=true + export SCM_GIT_SHOW_COMMIT_COUNT=false + export SCM_GIT_SHOW_REMOTE_INFO=false + export SCM_GIT_SHOW_STASH_INFO=true +} + +.powerline.screen-width() { + local w + local os=$(uname -s) + if [[ $os == 'Darwin' ]]; then + w=$(stty -a 2>/dev/null | grep columns | awk '{print $6}'); + else + w=$(stty -a 2>/dev/null | grep columns | awk '{print $7}' | sedx 's/;//g'); + fi + printf -- "%d" ${w} +} + +# Filter/convert components passed as arguments to the +# correct powerline modules +# @example: .powerline.components ruby python k8 garbage +# @output: ruby python_venv k8s_context +function .powerline.components() { + local -a components + components=() + for c in "$@"; do + [[ ${c} == "python" ]] && c="python_venv" + [[ ${c} == "k8" ]] && c="k8s_context" + local func="__powerline_${c}_prompt" + type "$func" 2> /dev/null | head -1 | grep -q 'is a function' && components+=("${c}") + done + echo "${components[@]}" +} + +function .powerline.supported.components() { + set | grep -E '^__powerline_.*_prompt' | sed 's/__powerline_//g; s/_prompt.*$//g; s/^/ • /g' +} + +# usage: powerline.prompt.set [ lang [ lang ]... ] +# eg: powerline.prompt.set cwd ruby go node battery +function powerline.prompt.set() { + [[ -z "$*" ]] && { + echo -e "${echo_bold_red}Please pass an argument list of components you'd like to see in the PROMPT.${echo_reset_color}" + echo -e "${echo_bold_yellow}Here is the list of all currently supported components:${echo_green}\n" + .powerline.supported.components + echo -e "${echo_reset_color}" + return + } + + local -a components + components=($(.powerline.components "$@")) + + local count="${#components[@]}" + local half="$(( count / 2 ))" + local even=0 + [[ $(( count % 2 )) -eq 0 ]] && even=1 + + local half_plus_one="$((half+1))" + + # Single-line Powerline Prompts + export POWERLINE_PROMPT="${components[*]}" + + # Multiline Powerline Prompts + export POWERLINE_LEFT_PROMPT="${components[@]:0:${half_plus_one}}" + if (( even )); then + export POWERLINE_RIGHT_PROMPT="${components[@]:${half_plus_one}}" + else + export POWERLINE_RIGHT_PROMPT="${components[@]:${half_plus_one}}" + fi +} + +function powerline.prompt.show() { + if [[ $BASH_IT_THEME =~ "multiline" ]]; then + powerline.prompt.set-left-to + powerline.prompt.set-right-to + else + powerline.prompt.set-to + fi +} + +function powerline.prompt.set-to() { + if [[ -z $* ]]; then + echo "${POWERLINE_PROMPT}" + else + export POWERLINE_PROMPT="$(.powerline.components "$@")" + fi +} + +function powerline.prompt.set-right-to() { + if [[ -z $* ]]; then + echo "${POWERLINE_RIGHT_PROMPT}" + else + export POWERLINE_RIGHT_PROMPT="$(.powerline.components "$@")" + fi +} + +function powerline.prompt.set-left-to() { + if [[ -z $* ]]; then + echo "${POWERLINE_LEFT_PROMPT}" + else + export POWERLINE_LEFT_PROMPT="$(.powerline.components "$@")" + fi +} + +# @example: powerline.prompt.add-component left ruby +function powerline.prompt.add-component() { + local side="$1" + local func + if [[ -n $1 ]] ; then + func="powerline.prompt.set-${side}-to" + shift + else + func="powerline.prompt.set-to" + fi + + ${func} $(${func}) "$@" +} + +function powerline.prompt.golang() { + powerline.prompt.add-component left go +} + +function powerline.prompt.node() { + powerline.prompt.add-component left node +} + +function powerline.prompt.ruby() { + powerline.prompt.add-component left ruby +} + +function powerline.prompt.python() { + powerline.prompt.add-component left python_venv +} + +## Configure the level of Git Detail +function powerline.prompt.min() { + export POWERLINE_LEFT_PROMPT="cwd" + export POWERLINE_RIGHT_PROMPT="clock user_info hostname" +} + +function powerline.prompt.all() { + powerline.prompt + export POWERLINE_LEFT_PROMPT="scm clock cwd" + export POWERLINE_RIGHT_PROMPT="user_info hostname battery" +} + +function powerline.prompt.default() { + export POWERLINE_LEFT_PROMPT="scm node ruby go cwd " + export POWERLINE_RIGHT_PROMPT=" clock user_info hostname battery" +} + +function powerline.default() { + powerline-max +} + +function powerline.prompt.alternative-symbols() { + export SCM_GIT_CHAR=" Ⓖ " + export USER_INFO_SSH_CHAR="🔐 " + export PYTHON_VENV_CHAR="ⓟ " + export CONDA_PYTHON_VENV_CHAR="ⓒⓟ " + export NODE_CHAR="ⓝ " + export RUBY_CHAR="ⓡ " + export GO_CHAR="ⓖ " + export TERRAFORM_CHAR="ⓣ " + export KUBERNETES_CONTEXT_THEME_CHAR="⎈ " + export AWS_PROFILE_CHAR="«aws» " + export BATTERY_AC_CHAR="⚡" + export IN_VIM_THEME_PROMPT_TEXT="ⓥ " + export SHLVL_THEME_PROMPT_CHAR="ⓢ " + export COMMAND_NUMBER_THEME_PROMPT_CHAR="↳" + +} \ No newline at end of file diff --git a/themes/powerline/powerline.theme.bash b/themes/powerline/powerline.theme.bash index d897c7c8..14cf23a6 100644 --- a/themes/powerline/powerline.theme.bash +++ b/themes/powerline/powerline.theme.bash @@ -45,6 +45,12 @@ RBENV_THEME_PROMPT_SUFFIX="" RUBY_THEME_PROMPT_COLOR=${POWERLINE_RUBY_COLOR:=161} RUBY_CHAR=${POWERLINE_RUBY_CHAR:="❲r❳ "} +GO_THEME_PROMPT_COLOR=${POWERLINE_GO_COLOR:=33} +GO_CHAR=${POWERLINE_GO_CHAR:="(go) "} + +CWD_SHORTEN_TO=${POWERLINE_CWD_SHORTEN_TO:=15} +CWD_SHORTEN_SCREEN_PERCENT=${CWD_SHORTEN_SCREEN_PERCENT:=25} + TERRAFORM_THEME_PROMPT_COLOR=${POWERLINE_TERRAFORM_COLOR:=161} TERRAFORM_CHAR=${POWERLINE_TERRAFORM_CHAR:="❲t❳ "}