lp-jolly/dotmatrix.theme

1312 lines
52 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

########################################################################
# API
########################################################################
_lp_dotmatrix_theme_activate() {
if ! _lp_version_greatereq 2 2 0 ; then
_lp_join "." ${_LP_VERSION[@]}
printf "WARNING: the DotMatrix theme requires Liquid Prompt >= 2.2.0, but you have version $lp_join, some features will not work and the prompt may crash.\n"
fi
LP_ENABLE_VCS_DIFFSTATS=${LP_ENABLE_VCS_DIFFSTATS:-1}
_LP_LOAD_THRESHOLD=${_LP_LOAD_THRESHOLD:-80}
_LP_LOAD_CAP=${_LP_LOAD_CAP:-100}
DOTMATRIX_DISPLAY_TEXT=${DOTMATRIX_DISPLAY_TEXT:-"T"}
DOTMATRIX_DISPLAY_X11=${DOTMATRIX_DISPLAY_X11:-"X"}
DOTMATRIX_HOST_LOCAL=${DOTMATRIX_HOST_LOCAL:-"⌂"}
DOTMATRIX_MARK_STASH=${DOTMATRIX_MARK_STASH:-"✝"}
DOTMATRIX_MARK_UNTRACKED=${DOTMATRIX_MARK_UNTRACKED:-"?"} # ⛶
DOTMATRIX_DIFF=${DOTMATRIX_DIFF:-"≠"}
DOTMATRIX_ENABLE_GRADIENT_LINE=${DOTMATRIX_ENABLE_GRADIENT_LINE:-0}
DOTMATRIX_ENABLE_SHELL=${DOTMATRIX_ENABLE_SHELL:-0}
DOTMATRIX_SHELL_ZSH=${DOTMATRIX_SHELL_ZSH:-"z"}
DOTMATRIX_SHELL_BASH=${DOTMATRIX_SHELL_BASH:-"b"}
DOTMATRIX_ENABLE_HISTORY=${DOTMATRIX_ENABLE_HISTORY:-0}
DOTMATRIX_HISTORY_LAST_LEN=${DOTMATRIX_HISTORY_LAST_LEN:-$((COLUMNS/4))}
DOTMATRIX_HISTORY_LAST_LEN_MARK=${DOTMATRIX_HISTORY_LAST_LEN_MARK:-"[…]"}
DOTMATRIX_HISTORY_MOST_BACK=${DOTMATRIX_HISTORY_MOST_BACK:-100}
# Thresholds based on 75th quantile for:
# nb of commits in PR on Github and added+removed lines.
# See: https://promyze.com/observations-on-10000-pull-requests-on-github/
DOTMATRIX_VCS_AHEAD_THRESHOLD=${DOTMATRIX_VCS_AHEAD_THRESHOLD:-5}
DOTMATRIX_VCS_BEHIND_THRESHOLD=${DOTMATRIX_VCS_BEHIND_THRESHOLD:-5}
DOTMATRIX_VCS_DIFF_THRESHOLD=${DOTMATRIX_VCS_DIFF_THRESHOLD:-300}
DOTMATRIX_DETACHED_THRESHOLD=${DOTMATRIX_DETACHED_THRESHOLD:-3}
DOTMATRIX_RUNNING_THRESHOLD=${DOTMATRIX_RUNNING_THRESHOLD:-3}
DOTMATRIX_STOPPED_THRESHOLD=${DOTMATRIX_STOPPED_THRESHOLD:-3}
DOTMATRIX_BATTERY_THRESHOLD=${DOTMATRIX_BATTERY_THRESHOLD:-$((LP_BATTERY_THRESHOLD/2))}
DOTMATRIX_RAM_THRESHOLD=${DOTMATRIX_RAM_THRESHOLD:-$((LP_RAM_THRESHOLD/2))}
DOTMATRIX_DISK_THRESHOLD=${DOTMATRIX_DISK_THRESHOLD:-$((LP_DISK_THRESHOLD/2))}
DOTMATRIX_TEMP_THRESHOLD=${DOTMATRIX_TEMP_THRESHOLD:-$((LP_TEMP_THRESHOLD*2))}
# Use prefixed _LP_* variables, which are integers.
DOTMATRIX_LOAD_THRESHOLD=${DOTMATRIX_LOAD_THRESHOLD:-$((_LP_LOAD_THRESHOLD+(_LP_LOAD_CAP-_LP_LOAD_THRESHOLD)/2))}
DOTMATRIX_MARK_ERROR=${DOTMATRIX_MARK_ERROR:-""}
# Sets of characters
# Dotmatrix theme
DOTMATRIX_HOST_LOCAL=${DOTMATRIX_HOST_LOCAL:-"⌂"}
DOTMATRIX_USER_LOCAL=${DOTMATRIX_USER_LOCAL:-"♟"}
DOTMATRIX_VCS=${DOTMATRIX_VCS:-"╟┘"}
DOTMATRIX_MARK=${DOTMATRIX_MARK:-"■"}
DOTMATRIX_LINE=${DOTMATRIX_LINE:-"━"}
DOTMATRIX_PLUG=${DOTMATRIX_PLUG:-"▛"}
DOTMATRIX_SOFT=${DOTMATRIX_SOFT:-""}
DOTMATRIX_MEAN=${DOTMATRIX_MEAN:-"▞"}
# Separator arrays (left center right)
DOTMATRIX_LINK=( ${DOTMATRIX_LINK[@]+"${DOTMATRIX_LINK[@]}"} )
[[ ${#DOTMATRIX_LINK[@]} == 0 ]] && DOTMATRIX_LINK=("▙" " " "▜")
DOTMATRIX_LINK_R=( ${DOTMATRIX_LINK_R[@]+"${DOTMATRIX_LINK_R[@]}"} )
[[ ${#DOTMATRIX_LINK_R[@]} == 0 ]] && DOTMATRIX_LINK_R=("▛" " " "▟")
DOTMATRIX_OPEN=( ${DOTMATRIX_OPEN[@]+"${DOTMATRIX_OPEN[@]}"} )
[[ ${#DOTMATRIX_OPEN[@]} == 0 ]] && DOTMATRIX_OPEN=("▙" " ▚ " "▜")
DOTMATRIX_DANG=( ${DOTMATRIX_DANG[@]+"${DOTMATRIX_DANG[@]}"} )
[[ ${#DOTMATRIX_DANG[@]} == 0 ]] && DOTMATRIX_DANG=("▙" " □ " "▜")
DOTMATRIX_ENDS=( ${DOTMATRIX_ENDS[@]+"${DOTMATRIX_ENDS[@]}"} )
[[ ${#DOTMATRIX_ENDS[@]} == 0 ]] && DOTMATRIX_ENDS=("▛" "▞▗ ▝" "▖ ▘▞▟")
DOTMATRIX_ITEMS=( ${DOTMATRIX_ITEMS[@]+"${DOTMATRIX_ITEMS[@]}"} )
[[ ${#DOTMATRIX_ITEMS[@]} == 0 ]] && DOTMATRIX_ITEMS=("┫" "┃" "┣")
DOTMATRIX_SPACED=${DOTMATRIX_SPACED:-1}
# Number of spaces to add
if [[ ${DOTMATRIX_SPACED} == 0 ]] ; then
DOTMATRIX_SPACE_VOID=""
DOTMATRIX_SPACE_FILL=""
DOTMATRIX_SPACE_PATH=${DOTMATRIX_SPACE_PATH:-""}
DOTMATRIX_SPACE_FIELD=${DOTMATRIX_SPACE_FIELD:-""}
DOTMATRIX_SPACE_LINE=${DOTMATRIX_SPACE_LINE:-""}
elif [[ ${DOTMATRIX_SPACED} == 1 ]] ; then
DOTMATRIX_SPACE_VOID=" "
DOTMATRIX_SPACE_FILL="█"
DOTMATRIX_SPACE_PATH=${DOTMATRIX_SPACE_PATH:-" "}
DOTMATRIX_SPACE_FIELD=${DOTMATRIX_SPACE_FIELD:-""}
DOTMATRIX_SPACE_LINE=${DOTMATRIX_SPACE_LINE:-" "}
else
local n="${DOTMATRIX_SPACED:-1}"
[[ $n -lt 0 ]] && n=1
local i
DOTMATRIX_SPACE_VOID=""
DOTMATRIX_SPACE_FILL=""
for ((i=0; i < n; i++)); do
DOTMATRIX_SPACE_VOID+=" " # Regular space
DOTMATRIX_SPACE_FILL+="█" # Inverted space
done
DOTMATRIX_SPACE_PATH=${DOTMATRIX_SPACE_PATH:-"${DOTMATRIX_SPACE_VOID}"}
DOTMATRIX_SPACE_FIELD=${DOTMATRIX_SPACE_FIELD:-""}
DOTMATRIX_SPACE_LINE=${DOTMATRIX_SPACE_LINE:-""}
fi
# Color arrays defaults fg bg b u ffg fbg
DOTMATRIX_COLOR_DARK=( ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} )
[[ ${#DOTMATRIX_COLOR_DARK[@]} == 0 ]] && DOTMATRIX_COLOR_DARK=(252 239 0 0 15 0)
DOTMATRIX_COLOR_LITE=( ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} )
[[ ${#DOTMATRIX_COLOR_LITE[@]} == 0 ]] && DOTMATRIX_COLOR_LITE=(239 252 0 0 0 15)
DOTMATRIX_COLOR_GLOW=( ${DOTMATRIX_COLOR_GLOW[@]+"${DOTMATRIX_COLOR_GLOW[@]}"} )
[[ ${#DOTMATRIX_COLOR_GLOW[@]} == 0 ]] && DOTMATRIX_COLOR_GLOW=( 0 252 1 0 0 15)
DOTMATRIX_COLOR_NOTE=( ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} )
[[ ${#DOTMATRIX_COLOR_NOTE[@]} == 0 ]] && DOTMATRIX_COLOR_NOTE=( 15 33 0 0 15 12)
DOTMATRIX_COLOR_WARN=( ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"} )
[[ ${#DOTMATRIX_COLOR_WARN[@]} == 0 ]] && DOTMATRIX_COLOR_WARN=(196 220 1 0 0 11)
DOTMATRIX_COLOR_FAIR=( ${DOTMATRIX_COLOR_FAIR[@]+"${DOTMATRIX_COLOR_FAIR[@]}"} )
[[ ${#DOTMATRIX_COLOR_FAIR[@]} == 0 ]] && DOTMATRIX_COLOR_FAIR=( 0 239 1 0 0 8)
DOTMATRIX_COLOR_PATH_SHORT=( ${DOTMATRIX_COLOR_PATH_SHORT[@]+"${DOTMATRIX_COLOR_PATH_SHORT[@]}"} )
[[ ${#DOTMATRIX_COLOR_PATH_SHORT[@]} == 0 ]] && DOTMATRIX_COLOR_PATH_SHORT=(252 239 0 0 0 15)
DOTMATRIX_COLOR_PATH_VCS=( ${DOTMATRIX_COLOR_PATH_VCS[@]+"${DOTMATRIX_COLOR_PATH_VCS[@]}"} )
[[ ${#DOTMATRIX_COLOR_PATH_VCS[@]} == 0 ]] && DOTMATRIX_COLOR_PATH_VCS=(252 239 0 1 0 15)
DOTMATRIX_COLOR_PATH_LAST=( ${DOTMATRIX_COLOR_PATH_LAST[@]+"${DOTMATRIX_COLOR_PATH_LAST[@]}"} )
[[ ${#DOTMATRIX_COLOR_PATH_LAST[@]} == 0 ]] && DOTMATRIX_COLOR_PATH_LAST=(15 239 1 0 0 15)
DOTMATRIX_COLOR_LINE=( ${DOTMATRIX_COLOR_LINE[@]+"${DOTMATRIX_COLOR_LINE[@]}"} )
[[ ${#DOTMATRIX_COLOR_LINE[@]} == 0 ]] && DOTMATRIX_COLOR_LINE=(244 -1 0 0 15 -1)
DOTMATRIX_COLOR_LINE_START=( ${DOTMATRIX_COLOR_LINE_START[@]+"${DOTMATRIX_COLOR_LINE_START[@]}"} )
[[ ${#DOTMATRIX_COLOR_LINE_START[@]} == 0 ]] && DOTMATRIX_COLOR_LINE_START=(255 -1 1 0 15 -1)
DOTMATRIX_COLOR_LINE_END=( ${DOTMATRIX_COLOR_LINE_END[@]+"${DOTMATRIX_COLOR_LINE_END[@]}"} )
[[ ${#DOTMATRIX_COLOR_LINE_END[@]} == 0 ]] && DOTMATRIX_COLOR_LINE_END=(232 -1 1 0 15 -1)
DOTMATRIX_COLOR_MARK=( ${DOTMATRIX_COLOR_MARK[@]+"${DOTMATRIX_COLOR_MARK[@]}"} )
[[ ${#DOTMATRIX_COLOR_MARK[@]} == 0 ]] && DOTMATRIX_COLOR_MARK=(15 -1 0 0 15 -1)
DOTMATRIX_COLOR_SEP_DARK=( ${DOTMATRIX_COLOR_SEP_DARK[@]+"${DOTMATRIX_COLOR_SEP_DARK[@]}"} )
[[ ${#DOTMATRIX_COLOR_SEP_DARK[@]} == 0 ]] && DOTMATRIX_COLOR_SEP_DARK=( 0 -2 0 0 0 -2)
DOTMATRIX_COLOR_SEP_FAIR=( ${DOTMATRIX_COLOR_SEP_FAIR[@]+"${DOTMATRIX_COLOR_SEP_FAIR[@]}"} )
[[ ${#DOTMATRIX_COLOR_SEP_FAIR[@]} == 0 ]] && DOTMATRIX_COLOR_SEP_FAIR=(244 -2 0 0 0 -2)
DOTMATRIX_COLOR_SEP_LITE=( ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"} )
[[ ${#DOTMATRIX_COLOR_SEP_LITE[@]} == 0 ]] && DOTMATRIX_COLOR_SEP_LITE=( 15 -2 0 0 15 -2)
# Default line color for unset variables.
LP_COLOR_ENV_VARS_UNSET=${LP_COLOR_ENV_VARS_UNSET:-""}
# Use the background of notes as a foreground for set variables.
lp_terminal_format "${DOTMATRIX_COLOR_NOTE[1]}"
LP_COLOR_ENV_VARS_SET=${LP_COLOR_ENV_VARS_SET:-"$lp_terminal_format"}
# LP_COLORMAP=( ${LP_COLORMAP[@]+"${LP_COLORMAP[@]}"} )
# if [[ ${#LP_COLORMAP[@]} == 0 ]]; then
local lp_terminal_format
lp_terminal_format ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
local l1="$lp_terminal_format"
lp_terminal_format ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"}
local l2="$lp_terminal_format"
lp_terminal_format ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
local l3="$lp_terminal_format"
LP_COLORMAP=(
"" # l0
"$l1"
"$l2"
"$l3"
)
# fi
__dotmatrix_activate_display
# __dotmatrix_activate_shell
__dotmatrix_activate_connection
__dotmatrix_activate_user
__dotmatrix_activate_multiplexer
__dotmatrix_activate_hostname
}
_lp_dotmatrix_theme_directory() {
lp_terminal_format ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
__dotmatrix_directory_FS
__dotmatrix_directory_path
}
_lp_dotmatrix_theme_prompt() {
local header inline dotmatrix_prompt
# Arguments: fg, bg, bold, underline, fallback_fg, fallback_bg
# Color codes can be any integer in 256 XTerm's system colors in [0255].
# Special color codes:
# -1 : no color
# -2 : previously set color
# -3 : swap fg and bg
local lp_terminal_format
####################################################################
# HEADER (LEFT)
####################################################################
# PS1="headering> "
header=""
header+="${_DOTMATRIX_DISPLAY}"
header+="${_DOTMATRIX_CONNECTION}"
header+="${_DOTMATRIX_USER}"
header+="${_DOTMATRIX_MULTIPLEXER}"
header+="${_DOTMATRIX_HOSTNAME}"
header+="${_DOTMATRIX_FS}"
header+="${_DOTMATRIX_PATH} "
if _lp_dirstack; then
# Pseudo-recall the path section format.
lp_terminal_format ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
header+="${dotmatrix_sep}"
__dotmatrix_make_field "$lp_dirstack" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
header+="${dotmatrix_field}"
fi
####################################################################
# HEADER SIDE (RIGHT)
####################################################################
local has_notes=0
local has_warns=0
# DOTMATRIX_COLOR_SEP_FAIR
__dotmatrix_make_sep_side ""
side="${dotmatrix_sep}"
# battery / load / temperature
local battery=
if _lp_battery_color ; then
if [[ $lp_battery -le "$DOTMATRIX_BATTERY_THRESHOLD" ]]; then
__dotmatrix_make_field "$lp_battery$_LP_PERCENT" ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
battery="${dotmatrix_field}${LP_MARK_BATTERY}"
has_warns=$((has_warns+1))
else
__dotmatrix_make_field "$lp_battery$_LP_PERCENT" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
battery="${dotmatrix_field}${LP_MARK_BATTERY}"
has_notes=$((has_notes+1))
fi
fi
local load=
if _lp_load_color ; then
if [[ $lp_load_adjusted -ge "$DOTMATRIX_LOAD_THRESHOLD" ]]; then
__dotmatrix_make_field "$lp_load" ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
load="${dotmatrix_field}${LP_MARK_LOAD}"
has_warns=$((has_warns+1))
else
__dotmatrix_make_field "$lp_load" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
load="${dotmatrix_field}${LP_MARK_LOAD}"
has_notes=$((has_notes+1))
fi
fi
local ram=
if _lp_ram_color ; then
if [[ $lp_ram_perc -le "$DOTMATRIX_RAM_THRESHOLD" ]]; then
__dotmatrix_make_field "$lp_ram_perc$_LP_PERCENT" ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
ram="${dotmatrix_field}${LP_MARK_RAM}"
has_warns=$((has_warns+1))
else
__dotmatrix_make_field "$lp_ram_perc$_LP_PERCENT" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
ram="${dotmatrix_field}${LP_MARK_RAM}"
has_notes=$((has_notes+1))
fi
fi
local disk=
if _lp_disk_color ; then
if [[ $lp_disk_perc -le "$DOTMATRIX_DISK_THRESHOLD" ]]; then
__dotmatrix_make_field "$lp_disk_perc$_LP_PERCENT" ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
disk="${dotmatrix_field}${LP_MARK_DISK}"
has_warns=$((has_warns+1))
else
__dotmatrix_make_field "$lp_disk_perc$_LP_PERCENT" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
disk="${dotmatrix_field}${LP_MARK_DISK}"
has_notes=$((has_notes+1))
fi
fi
local temperature=
if _lp_temperature_color ; then
if [[ $lp_temperature -ge "$DOTMATRIX_TEMP_THRESHOLD" ]]; then
__dotmatrix_make_field "$lp_temperature" ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
temperature="${dotmatrix_field}${LP_MARK_TEMP}"
has_warns=$((has_warns+1))
else
__dotmatrix_make_field "$lp_temperature" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
temperature="${dotmatrix_field}${LP_MARK_TEMP}"
has_notes=$((has_notes+1))
fi
fi
__dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_DARK[@]+"${DOTMATRIX_COLOR_SEP_DARK[@]}"}
declare -a blt=($battery $load $ram $disk $temperature) # Unquoted on purpose.
if [[ ${#blt[@]} -gt 0 ]] ; then
_lp_join "$dotmatrix_sep" "${blt[@]}"
if [[ -n "$lp_join" ]] ; then
# Match the side sep
local fg="${DOTMATRIX_COLOR_SEP_FAIR[0]}"
local ffg="${DOTMATRIX_COLOR_SEP_FAIR[4]}"
lp_terminal_format "$fg" -2 0 0 "$ffg" -2
# No space before sep.
dotmatrix_sep="${lp_terminal_format}${sep}${DOTMATRIX_SPACE_VOID}"
side+="${dotmatrix_sep}${lp_join}"
fi
else
lp_terminal_format ${DOTMATRIX_COLOR_FAIR[@]+"${DOTMATRIX_COLOR_FAIR[@]}"}
side+="${lp_terminal_format}"
fi
# jobs: detached / running / stopped
local detached_sessions=
if _lp_detached_sessions ; then
if [[ -n "${lp_detached_sessions}" && "${lp_detached_sessions}" -gt 0 ]] ; then
if [[ "${lp_detached_sessions}" -ge "${DOTMATRIX_DETACHED_THRESHOLD}" ]]; then
__dotmatrix_make_field "${lp_detached_sessions}d" ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
detached_sessions="${dotmatrix_field}"
has_warns=$((has_warns+1))
else
__dotmatrix_make_field "${lp_detached_sessions}d" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"}
detached_sessions="${dotmatrix_field}"
has_notes=$((has_notes+1))
fi
fi
fi
local running_jobs=
local stopped_jobs=
if _lp_jobcount ; then
if [[ -n "${lp_running_jobs}" && "${lp_running_jobs}" -gt 0 ]] ; then
if [[ "${lp_running_jobs}" -ge "${DOTMATRIX_RUNNING_THRESHOLD}" ]]; then
__dotmatrix_make_field "${lp_running_jobs}&" ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
running_jobs="${dotmatrix_field}"
has_warns=$((has_warns+1))
else
__dotmatrix_make_field "${lp_running_jobs}&" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"}
running_jobs="${dotmatrix_field}"
has_notes=$((has_notes+1))
fi
fi
if [[ -n "${lp_stopped_jobs}" && "${lp_stopped_jobs}" -gt 0 ]] ; then
if [[ "${lp_stopped_jobs}" -ge "${DOTMATRIX_STOPPED_THRESHOLD}" ]]; then
__dotmatrix_make_field "${lp_stopped_jobs}z" ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
stopped_jobs="${dotmatrix_field}"
has_warns=$((has_warns+1))
else
__dotmatrix_make_field "${lp_stopped_jobs}z" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"}
stopped_jobs="${dotmatrix_field}"
has_notes=$((has_notes+1))
fi
fi
fi
lp_terminal_format ${DOTMATRIX_COLOR_FAIR[@]+"${DOTMATRIX_COLOR_FAIR[@]}"}
if [[ $has_warns -gt 0 ]]; then
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
else
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"}
fi
local djc_plug="${dotmatrix_sep}"
__dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"}
declare -a drs=($detached_sessions $running_jobs $stopped_jobs) # Unquoted on purpose.
if [[ ${#drs[@]} -gt 0 ]] ; then
_lp_join "$dotmatrix_sep" "${drs[@]}"
if [[ -n "$lp_join" ]] ; then
side+="${djc_plug}${lp_join}"
fi
else
lp_terminal_format ${DOTMATRIX_COLOR_FAIR[@]+"${DOTMATRIX_COLOR_FAIR[@]}"}
side+="${lp_terminal_format}"
fi
# Called here for an easy access to the configured color.
if __dotmatrix_activate_shell ; then
side+="${_DOTMATRIX_SHELL}"
fi
# clock
if _lp_time ; then
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
side+="${dotmatrix_sep}"
if _lp_analog_time ; then
__dotmatrix_make_field "$lp_analog_time" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
side+="$dotmatrix_field"
else
__dotmatrix_make_field "$lp_time" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
side+="$dotmatrix_field"
fi
fi
# Final assembling
if _lp_dirstack; then
lp_terminal_format ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
else
# Recall a dark format to correctly reset sections history
# to match the path's section colors.
lp_terminal_format ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
fi
__dotmatrix_make_sep_last "$has_warns" "$has_notes"
header+="$dotmatrix_sep"
# Right-align the $side with spaces.
_lp_fill "$header" "$side" " "
header="$lp_fill${NO_COL}"
####################################################################
# IN LINE
####################################################################
local color_line_end=""
if (( LP_ENABLE_SSH_COLORS )); then
local lp_hostname_hash
__lp_hostname_hash
__lp_foreground_color "$(( 1 + lp_hostname_hash % 6 ))"
color_line_end="${_LP_OPEN_ESC}${af_color}${_LP_CLOSE_ESC}"
fi
lp_terminal_format ${DOTMATRIX_COLOR_LINE[@]+"${DOTMATRIX_COLOR_LINE[@]}"}
color_line_start="$lp_terminal_format"
local inline_left="${NO_COL}$LP_PS1_PREFIX${lp_terminal_format}${DOTMATRIX_LINE}"
# Dev env section.
local ista="$_LP_FIRST_INDEX"
local imid=$((_LP_FIRST_INDEX+1))
local iend=$((_LP_FIRST_INDEX+2))
local d="${color_line_start}${DOTMATRIX_ITEMS[ista]}${DOTMATRIX_SPACE_LINE}"
local I="${color_line_start}${DOTMATRIX_SPACE_LINE}${DOTMATRIX_ITEMS[imid]}${DOTMATRIX_SPACE_LINE}"
local b="${color_line_start}${DOTMATRIX_SPACE_LINE}${DOTMATRIX_ITEMS[iend]}${color_line_end}"
if _lp_env_vars "${LP_COLOR_ENV_VARS_SET}" "${LP_COLOR_ENV_VARS_UNSET}"; then
local lp_join
_lp_join "$I" ${lp_env_vars[@]}
inline_left+="$d${lp_join}$b"
fi
if _lp_software_collections ; then
inline_left+="$d${lp_software_collections}$b"
fi
if _lp_python_env ; then
inline_left+="$d${lp_python_env}$b"
fi
if _lp_node_env ; then
inline_left+="$d${lp_node_env}$b"
fi
if _lp_ruby_env ; then
inline_left+="$d${lp_ruby_env}$b"
fi
if _lp_container ; then
inline_left+="$d${lp_container}$b"
fi
if _lp_kubernetes_context ; then
inline_left+="$d${lp_kubernetes_context}$b"
fi
if _lp_terraform_env ; then
inline_left+="$d${lp_terraform_env}$b"
fi
if _lp_aws_profile ; then
inline_left+="$d${lp_aws_profile}$b"
fi
if _lp_cmake ; then
local lp_join
_lp_join "$I" ${lp_cmake_c_compiler} ${lp_cmake_cxx_compiler} ${lp_cmake_generator} ${lp_cmake_buildtype}
inline_left+="$d${lp_join}$b"
fi
if _lp_container; then
inline_left+="$d$lp_container$b"
fi
if _lp_modules; then
inline_left+="$d"
_lp_join "$I" "${lp_modules[@]}"
inline_left+="${lp_join}$b"
fi
# History section.
local inline_right=
if _lp_os; then
_lp_join "$I" ${lp_os_arch} ${lp_os_family} ${lp_os_kernel} ${lp_os_distrib} ${lp_os_version}
inline_right+="$d${lp_join}$b"
fi
if ((DOTMATRIX_ENABLE_HISTORY)) ; then
local hist_max
hist_max=$((DOTMATRIX_HISTORY_LAST_LEN-${#DOTMATRIX_HISTORY_LAST_LEN_MARK}))
local hist_last
hist_last=$(history | tail -n 1 | cut -d" " -f5-)
if [[ ${#hist_last} -gt $hist_max ]] ; then
if (( _LP_SHELL_zsh )) ; then
hist_last="${hist_last[1,$hist_max]}${DOTMATRIX_HISTORY_LAST_LEN_MARK}"
else # bash
hist_last="${hist_last:0:$hist_max}${DOTMATRIX_HISTORY_LAST_LEN_MARK}"
fi
fi
local hist_most
hist_most=$(history | tail -n "${DOTMATRIX_HISTORY_MOST_BACK}" | awk '{print $4}' | sort | uniq --count | sort --numeric-sort --reverse | head -n 1 | awk '{print $2}')
__lp_escape "$hist_last"
local hlast="$ret"
__lp_escape "$hist_most"
local hmost="$ret"
inline_right="$d${hlast}$I${hmost}$b"
fi
inline_right+="${DOTMATRIX_LINE}"
local inline=
# FIXME use _lp_fill-like function to handle multi-character line?
if ((DOTMATRIX_ENABLE_GRADIENT_LINE)); then
# Fill up the center section with a line colored as a gradient.
local ret
__lp_strip_escapes "$inline"
local left_as_text="$ret"
local line_width=$((${COLUMNS:-80}-${#left_as_text}))
local line="$inline"
local i c f a b j
for ((i=0; i < line_width; i++)); do # For each character in the line.
local dash_colors=()
for ((c=_LP_FIRST_INDEX; c < 6+_LP_FIRST_INDEX; c++)); do # For each color parameter.
a="${DOTMATRIX_COLOR_LINE_START[c]}"
b="${DOTMATRIX_COLOR_LINE_END[c]}"
j=$((a+(b-a)*i/line_width))
dash_colors+=("$j")
done
lp_terminal_format "${dash_colors[@]}"
line+="${lp_terminal_format}${DOTMATRIX_LINE}"
# line+="${lp_terminal_format}${i}(${dash_colors[@]}) "
done
inline="${line}${NO_COL}"
else
# Fill up the remaining space with a fixed-color line.
_lp_fill "$inline_left" "$inline_right" "$DOTMATRIX_LINE"
# Format here is DOTMATRIX_COLOR_LINE.
inline="${lp_terminal_format}${lp_fill}${NO_COL}"
fi
####################################################################
# PROMPT LINE
####################################################################
dotmatrix_prompt=""
lp_terminal_format ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
if (( LP_ENABLE_WIFI_STRENGTH )) ; then
if _lp_wifi_signal_strength ; then
lp_terminal_format ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
dotmatrix_prompt+="${lp_terminal_format}${LP_MARK_WIFI}"
else
dotmatrix_prompt+="${lp_terminal_format}${LP_MARK_WIFI}"
fi
else
dotmatrix_prompt+="${lp_terminal_format}·"
fi
if _lp_http_proxy ; then
__dotmatrix_make_sep_link ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
dotmatrix_prompt+="${dotmatrix_sep}"
else
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
dotmatrix_prompt+="${dotmatrix_sep}"
fi
if __dotmatrix_prompt_vcs; then
dotmatrix_prompt+="${_DOTMATRIX_VCS}"
fi
if _lp_runtime_format ; then
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"}
__dotmatrix_make_field "${lp_runtime_format}" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"}
dotmatrix_prompt+="${dotmatrix_sep}${dotmatrix_field}"
fi
if _lp_error ; then
local error_msg=
if _lp_error_meaning; then
error_msg="${lp_error_meaning}"
else
error_msg="${lp_error}"
fi
__dotmatrix_make_sep_link ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
__dotmatrix_make_field "${DOTMATRIX_MARK_ERROR}${DOTMATRIX_SPACE_VOID}${error_msg}" ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
dotmatrix_prompt+="${dotmatrix_sep}${dotmatrix_field}"
fi
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_MARK[@]+"${DOTMATRIX_COLOR_MARK[@]}"}
dotmatrix_prompt+="${dotmatrix_sep}"
lp_terminal_format ${DOTMATRIX_COLOR_MARK[@]+"${DOTMATRIX_COLOR_MARK[@]}"}
local mark_color="$lp_terminal_format"
# No need to check LP_ENABLE_SHLVL, _lp_shell_level does it.
if _lp_shell_level ; then
local i
for ((i=0; i < lp_shell_level-1; i++)); do
dotmatrix_prompt+="${mark_color}${DOTMATRIX_MARK}"
done
fi
# Warning dotmatrix_prompt mark if either root or sudo.
_lp_user
user="$?"
# No need to check LP_ENABLE_SUDO, _lp_sudo_active does it.
_lp_sudo_active
sudo="$?"
if [[ "$sudo" == 0 || "$user" == 2 ]] ; then
local dcwfg="${DOTMATRIX_COLOR_WARN[_LP_FIRST_INDEX+1]}"
[[ -z $dcwfg ]] && dcwfg=-1
lp_terminal_format $dcwfg
dotmatrix_prompt+="${lp_terminal_format}${DOTMATRIX_MARK}"
else
dotmatrix_prompt+="${mark_color}${DOTMATRIX_MARK}"
fi
dotmatrix_prompt+="${NO_COL}"
# Assemble and setup
local n=$'\n'
PS1="${n}${header}${n}${inline}${n}${dotmatrix_prompt} "
}
########################################################################
# Functions called at "activate" stage.
########################################################################
__dotmatrix_activate_display() {
if _lp_connected_display ; then
__dotmatrix_make_field "$DOTMATRIX_DISPLAY_X11" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_DISPLAY="$dotmatrix_field"
else
__dotmatrix_make_field "$DOTMATRIX_DISPLAY_TEXT" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
_DOTMATRIX_DISPLAY="$dotmatrix_field"
fi
}
__dotmatrix_activate_shell() {
((DOTMATRIX_ENABLE_SHELL)) || return 2
if ((_LP_SHELL_zsh)) ; then
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
__dotmatrix_make_field "$DOTMATRIX_SHELL_ZSH" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
_DOTMATRIX_SHELL="${dotmatrix_sep}${dotmatrix_field}"
else
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
__dotmatrix_make_field "$DOTMATRIX_SHELL_BASH" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_SHELL="${dotmatrix_sep}${dotmatrix_field}"
fi
}
__dotmatrix_activate_connection() {
_lp_user
user_type="$?"
local user_color
case "$user_type" in
0) # logged-in user
user_color=(${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"})
;;
1) # other user
user_color=(${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"})
;;
2) # root
user_color=(${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"})
;;
esac
local connection
_lp_connection
case "$lp_connection" in
lcl)
__dotmatrix_make_sep_plug "${user_color[@]}"
connection="${dotmatrix_sep}"
;;
su)
__dotmatrix_make_sep_link "${user_color[@]}"
connection="${dotmatrix_sep}"
;;
ssh)
__dotmatrix_make_sep_open "${user_color[@]}"
connection="${dotmatrix_sep}"
;;
tel)
__dotmatrix_make_sep_dang "${user_color[@]}"
connection="${dotmatrix_sep}"
;;
*)
__dotmatrix_make_sep_plug "${user_color[@]}"
connection="${dotmatrix_sep}"
;;
esac
_DOTMATRIX_CONNECTION="${connection}"
}
__dotmatrix_activate_user() {
_lp_user
user_type="$?"
case "$user_type" in
0) # logged-in user
if [[ -z $lp_username ]] ; then # Honors LP_USER_ALWAYS
__dotmatrix_make_field "$DOTMATRIX_USER_LOCAL" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
_DOTMATRIX_USER="$dotmatrix_field"
else
__dotmatrix_make_field "$lp_username" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
_DOTMATRIX_USER="$dotmatrix_field"
fi
;;
1) # other user
_lp_username_color
__dotmatrix_make_field "$lp_username_color" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"}
_DOTMATRIX_USER="$dotmatrix_field"
;;
2) # root
_lp_username
__dotmatrix_make_field "$lp_username" ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"}
_DOTMATRIX_USER="$dotmatrix_field"
;;
esac
return $user_type
}
__dotmatrix_activate_hostname() {
local hostname
if _lp_hostname; then
case "$lp_connection" in
ssh)
local client_ip client_port server_ip server_port hostname=
IFS=" " read -r client_ip client_port server_ip server_port <<<"$SSH_CONNECTION"
local username=${USER:-${USERNAME:-${LOGNAME-}}}
if _lp_create_link "ssh://${username}@${server_ip}:${server_port}" "$lp_hostname"; then
hostname="$link"
else
hostname="$lp_hostname"
fi
# If we want a different color for each host
if (( LP_ENABLE_SSH_COLORS )); then
LP_COLOR_SSH="$LP_COLOR_HOST_HASH"
hostname="${LP_COLOR_SSH}${hostname}"
else
hostname="${hostname}"
fi
;;
tel)
hostname="${lp_hostname}"
;;
*)
hostname+="${DOTMATRIX_HOST_LOCAL}"
;;
esac
else
hostname="${DOTMATRIX_HOST_LOCAL}"
fi
__dotmatrix_make_field "$hostname" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_HOSTNAME="${dotmatrix_field}"
}
__dotmatrix_activate_multiplexer() {
local lp_multiplexer multiplexer
if _lp_multiplexer ; then
case "$lp_multiplexer" in
tmux)
__dotmatrix_make_sep_link ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
multiplexer="${dotmatrix_sep}"
;;
screen)
__dotmatrix_make_sep_link ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
multiplexer="${dotmatrix_sep}"
;;
*)
__dotmatrix_make_sep_link ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
multiplexer="${dotmatrix_sep}"
;;
esac
else
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
multiplexer="${dotmatrix_sep}"
fi
_DOTMATRIX_MULTIPLEXER="${multiplexer}"
}
########################################################################
# Functions called at directory change.
########################################################################
__dotmatrix_directory_FS() {
local fs=
if (( LP_ENABLE_PERM )); then
if _lp_chroot ; then
if [[ -w "$PWD" ]]; then
__dotmatrix_make_sep_open ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
fs="$dotmatrix_sep"
else
__dotmatrix_make_sep_dang ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
fs="$dotmatrix_sep"
fi
else
if [[ -w "$PWD" ]]; then
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
fs="$dotmatrix_sep"
else
__dotmatrix_make_sep_link ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
fs="$dotmatrix_sep"
fi
fi
fi
_DOTMATRIX_FS="$fs"
}
__dotmatrix_directory_path() {
local lp_terminal_format
lp_terminal_format ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"}
local path_format="${lp_terminal_format}"
lp_terminal_format ${DOTMATRIX_COLOR_SEP_DARK[@]+"${DOTMATRIX_COLOR_SEP_DARK[@]}"}
local separator_format=$lp_terminal_format
lp_terminal_format ${DOTMATRIX_COLOR_PATH_SHORT[@]+"${DOTMATRIX_COLOR_PATH_SHORT[@]}"}
local shortened_format=$lp_terminal_format
lp_terminal_format ${DOTMATRIX_COLOR_PATH_VCS[@]+"${DOTMATRIX_COLOR_PATH_VCS[@]}"}
local vcs_format=$lp_terminal_format
lp_terminal_format ${DOTMATRIX_COLOR_PATH_LAST[@]+"${DOTMATRIX_COLOR_PATH_LAST[@]}"}
local last_dir_format=$lp_terminal_format
local lp_path_format
_lp_path_format "$path_format" "$last_dir_format" "$vcs_format" "$shortened_format" \
"${DOTMATRIX_SPACE_PATH}${DOTMATRIX_SOFT}${DOTMATRIX_SPACE_PATH}" "$separator_format"
_DOTMATRIX_PATH=${lp_path_format}
}
########################################################################
# Functions called at dotmatrix_prompt update.
########################################################################
__dotmatrix_prompt_vcs() {
if _lp_find_vcs ; then
declare -a color color_behind color_ahead
_lp_smart_mark
_DOTMATRIX_VCS=""
# Mark & commits off remote
if _lp_vcs_commits_off_remote; then # There is remote-space-[local].
_lp_vcs_remote # Get remote name.
# Remote segment.
if [[ "$lp_vcs_commit_behind" -ne "0" ]]; then # NOTE remote segment.
if [[ "$lp_vcs_commit_behind" -ge "${DOTMATRIX_VCS_BEHIND_THRESHOLD}" ]]; then
color_behind=(${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"})
else
color_behind=(${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"})
fi
if (( LP_ENABLE_VCS_DIFFSTATS )) ; then
__dotmatrix_make_field "${lp_smart_mark}" "${color_behind[@]}"
_DOTMATRIX_VCS+="$dotmatrix_field"
__dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_sep"
__dotmatrix_make_field "${lp_vcs_remote} ${lp_vcs_commit_behind}" "${color_behind[@]}"
_DOTMATRIX_VCS+="$dotmatrix_field"
else
__dotmatrix_make_field "${lp_smart_mark}" "${color_behind[@]}"
_DOTMATRIX_VCS+="$dotmatrix_field"
__dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_sep"
__dotmatrix_make_field "${lp_vcs_remote} ${DOTMATRIX_DIFF}" "${color_behind[@]}"
_DOTMATRIX_VCS+="$dotmatrix_field"
fi
else # LITE remote segment.
__dotmatrix_make_field "${lp_smart_mark}" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_field"
__dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_sep"
__dotmatrix_make_field "${lp_vcs_remote}" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_field"
fi
# Link between remote and local.
# We already have `color_behind`.
if [[ "$lp_vcs_commit_ahead" -ne "0" ]]; then # NOTE local segment.
if [[ "$lp_vcs_commit_ahead" -ge "${DOTMATRIX_VCS_AHEAD_THRESHOLD}" ]]; then
color_ahead=(${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"})
else
color_ahead=(${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"})
fi
else # No commit ahead.
color_ahead=(${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"})
fi
# Choice of link type.
# Both remote and local have commits.
if [[ "$lp_vcs_commit_behind" -ne "0" && "$lp_vcs_commit_ahead" -ne "0" ]]; then
__dotmatrix_make_sep_link_opposed "${color_ahead[@]}"
# Only remote have commit.
elif [[ "$lp_vcs_commit_behind" -ne "0" && "$lp_vcs_commit_ahead" -eq "0" ]]; then
__dotmatrix_make_sep_link_reverse "${color_ahead[@]}"
# Only local have commits.
else
__dotmatrix_make_sep_link "${color_ahead[@]}"
fi
_DOTMATRIX_VCS+="$dotmatrix_sep"
# Local segment.
if [[ "$lp_vcs_commit_ahead" -ne "0" ]]; then # NOTE local segment.
# We already have `color_ahead`.
if (( LP_ENABLE_VCS_DIFFSTATS )) ; then
__dotmatrix_make_field "$lp_vcs_commit_ahead" "${color_ahead[@]}"
_DOTMATRIX_VCS+="$dotmatrix_field"
else
__dotmatrix_make_field "$DOTMATRIX_DIFF" "${color_ahead[@]}"
_DOTMATRIX_VCS+="$dotmatrix_field"
fi
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_sep"
# else # 0 commit ahead => direct segment.
fi
else # No commits off remote => There is no space between remote and branch, and no remote name.
__dotmatrix_make_field "${lp_smart_mark}" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_field"
__dotmatrix_make_sep_mid ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_sep"
# No local commit segment.
fi
# Branch:bookmark/tag
if _lp_vcs_branch; then
__dotmatrix_make_field "$lp_vcs_branch" ${DOTMATRIX_COLOR_GLOW[@]+"${DOTMATRIX_COLOR_GLOW[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_field"
if _lp_vcs_bookmark; then
__dotmatrix_make_field ":${lp_vcs_bookmark}" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_field"
fi
if _lp_vcs_tag; then
__dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"}
__dotmatrix_make_field "$lp_vcs_tag" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_VCS+="${dotmatrix_sep}${dotmatrix_field}"
fi
elif _lp_vcs_bookmark; then
__dotmatrix_make_field "$lp_vcs_bookmark" ${DOTMATRIX_COLOR_GLOW[@]+"${DOTMATRIX_COLOR_GLOW[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_field"
elif _lp_vcs_tag; then
__dotmatrix_make_field "$lp_vcs_tag" ${DOTMATRIX_COLOR_GLOW[@]+"${DOTMATRIX_COLOR_GLOW[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_field"
else
_lp_vcs_commit_id
__dotmatrix_make_field "${lp_vcs_commit_id:0:7}" ${DOTMATRIX_COLOR_GLOW[@]+"${DOTMATRIX_COLOR_GLOW[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_field"
fi # vcs branch
# Diff stats
local ret has_lines=
if _lp_vcs_uncommitted_files; then
_lp_vcs_unstaged_lines; ret=$?
_lp_vcs_uncommitted_lines
if [[ $((ret+lp_vcs_uncommitted_i_lines+lp_vcs_uncommitted_d_lines)) -gt "${DOTMATRIX_VCS_DIFF_THRESHOLD}" ]]; then
color=(${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"})
else
color=(${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"})
fi
__dotmatrix_make_sep_link "${color[@]}"
_DOTMATRIX_VCS+="$dotmatrix_sep"
# Only show unstaged changes if the VCS supports staging, otherwise
# show uncommitted changes
if (( ret == 0 )); then
if [[ "$lp_vcs_unstaged_i_lines" == "$lp_vcs_unstaged_d_lines" ]] ; then
# If same number of lines inserted and deleted: display a single number.
__dotmatrix_make_field "±$lp_vcs_unstaged_i_lines" "${color[@]}"
has_lines="$dotmatrix_field"
else
__dotmatrix_make_field "+$lp_vcs_unstaged_i_lines" "${color[@]}"
has_lines="$dotmatrix_field"
__dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"}
has_lines+="$dotmatrix_sep"
__dotmatrix_make_field "-$lp_vcs_unstaged_d_lines" "${color[@]}"
has_lines+="$dotmatrix_field"
fi
elif (( ret == 1 )); then
# Maybe just removed a file, in which case no line is reported to be impacted,
# but this is still a change.
__dotmatrix_make_field "±0" ${DOTMATRIX_COLOR_DARK[@]+"${color[@]}"}
has_lines="${dotmatrix_field}"
else
if [[ "$lp_vcs_uncommitted_i_lines" == "$lp_vcs_uncommitted_d_lines" ]] ; then
__dotmatrix_make_field "±$lp_vcs_uncommitted_i_lines" "${color[@]}"
has_lines="$dotmatrix_field"
else
__dotmatrix_make_field "+$lp_vcs_uncommitted_i_lines" "${color[@]}"
has_lines="$dotmatrix_field"
__dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"}
has_lines+="$dotmatrix_sep"
__dotmatrix_make_field "-$lp_vcs_uncommitted_d_lines" "${color[@]}"
has_lines+="$dotmatrix_field"
fi
fi
if (( LP_ENABLE_VCS_DIFFSTATS )) ; then
_DOTMATRIX_VCS+="$has_lines"
else
__dotmatrix_make_field "$DOTMATRIX_DIFF" "${color[@]}"
_DOTMATRIX_VCS+="$dotmatrix_field"
fi # LP_ENABLE_VCS_DIFFSTATS
fi # uncommitted files
# Stash / untracked / head
local stash="" untracked="" head=""
if _lp_vcs_stash_count; then
stash="$DOTMATRIX_MARK_STASH"
fi
if _lp_vcs_untracked_files; then
untracked="$DOTMATRIX_MARK_UNTRACKED"
fi
if _lp_vcs_head_status; then
head="$lp_vcs_head_status"
# if [[ -n "${lp_vcs_head_details-}" ]]; then
# pass
# fi
fi
if [[ -n "$stash" || -n "$untracked" || -n "$head" ]] ; then
if [[ -z $has_lines ]] ; then
__dotmatrix_make_sep_mid ${DOTMATRIX_COLOR_SEP_FAIR[@]+"${DOTMATRIX_COLOR_SEP_FAIR[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_sep"
else
__dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_sep"
fi
fi
if [[ -n "$stash" ]] ; then
__dotmatrix_make_field "$stash" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_field"
if [[ -n "$untracked" ]] ; then
__dotmatrix_make_field "$untracked" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
__dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"}
_DOTMATRIX_VCS+="${dotmatrix_sep}${dotmatrix_field}"
fi
if [[ -n "$head" ]] ; then
__dotmatrix_make_field "$head" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
__dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"}
_DOTMATRIX_VCS+="${dotmatrix_sep}${dotmatrix_field}"
fi
else # no stash
if [[ -n "$untracked" ]] ; then
__dotmatrix_make_field "$untracked" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_field"
if [[ -n "$head" ]] ; then
__dotmatrix_make_field "$head" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
__dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"}
_DOTMATRIX_VCS+="${dotmatrix_sep}${dotmatrix_field}"
fi
else # no untracked
if [[ -n "$head" ]] ; then
__dotmatrix_make_field "$head" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}
_DOTMATRIX_VCS+="$dotmatrix_field"
fi
fi
fi # stash
return 0
else
_DOTMATRIX_VCS=""
return 1
fi # find_vcs
}
########################################################################
# Helper functions
########################################################################
__dotmatrix_join_fields() {
dotmatrix_join_fields=""
local sep="${1-}"
shift
if [[ -n "$*" ]] ; then
local first_field="${1-}"
shift
dotmatrix_join_fields="${first_field}"
for f in "$@"; do
[[ -z $f ]] && continue
dotmatrix_join_fields+="${sep}${f}"
done
fi
}
__dotmatrix_make_field() { # string, color_array
local lp_terminal_format string="${1-}"
[[ -z $string ]] && return 1
shift
lp_terminal_format "$@"
dotmatrix_field="${lp_terminal_format}${DOTMATRIX_SPACE_FIELD}${string}${DOTMATRIX_SPACE_FIELD}"
}
__dotmatrix_make_sep_plug() { # color
# fg, bg, bold, underline, fallback_fg, fallback_bg
# 0 = set last color to current color
# -1 = set color to last color
# -2 = keep last color
# -3 = set last fg to last bg (and conversely)
local lp_terminal_format sep
local bg="${2-}"
[[ -z $bg ]] && bg=-1
local fbg="${6-}"
[[ -z $fbg ]] && fbg=-1
sep="${DOTMATRIX_PLUG}"
if [[ "${_lp_last_ab_color-}" == "$bg" ]] ; then
sep="${DOTMATRIX_MEAN}"
fi
lp_terminal_format -3 "$bg" 0 0 -3 "$fbg"
dotmatrix_sep="${DOTMATRIX_SPACE_VOID}${lp_terminal_format}${sep}${DOTMATRIX_SPACE_VOID}"
}
__dotmatrix_make_sep_link() { # color
local lp_terminal_format
dotmatrix_sep=""
local fg="${2-}"
[[ -z $fg ]] && fg=-1
local fbg="${6-}"
[[ -z $fbg ]] && fbg=-1
lp_terminal_format -3 -1 0 0 -1 "$fbg"
dotmatrix_sep+="${DOTMATRIX_SPACE_VOID}${lp_terminal_format}${DOTMATRIX_LINK[_LP_FIRST_INDEX]}"
local dsfg="${DOTMATRIX_COLOR_SEP_FAIR[_LP_FIRST_INDEX]}"
[[ -z $dsfg ]] && dsfg=-1
lp_terminal_format "$dsfg" -1 0 0 -1 "$fbg"
dotmatrix_sep+="${lp_terminal_format}${DOTMATRIX_LINK[_LP_FIRST_INDEX+1]}"
lp_terminal_format "$fg" -1 0 0 -1 "$fbg"
dotmatrix_sep+="${lp_terminal_format}${DOTMATRIX_LINK[_LP_FIRST_INDEX+2]}${DOTMATRIX_SPACE_FILL}"
}
__dotmatrix_make_sep_link_reverse() { # color
local lp_terminal_format
dotmatrix_sep=""
local fg="${2-}"
[[ -z $fg ]] && fg=-1
local fbg="${6-}"
[[ -z $fbg ]] && fbg=-1
lp_terminal_format -3 -1 0 0 -1 "$fbg"
dotmatrix_sep+="${DOTMATRIX_SPACE_VOID}${lp_terminal_format}${DOTMATRIX_LINK_R[_LP_FIRST_INDEX]}"
local dsfg="${DOTMATRIX_COLOR_SEP_FAIR[_LP_FIRST_INDEX]}"
[[ -z $dsfg ]] && dsfg=-1
lp_terminal_format "$dsfg" -1 0 0 -1 "$fbg"
dotmatrix_sep+="${lp_terminal_format}${DOTMATRIX_LINK_R[_LP_FIRST_INDEX+1]}"
lp_terminal_format "$fg" -1 0 0 -1 "$fbg"
dotmatrix_sep+="${lp_terminal_format}${DOTMATRIX_LINK_R[_LP_FIRST_INDEX+2]}${DOTMATRIX_SPACE_FILL}"
}
__dotmatrix_make_sep_link_opposed() { # color
local lp_terminal_format
dotmatrix_sep=""
local fg="${2-}"
[[ -z $fg ]] && fg=-1
local fbg="${6-}"
[[ -z $fbg ]] && fbg=-1
lp_terminal_format -3 -1 0 0 -1 "$fbg"
dotmatrix_sep+="${DOTMATRIX_SPACE_VOID}${lp_terminal_format}${DOTMATRIX_LINK_R[_LP_FIRST_INDEX]}"
local dsfg="${DOTMATRIX_COLOR_SEP_FAIR[_LP_FIRST_INDEX]}"
[[ -z $dsfg ]] && dsfg=-1
lp_terminal_format "$dsfg" -1 0 0 -1 "$fbg"
dotmatrix_sep+="${lp_terminal_format}${DOTMATRIX_LINK[_LP_FIRST_INDEX+1]}"
lp_terminal_format "$fg" -1 0 0 -1 "$fbg"
dotmatrix_sep+="${lp_terminal_format}${DOTMATRIX_LINK[_LP_FIRST_INDEX+2]}${DOTMATRIX_SPACE_FILL}"
}
__dotmatrix_make_sep_open() { # color
local lp_terminal_format
local fg="${2-}"
[[ -z $fg ]] && fg=-1
local fbg="${6-}"
[[ -z $fbg ]] && fbg=-1
lp_terminal_format -3 -1 0 0 -1 "$fbg"
dotmatrix_sep+="${DOTMATRIX_SPACE_VOID}${lp_terminal_format}${DOTMATRIX_OPEN[_LP_FIRST_INDEX]}"
local dsfg="${DOTMATRIX_COLOR_SEP_FAIR[_LP_FIRST_INDEX]}"
[[ -z $dsfg ]] && dsfg=-1
lp_terminal_format "$dsfg" -1 0 0 -1 "$fbg"
dotmatrix_sep+="${lp_terminal_format}${DOTMATRIX_OPEN[_LP_FIRST_INDEX+1]}"
lp_terminal_format "$fg" -1 0 0 -1 "$fbg"
dotmatrix_sep+="${lp_terminal_format}${DOTMATRIX_OPEN[_LP_FIRST_INDEX+2]}${DOTMATRIX_SPACE_FILL}"
}
__dotmatrix_make_sep_dang() { # color
local lp_terminal_format
local fg="${2-}"
[[ -z $fg ]] && fg=-1
local fbg="${6-}"
[[ -z $fbg ]] && fbg=-1
lp_terminal_format -3 -1 0 0 -1 "$fbg"
dotmatrix_sep+="${DOTMATRIX_SPACE_VOID}${lp_terminal_format}${DOTMATRIX_DANG[_LP_FIRST_INDEX]}"
local dcwfg="${DOTMATRIX_COLOR_WARN[_LP_FIRST_INDEX+1]}"
[[ -z $dcwfg ]] && dcwfg=-1
lp_terminal_format "$dcwfg" -1 0 0 -1 "$fbg"
dotmatrix_sep+="${lp_terminal_format}${DOTMATRIX_DANG[_LP_FIRST_INDEX+1]}"
lp_terminal_format "$fg" -1 0 0 -1 "$fbg"
dotmatrix_sep+="${lp_terminal_format}${DOTMATRIX_DANG[_LP_FIRST_INDEX+2]}${DOTMATRIX_SPACE_FILL}"
}
__dotmatrix_make_sep_soft() { # color
local lp_terminal_format
local fg="${1-}"
[[ -z $fg ]] && fg=-1
local fbg="${5-}"
[[ -z $fbg ]] && fbg=-1
lp_terminal_format "$fg" -2 0 0 "$fbg"
dotmatrix_sep="${lp_terminal_format}${DOTMATRIX_SOFT}"
}
__dotmatrix_make_sep_mid() { # color
local lp_terminal_format
local fg="${1-}"
[[ -z $fg ]] && fg=-1
local fbg="${5-}"
[[ -z $fbg ]] && fbg=-1
lp_terminal_format "$fg" -2 0 0 "$fbg"
dotmatrix_sep="${lp_terminal_format}${DOTMATRIX_SPACE_VOID}${DOTMATRIX_MEAN}${DOTMATRIX_SPACE_VOID}"
}
__dotmatrix_make_sep_last() { # [has_warns [has_notes]]
local lp_terminal_format
local has_warns="${1:-0}"
local has_notes="${2:-0}"
lp_terminal_format -3 -1 0 0 -3 -1
dotmatrix_sep="${lp_terminal_format}${DOTMATRIX_ENDS[_LP_FIRST_INDEX+0]}${NO_COL}"
if [[ $has_warns -eq 0 && $has_notes -gt 0 ]] ; then
# Use the background of COLOR_NOTE as a foreground here.
lp_terminal_format "${DOTMATRIX_COLOR_NOTE[1]}"
dotmatrix_sep+="${lp_terminal_format}${DOTMATRIX_ENDS[_LP_FIRST_INDEX+1]}${NO_COL}"
else
if [[ $has_warns -gt 0 ]]; then
# Use the background of COLOR_WARN as a foreground here.
lp_terminal_format "${DOTMATRIX_COLOR_WARN[1]}"
dotmatrix_sep+="${lp_terminal_format}${DOTMATRIX_ENDS[_LP_FIRST_INDEX+1]}${DOTMATRIX_ENDS[_LP_FIRST_INDEX+1]}${NO_COL}"
else
dotmatrix_sep="${lp_terminal_format}${DOTMATRIX_ENDS[_LP_FIRST_INDEX+0]}${NO_COL}"
fi
fi
}
__dotmatrix_make_sep_side() { # no arg
local lp_terminal_format
lp_terminal_format -3 -1 0 0 -3 -1 # Reset to no background.
local dsf=(${DOTMATRIX_COLOR_SEP_FAIR[@]+"${DOTMATRIX_COLOR_SEP_FAIR[@]}"})
[[ -z "${dsf[*]}" ]] && dsf=(-1)
lp_terminal_format "${dsf[@]}"
dotmatrix_sep="${lp_terminal_format}${DOTMATRIX_ENDS[_LP_FIRST_INDEX+2]}"
}