Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DRAFT: theme/powerline-multiline: harmonize powerline.base files #2051

Draft
wants to merge 9 commits into
base: master
Choose a base branch
from
1 change: 1 addition & 0 deletions clean_files.txt
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ themes/modern
themes/norbu
themes/pete
themes/powerline
themes/powerline-multiline
themes/pure
themes/purity

Expand Down
213 changes: 114 additions & 99 deletions themes/powerline-multiline/powerline-multiline.base.bash
Original file line number Diff line number Diff line change
@@ -1,106 +1,121 @@
. "$BASH_IT/themes/powerline/powerline.base.bash"

function __powerline_last_status_prompt {
[[ "$1" -ne 0 ]] && echo "$(set_color ${LAST_STATUS_THEME_PROMPT_COLOR} -) ${1} ${normal}"
# shellcheck shell=bash
# shellcheck disable=SC2034 # Expected behavior for themes.
# shellcheck source-path=SCRIPTDIR/../powerline
source "${BASH_IT?}/themes/powerline/powerline.base.bash"

function __powerline_right_segment() {
local -a params
IFS="|" read -ra params <<< "${1}"
local pad_before_segment=" "
local padding=0

if [[ "${SEGMENTS_AT_RIGHT}" -eq 0 ]]; then
if [[ "${POWERLINE_COMPACT_AFTER_LAST_SEGMENT:-${POWERLINE_COMPACT:-0}}" -ne 0 ]]; then
pad_before_segment=""
fi
RIGHT_PROMPT+="$(set_color "${params[1]:-}" -)${POWERLINE_RIGHT_LAST_SEGMENT_END_CHAR:-}${normal?}"
((padding += 1))
else
if [[ "${POWERLINE_COMPACT_BEFORE_SEPARATOR:-}" -ne 0 ]]; then
pad_before_segment=""
fi
# Since the previous segment wasn't the last segment, add padding, if needed
#
if [[ "${POWERLINE_COMPACT_AFTER_SEPARATOR:-0}" -eq 0 ]]; then
RIGHT_PROMPT+="$(set_color - "${LAST_SEGMENT_COLOR?}") ${normal}"
((padding += 1))
fi
if [[ "${LAST_SEGMENT_COLOR}" -eq "${params[1]:-}" ]]; then
RIGHT_PROMPT+="$(set_color - "${LAST_SEGMENT_COLOR?}")${POWERLINE_RIGHT_SEPARATOR_SOFT- }${normal?}"
else
RIGHT_PROMPT+="$(set_color "${params[1]:-}" "${LAST_SEGMENT_COLOR?}")${POWERLINE_RIGHT_SEPARATOR- }${normal?}"
fi
((padding += 1))
fi

RIGHT_PROMPT+="$(set_color - "${params[1]:-}")${pad_before_segment}${params[0]}${normal?}"

((padding += ${#pad_before_segment}))
((padding += ${#params[0]}))

((RIGHT_PROMPT_LENGTH += padding))
LAST_SEGMENT_COLOR="${params[1]:-}"
((SEGMENTS_AT_RIGHT += 1))
}

function __powerline_right_segment {
local OLD_IFS="${IFS}"; IFS="|"
local params=( $1 )
IFS="${OLD_IFS}"
local padding=0
local pad_before_segment=" "

if [[ "${SEGMENTS_AT_RIGHT}" -eq 0 ]]; then
if [[ "${POWERLINE_COMPACT_AFTER_LAST_SEGMENT}" -ne 0 ]]; then
pad_before_segment=""
fi
RIGHT_PROMPT+="$(set_color ${params[1]} -)${POWERLINE_RIGHT_END}${normal}"
(( padding += 1 ))
else
if [[ "${POWERLINE_COMPACT_BEFORE_SEPARATOR}" -ne 0 ]]; then
pad_before_segment=""
fi
# Since the previous segment wasn't the last segment, add padding, if needed
#
if [[ "${POWERLINE_COMPACT_AFTER_SEPARATOR}" -eq 0 ]]; then
RIGHT_PROMPT+="$(set_color - ${LAST_SEGMENT_COLOR}) ${normal}"
(( padding += 1 ))
fi
if [[ "${LAST_SEGMENT_COLOR}" -eq "${params[1]}" ]]; then
RIGHT_PROMPT+="$(set_color - ${LAST_SEGMENT_COLOR})${POWERLINE_RIGHT_SEPARATOR_SOFT}${normal}"
else
RIGHT_PROMPT+="$(set_color ${params[1]} ${LAST_SEGMENT_COLOR})${POWERLINE_RIGHT_SEPARATOR}${normal}"
fi
(( padding += 1 ))
fi

RIGHT_PROMPT+="$(set_color - ${params[1]})${pad_before_segment}${params[0]}${normal}"

(( padding += ${#pad_before_segment} ))
(( padding += ${#params[0]} ))

(( RIGHT_PROMPT_LENGTH += padding ))
LAST_SEGMENT_COLOR="${params[1]}"
(( SEGMENTS_AT_RIGHT += 1 ))
function __powerline_right_first_segment_padding() {
RIGHT_PROMPT+="$(set_color - "${LAST_SEGMENT_COLOR?}") ${normal?}"
((RIGHT_PROMPT_LENGTH += 1))
}

function __powerline_right_first_segment_padding {
RIGHT_PROMPT+="$(set_color - ${LAST_SEGMENT_COLOR}) ${normal}"
(( RIGHT_PROMPT_LENGTH += 1 ))
function __powerline_last_status_prompt() {
if [[ "${1?}" -ne 0 ]]; then
printf '%b %s %b' "$(set_color "${LAST_STATUS_THEME_PROMPT_COLOR-"52"}" -)" "${1}" "${normal?}"
fi
}

function __powerline_prompt_command {
local last_status="$?" ## always the first
local move_cursor_rightmost='\033[500C'

LEFT_PROMPT=""
RIGHT_PROMPT=""
RIGHT_PROMPT_LENGTH=${POWERLINE_PADDING}
SEGMENTS_AT_LEFT=0
SEGMENTS_AT_RIGHT=0
LAST_SEGMENT_COLOR=""

_save-and-reload-history "${HISTORY_AUTOSAVE:-0}"

## left prompt ##
for segment in $POWERLINE_LEFT_PROMPT; do
local info="$(__powerline_${segment}_prompt)"
[[ -n "${info}" ]] && __powerline_left_segment "${info}"
done

if [[ -n "${LEFT_PROMPT}" ]] && [[ "${POWERLINE_COMPACT_AFTER_LAST_SEGMENT}" -eq 0 ]]; then
__powerline_left_last_segment_padding
fi

[[ -n "${LEFT_PROMPT}" ]] && LEFT_PROMPT+="$(set_color ${LAST_SEGMENT_COLOR} -)${POWERLINE_LEFT_END}${normal}"

## right prompt ##
if [[ -n "${POWERLINE_RIGHT_PROMPT}" ]]; then
# LEFT_PROMPT+="${move_cursor_rightmost}"
for segment in $POWERLINE_RIGHT_PROMPT; do
local info="$(__powerline_${segment}_prompt)"
[[ -n "${info}" ]] && __powerline_right_segment "${info}"
done

if [[ -n "${RIGHT_PROMPT}" ]] && [[ "${POWERLINE_COMPACT_BEFORE_FIRST_SEGMENT}" -eq 0 ]]; then
__powerline_right_first_segment_padding
fi

RIGHT_PAD=$(printf "%.s " $(seq 1 $RIGHT_PROMPT_LENGTH))
LEFT_PROMPT+="${RIGHT_PAD}${move_cursor_rightmost}"
LEFT_PROMPT+="\033[$(( ${#RIGHT_PAD} - 1 ))D"
fi

local prompt="${PROMPT_CHAR}"
if [[ "${POWERLINE_COMPACT_PROMPT}" -eq 0 ]]; then
prompt+=" "
fi

PS1="${LEFT_PROMPT}${RIGHT_PROMPT}\n$(__powerline_last_status_prompt ${last_status})${prompt}"

## cleanup ##
unset LAST_SEGMENT_COLOR \
LEFT_PROMPT RIGHT_PROMPT RIGHT_PROMPT_LENGTH \
SEGMENTS_AT_LEFT SEGMENTS_AT_RIGHT
function __powerline_prompt_command() {
local last_status="$?" ## always the first
local beginning_of_line='\[\e[G\]'
local move_cursor_rightmost='\e[500C'
local info prompt_color segment prompt

local LEFT_PROMPT=""
local RIGHT_PROMPT=""
local RIGHT_PROMPT_LENGTH=${POWERLINE_PADDING:-2}
local SEGMENTS_AT_LEFT=0
local SEGMENTS_AT_RIGHT=0
local LAST_SEGMENT_COLOR=""

_save-and-reload-history "${HISTORY_AUTOSAVE:-0}"

if [[ -n "${POWERLINE_PROMPT_DISTRO_LOGO:-}" ]]; then
LEFT_PROMPT+="$(set_color "${PROMPT_DISTRO_LOGO_COLOR?}" "${PROMPT_DISTRO_LOGO_COLORBG?}")${PROMPT_DISTRO_LOGO?}$(set_color - -)"
fi

## left prompt ##
# shellcheck disable=SC2068 # intended behavior
for segment in ${POWERLINE_PROMPT[@]-"user_info" "scm" "python_venv" "ruby" "node" "cwd"}; do
info="$("__powerline_${segment}_prompt")"
if [[ -n "${info}" ]]; then
__powerline_left_segment "${info}"
fi
done

if [[ -n "${LEFT_PROMPT:-}" && "${POWERLINE_COMPACT_AFTER_LAST_SEGMENT:-${POWERLINE_COMPACT:-0}}" -eq 0 ]]; then
__powerline_left_last_segment_padding
fi

# By default we try to match the prompt to the adjacent segment's background color,
# but when part of the prompt exists within that segment, we instead match the foreground color.
prompt_color="$(set_color "${LAST_SEGMENT_COLOR?}" -)"
if [[ -n "${LEFT_PROMPT:-}" && -n "${POWERLINE_LEFT_LAST_SEGMENT_END_CHAR:-}" ]]; then
LEFT_PROMPT+="$(set_color - "${LAST_SEGMENT_COLOR?}")${POWERLINE_LEFT_LAST_SEGMENT_END_CHAR}"
prompt_color="${normal?}"
fi

## right prompt ##
if [[ -n "${POWERLINE_RIGHT_PROMPT[*]:-}" ]]; then
# LEFT_PROMPT+="${move_cursor_rightmost}"
# shellcheck disable=SC2068 # intended behavior
for segment in ${POWERLINE_RIGHT_PROMPT[@]}; do
info="$("__powerline_${segment}_prompt")"
[[ -n "${info}" ]] && __powerline_right_segment "${info}"
done

if [[ -n "${RIGHT_PROMPT:-}" && "${POWERLINE_COMPACT_BEFORE_FIRST_SEGMENT:-${POWERLINE_COMPACT:-0}}" -eq 0 ]]; then
__powerline_right_first_segment_padding
fi

RIGHT_PAD=$(printf "%.s " $(seq 1 "${RIGHT_PROMPT_LENGTH}"))
LEFT_PROMPT+="${RIGHT_PAD}${move_cursor_rightmost}"
LEFT_PROMPT+="\033[$((${#RIGHT_PAD} - 1))D"
fi

prompt="${prompt_color}${PROMPT_CHAR-${POWERLINE_PROMPT_CHAR-\\$}}${normal?}"
if [[ "${POWERLINE_COMPACT_PROMPT:-${POWERLINE_COMPACT:-0}}" -eq 0 ]]; then
prompt+=" "
fi

PS1="${beginning_of_line}${normal?}${LEFT_PROMPT}${RIGHT_PROMPT}\n$(__powerline_last_status_prompt "${last_status}")${prompt}"
}
43 changes: 22 additions & 21 deletions themes/powerline-multiline/powerline-multiline.theme.bash
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
#!/usr/bin/env bash

. "$BASH_IT/themes/powerline-multiline/powerline-multiline.base.bash"
# shellcheck shell=bash
# shellcheck disable=SC2034 # Expected behavior for themes.
# shellcheck source-path=SCRIPTDIR/../powerline-multiline
source "${BASH_IT?}/themes/powerline-multiline/powerline-multiline.base.bash"

PROMPT_CHAR=${POWERLINE_PROMPT_CHAR:="❯"}
POWERLINE_LEFT_SEPARATOR=${POWERLINE_LEFT_SEPARATOR:=""}
POWERLINE_LEFT_SEPARATOR_SOFT=${POWERLINE_LEFT_SEPARATOR_SOFT:=""}
POWERLINE_RIGHT_SEPARATOR=${POWERLINE_RIGHT_SEPARATOR:=""}
POWERLINE_RIGHT_SEPARATOR_SOFT=${POWERLINE_RIGHT_SEPARATOR_SOFT:=""}
POWERLINE_LEFT_END=${POWERLINE_LEFT_END:=""}
POWERLINE_RIGHT_END=${POWERLINE_RIGHT_END:=""}
POWERLINE_PADDING=${POWERLINE_PADDING:=2}

POWERLINE_COMPACT=${POWERLINE_COMPACT:=0}
POWERLINE_COMPACT_BEFORE_SEPARATOR=${POWERLINE_COMPACT_BEFORE_SEPARATOR:=${POWERLINE_COMPACT}}
POWERLINE_COMPACT_AFTER_SEPARATOR=${POWERLINE_COMPACT_AFTER_SEPARATOR:=${POWERLINE_COMPACT}}
POWERLINE_COMPACT_BEFOR_FIRST_SEGMENT=${POWERLINE_COMPACT_BEFORE_FIRST_SEGMENT:=${POWERLINE_COMPACT}}
POWERLINE_COMPACT_AFTER_LAST_SEGMENT=${POWERLINE_COMPACT_AFTER_LAST_SEGMENT:=${POWERLINE_COMPACT}}
POWERLINE_COMPACT_PROMPT=${POWERLINE_COMPACT_PROMPT:=${POWERLINE_COMPACT}}
: "${POWERLINE_LEFT_SEPARATOR:=""}"
: "${POWERLINE_LEFT_SEPARATOR_SOFT:=""}"
: "${POWERLINE_RIGHT_SEPARATOR:=""}"
: "${POWERLINE_RIGHT_SEPARATOR_SOFT:=""}"
: "${POWERLINE_LEFT_LAST_SEGMENT_END_CHAR:=""}"
: "${POWERLINE_RIGHT_LAST_SEGMENT_END_CHAR:=""}"
: "${POWERLINE_PADDING:=2}"

: "${POWERLINE_COMPACT:=0}"
: "${POWERLINE_COMPACT_BEFORE_SEPARATOR:=${POWERLINE_COMPACT}}"
: "${POWERLINE_COMPACT_AFTER_SEPARATOR:=${POWERLINE_COMPACT}}"
: "${POWERLINE_COMPACT_BEFORE_FIRST_SEGMENT:=${POWERLINE_COMPACT}}"
: "${POWERLINE_COMPACT_AFTER_LAST_SEGMENT:=${POWERLINE_COMPACT}}"
: "${POWERLINE_COMPACT_PROMPT:=${POWERLINE_COMPACT}}"

USER_INFO_SSH_CHAR=${POWERLINE_USER_INFO_SSH_CHAR:=" "}
USER_INFO_THEME_PROMPT_COLOR=${POWERLINE_USER_INFO_COLOR:=32}
Expand Down Expand Up @@ -67,12 +68,12 @@ LAST_STATUS_THEME_PROMPT_COLOR=${POWERLINE_LAST_STATUS_COLOR:=196}

CLOCK_THEME_PROMPT_COLOR=${POWERLINE_CLOCK_COLOR:=240}

BATTERY_AC_CHAR=${BATTERY_AC_CHAR:="⚡"}
: "${BATTERY_AC_CHAR:="⚡"}"
BATTERY_STATUS_THEME_PROMPT_GOOD_COLOR=${POWERLINE_BATTERY_GOOD_COLOR:=70}
BATTERY_STATUS_THEME_PROMPT_LOW_COLOR=${POWERLINE_BATTERY_LOW_COLOR:=208}
BATTERY_STATUS_THEME_PROMPT_CRITICAL_COLOR=${POWERLINE_BATTERY_CRITICAL_COLOR:=160}

THEME_CLOCK_FORMAT=${THEME_CLOCK_FORMAT:="%H:%M:%S"}
: "${THEME_CLOCK_FORMAT:="%H:%M:%S"}"

IN_VIM_THEME_PROMPT_COLOR=${POWERLINE_IN_VIM_COLOR:=245}
IN_VIM_THEME_PROMPT_TEXT=${POWERLINE_IN_VIM_TEXT:="vim"}
Expand All @@ -99,7 +100,7 @@ GCLOUD_CHAR=${POWERLINE_GCLOUD_CHAR:="❲G❳ "}

COMMAND_DURATION_PROMPT_COLOR=${POWERLINE_COMMAND_DURATION_COLOR:=129}

POWERLINE_LEFT_PROMPT=${POWERLINE_LEFT_PROMPT:="scm python_venv ruby node cwd"}
POWERLINE_RIGHT_PROMPT=${POWERLINE_RIGHT_PROMPT:="in_vim clock battery user_info"}
: "${POWERLINE_LEFT_PROMPT:="scm python_venv ruby node cwd"}"
: "${POWERLINE_RIGHT_PROMPT:="in_vim clock battery user_info"}"

safe_append_prompt_command __powerline_prompt_command
Loading