######################################################################## # API ######################################################################## _lp_dotmatrix_theme_activate() { 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 244 0 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 [0–255]. # 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_os; then inline_left+="$d$lp_os$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 ((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 (( LP_ENABLE_SSH_COLORS )) && LP_COLOR_SSH="$LP_COLOR_HOST_HASH" hostname="${LP_COLOR_SSH}${hostname}" ;; 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]. # 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 "${DOTMATRIX_VCS}${lp_smart_mark} ${lp_vcs_commit_behind}" "${color_behind[@]}" _DOTMATRIX_VCS+="$dotmatrix_field" else __dotmatrix_make_field "${DOTMATRIX_VCS}${lp_smart_mark} ${DOTMATRIX_DIFF}" "${color_behind[@]}" _DOTMATRIX_VCS+="$dotmatrix_field" fi else # LITE remote segment. __dotmatrix_make_field "${DOTMATRIX_VCS}${lp_smart_mark}" ${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. __dotmatrix_make_field "${DOTMATRIX_VCS}${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]}" }