From d6ca0d7f29b768430e6b137e6e4d44cf34e2f916 Mon Sep 17 00:00:00 2001 From: nojhan Date: Sun, 29 Oct 2023 04:26:46 +0100 Subject: [PATCH 01/29] fix(slant): spacing --- presets/variant-slant.conf | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/presets/variant-slant.conf b/presets/variant-slant.conf index 4aa5afb..5a0bd2d 100644 --- a/presets/variant-slant.conf +++ b/presets/variant-slant.conf @@ -8,18 +8,17 @@ DOTMATRIX_MARK=${DOTMATRIX_MARK:-""} DOTMATRIX_LINE=${DOTMATRIX_LINE:-"━"} DOTMATRIX_PLUG=${DOTMATRIX_PLUG:-""} DOTMATRIX_SOFT=${DOTMATRIX_SOFT:-"╱"} -DOTMATRIX_MEAN=${DOTMATRIX_MEAN:-""} - +DOTMATRIX_MEAN=${DOTMATRIX_MEAN:-" "} DOTMATRIX_LINK=( ${DOTMATRIX_LINK[@]+"${DOTMATRIX_LINK[@]}"} ) -[[ ${#DOTMATRIX_LINK[@]} == 0 ]] && 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_OPEN[@]} == 0 ]] && DOTMATRIX_OPEN=("" "" " ") DOTMATRIX_DANG=( ${DOTMATRIX_DANG[@]+"${DOTMATRIX_DANG[@]}"} ) -[[ ${#DOTMATRIX_DANG[@]} == 0 ]] && DOTMATRIX_DANG=("" "" "") +[[ ${#DOTMATRIX_DANG[@]} == 0 ]] && DOTMATRIX_DANG=("" " " " ") DOTMATRIX_ENDS=( ${DOTMATRIX_ENDS[@]+"${DOTMATRIX_ENDS[@]}"} ) -[[ ${#DOTMATRIX_ENDS[@]} == 0 ]] && DOTMATRIX_ENDS=("" "/" "") +[[ ${#DOTMATRIX_ENDS[@]} == 0 ]] && DOTMATRIX_ENDS=("" " " " ") DOTMATRIX_ITEMS=( ${DOTMATRIX_ITEMS[@]+"${DOTMATRIX_ITEMS[@]}"} ) [[ ${#DOTMATRIX_ITEMS[@]} == 0 ]] && DOTMATRIX_ITEMS=("" "┃" "") From abb98aeec2efde91e76ad3bdd742a96e549f1e8b Mon Sep 17 00:00:00 2001 From: nojhan Date: Sun, 29 Oct 2023 05:32:24 +0100 Subject: [PATCH 02/29] feat: adds RAM, DISK and ENVVARS sensors --- dotmatrix.theme | 47 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/dotmatrix.theme b/dotmatrix.theme index e15dd2c..259f15a 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -39,6 +39,8 @@ _lp_dotmatrix_theme_activate() { 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))} @@ -154,6 +156,11 @@ _lp_dotmatrix_theme_activate() { 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 @@ -238,11 +245,11 @@ _lp_dotmatrix_theme_prompt() { local battery= if _lp_battery_color ; then if [[ $lp_battery -le "$DOTMATRIX_BATTERY_THRESHOLD" ]]; then - __dotmatrix_make_field "$lp_battery" ${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"} + __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" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} + __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 @@ -250,7 +257,6 @@ _lp_dotmatrix_theme_prompt() { 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}" @@ -262,6 +268,32 @@ _lp_dotmatrix_theme_prompt() { 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 @@ -276,7 +308,7 @@ _lp_dotmatrix_theme_prompt() { fi __dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_DARK[@]+"${DOTMATRIX_COLOR_SEP_DARK[@]}"} - declare -a blt=($battery $load $temperature) # Unquoted on purpose. + 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 @@ -415,6 +447,11 @@ _lp_dotmatrix_theme_prompt() { 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 @@ -1220,7 +1257,7 @@ __dotmatrix_make_sep_mid() { # color dotmatrix_sep="${lp_terminal_format}${DOTMATRIX_SPACE_VOID}${DOTMATRIX_MEAN}${DOTMATRIX_SPACE_VOID}" } -__dotmatrix_make_sep_last() { # no arg +__dotmatrix_make_sep_last() { # [has_warns [has_notes]] local lp_terminal_format local has_warns="${1:-0}" local has_notes="${2:-0}" From bafa677f13125f07af606609ba9ceaa54479193b Mon Sep 17 00:00:00 2001 From: nojhan Date: Sun, 29 Oct 2023 06:02:53 +0100 Subject: [PATCH 03/29] feat(vcs): supports remote name --- dotmatrix.theme | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/dotmatrix.theme b/dotmatrix.theme index 259f15a..09ceb25 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -867,6 +867,7 @@ __dotmatrix_prompt_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. @@ -876,15 +877,27 @@ __dotmatrix_prompt_vcs() { 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_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 "${DOTMATRIX_VCS}${lp_smart_mark} ${DOTMATRIX_DIFF}" "${color_behind[@]}" + __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 "${DOTMATRIX_VCS}${lp_smart_mark}" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} + __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 @@ -928,8 +941,8 @@ __dotmatrix_prompt_vcs() { # 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[@]}"} + 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" From a251b6fe7041e26685cf39602c5a2e530a140497 Mon Sep 17 00:00:00 2001 From: nojhan Date: Sun, 29 Oct 2023 09:04:11 +0100 Subject: [PATCH 04/29] feat: version guard --- dotmatrix.theme | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dotmatrix.theme b/dotmatrix.theme index 09ceb25..311eea9 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -5,6 +5,11 @@ _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} From 4c506c93653bb458e1f3ddc4a629182880c79e02 Mon Sep 17 00:00:00 2001 From: nojhan Date: Wed, 15 Nov 2023 06:58:01 +0100 Subject: [PATCH 05/29] feat(doc): Makefile for making screenshots --- Makefile | 15 +++++++ README.md | 37 +++++------------- ...-magenta.conf => colors-cyan-magenta.conf} | 0 ...s_green-red.conf => colors-green-red.conf} | 0 ...ontrast.conf => colors-high-contrast.conf} | 0 screenshots/dotmatrix-intro-chevron.png | Bin 11229 -> 0 bytes screenshots/dotmatrix-long-chevron.png | Bin 23437 -> 0 bytes screenshots/dotmatrix-med-chevron.png | Bin 15094 -> 0 bytes screenshots/dotmatrix-med-slant.png | Bin 8711 -> 0 bytes screenshots/dotmatrix-med-text.png | Bin 8734 -> 0 bytes screenshots/dotmatrix-short-chevron.png | Bin 4607 -> 0 bytes screenshots/dotmatrix-short-dots.png | Bin 1915 -> 0 bytes screenshots/dotmatrix-short-round.png | Bin 4252 -> 0 bytes screenshots/dotmatrix-short-slant.png | Bin 2623 -> 0 bytes screenshots/dotmatrix-short-text.png | Bin 2019 -> 0 bytes screenshots/dotmatrix-spaced.png | Bin 6079 -> 0 bytes screenshots/dotmatrix-unspaced.png | Bin 5857 -> 0 bytes screenshots/variant-chevron.png | Bin 0 -> 35157 bytes .../variant-chevron_colors-cyan-magenta.png | Bin 0 -> 37543 bytes .../variant-chevron_colors-green-red.png | Bin 0 -> 36919 bytes .../variant-chevron_colors-high-contrast.png | Bin 0 -> 35634 bytes screenshots/variant-round.png | Bin 0 -> 37405 bytes screenshots/variant-slant.png | Bin 0 -> 34675 bytes screenshots/variant-text.png | Bin 0 -> 26944 bytes 24 files changed, 25 insertions(+), 27 deletions(-) create mode 100644 Makefile rename presets/{colors_cyan-magenta.conf => colors-cyan-magenta.conf} (100%) rename presets/{colors_green-red.conf => colors-green-red.conf} (100%) rename presets/{colors_high-contrast.conf => colors-high-contrast.conf} (100%) delete mode 100644 screenshots/dotmatrix-intro-chevron.png delete mode 100644 screenshots/dotmatrix-long-chevron.png delete mode 100644 screenshots/dotmatrix-med-chevron.png delete mode 100644 screenshots/dotmatrix-med-slant.png delete mode 100644 screenshots/dotmatrix-med-text.png delete mode 100644 screenshots/dotmatrix-short-chevron.png delete mode 100644 screenshots/dotmatrix-short-dots.png delete mode 100644 screenshots/dotmatrix-short-round.png delete mode 100644 screenshots/dotmatrix-short-slant.png delete mode 100644 screenshots/dotmatrix-short-text.png delete mode 100644 screenshots/dotmatrix-spaced.png delete mode 100644 screenshots/dotmatrix-unspaced.png create mode 100644 screenshots/variant-chevron.png create mode 100644 screenshots/variant-chevron_colors-cyan-magenta.png create mode 100644 screenshots/variant-chevron_colors-green-red.png create mode 100644 screenshots/variant-chevron_colors-high-contrast.png create mode 100644 screenshots/variant-round.png create mode 100644 screenshots/variant-slant.png create mode 100644 screenshots/variant-text.png diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..fdac496 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +LP ?= /home/nojhan/code/liquidprompt +HEIGHT := 450 +THEME := dotmatrix dotmatrix.theme + +ALL := $(addprefix screenshots/,variant-chevron.png variant-round.png variant-slant.png variant-text.png variant-chevron_colors-cyan-magenta.png variant-chevron_colors-green-red.png variant-chevron_colors-high-contrast.png) + +.PHONY: all + +all: Makefile $(ALL) + +clean: + rm -f $(ALL) + +%.png: + $(LP)/tools/theme-screenshot.sh $(HEIGHT) $(THEME) $(addprefix presets/,$(addsuffix .conf, $(subst _, ,$(basename $(notdir $@))))) > $@ diff --git a/README.md b/README.md index 4afaee3..ea49bae 100644 --- a/README.md +++ b/README.md @@ -17,23 +17,14 @@ But we believe that the advantages of this design makes it worth the effort. Preview ------- -If there is nothing special about the current context, the appearance of -DotMatrix might be as simple as this: +Using the (recommended) "chevron" preset: -![](screenshots/dotmatrix-short-chevron.png) - -A typical display of a slightly complex session would look like this: - -![](screenshots/dotmatrix-med-chevron.png) +![](screenshots/variant-chevron.png) The DotMatrix theme also comes as several variants, changing the shape of the segments separators, -like the (default) "dotmatrix" pixels: +like the "slant" variant: -![](screenshots/dotmatrix-short-dots.png) - -or the "slant" variant: - -![](screenshots/dotmatrix-med-slant.png) +![](screenshots/variant-slant.png) Design @@ -72,7 +63,7 @@ For instance, in the following prompt, you can see that the user is in a Git rep - the rightmost blue "≠" indicates that there are some modifications waiting to be commited (hence the directional hint, from a diff to the branch). - the leftmost blue segment indicates that there are some commits that may be pushed to the remote (hence the directional hint, from the branch to the VCS symbol). -![](screenshots/dotmatrix-intro-chevron.png) +![](screenshots/variant-chevron.png) The screenshot also shows that the last command ended in an error, hence the red-over-yellow error code. @@ -126,25 +117,25 @@ Variants needing a Nerd-fonts font: - "chevron" (the recommended one): -![](screenshots/dotmatrix-short-chevron.png) +![](screenshots/varint-chevron.png) - "round": -![](screenshots/dotmatrix-short-round.png) +![](screenshots/variant-round.png) - "slant": -![](screenshots/dotmatrix-short-slant.png) +![](screenshots/variant-slant.png) Variants available with a regular font: - "dotmatrix" (the default): -![](screenshots/dotmatrix-short-dots.png) +![](screenshots/variant-dots.png) - "text" (using only common characters): -![](screenshots/dotmatrix-short-text.png) +![](screenshots/variant-text.png) Configuration @@ -204,14 +195,6 @@ A second set changes the colors: If set to false, this flag will configure a compact prompt, showing segments without extra spaces around their joints. -Example of a spaced prompt: - -![](screenshots/dotmatrix-spaced.png) - -Example of a compact prompt: - -![](screenshots/dotmatrix-unspaced.png) - #### Specific features diff --git a/presets/colors_cyan-magenta.conf b/presets/colors-cyan-magenta.conf similarity index 100% rename from presets/colors_cyan-magenta.conf rename to presets/colors-cyan-magenta.conf diff --git a/presets/colors_green-red.conf b/presets/colors-green-red.conf similarity index 100% rename from presets/colors_green-red.conf rename to presets/colors-green-red.conf diff --git a/presets/colors_high-contrast.conf b/presets/colors-high-contrast.conf similarity index 100% rename from presets/colors_high-contrast.conf rename to presets/colors-high-contrast.conf diff --git a/screenshots/dotmatrix-intro-chevron.png b/screenshots/dotmatrix-intro-chevron.png deleted file mode 100644 index ea01de1ae5cda1b06a1223d0a7146f304577162e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11229 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 gLiqpw{|7OjxjIwl*q~WLk4}S_#r2qf` diff --git a/screenshots/dotmatrix-med-slant.png b/screenshots/dotmatrix-med-slant.png deleted file mode 100644 index b309e1d8aeb5c0a7eb84bfbe231014e0fa7be19b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8711 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 D09mvI diff --git a/screenshots/dotmatrix-med-text.png b/screenshots/dotmatrix-med-text.png deleted file mode 100644 index 921c1f37da8ac4b0b03d4a9700535748a367e474..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8734 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


iTk9Rq3!A?#Rxc1dgLI(7 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 P{cB_;l|bd9N^vKoSW-m`6n8Hcthj`bQmk0e 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 z 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 Date: Sat, 18 Nov 2023 06:59:45 +0100 Subject: [PATCH 06/29] fix(OS): correctly display the OS In line, to the right, because it is stable. --- dotmatrix.theme | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dotmatrix.theme b/dotmatrix.theme index 311eea9..f56accc 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -489,9 +489,6 @@ _lp_dotmatrix_theme_prompt() { 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[@]}" @@ -500,6 +497,10 @@ _lp_dotmatrix_theme_prompt() { # 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})) From feff5deb6a6a7593eae96df627324dc63847803e Mon Sep 17 00:00:00 2001 From: nojhan Date: Sat, 18 Nov 2023 10:35:06 +0100 Subject: [PATCH 07/29] fix(contrast): better color contrast --- dotmatrix.theme | 2 +- presets/colors-high-contrast.conf | 33 +++++++++++++++++-------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/dotmatrix.theme b/dotmatrix.theme index f56accc..c6acfda 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -126,7 +126,7 @@ _lp_dotmatrix_theme_activate() { [[ ${#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_FAIR[@]} == 0 ]] && DOTMATRIX_COLOR_FAIR=( 0 239 1 0 0 8) DOTMATRIX_COLOR_PATH_SHORT=( ${DOTMATRIX_COLOR_PATH_SHORT[@]+"${DOTMATRIX_COLOR_PATH_SHORT[@]}"} ) diff --git a/presets/colors-high-contrast.conf b/presets/colors-high-contrast.conf index ed1e4e3..b45db0e 100644 --- a/presets/colors-high-contrast.conf +++ b/presets/colors-high-contrast.conf @@ -1,22 +1,25 @@ +da=238 +li=254 + # Color arrays defaults: fg bg b u ffg fbg -DOTMATRIX_COLOR_DARK=( 15 0 0 0 15 0) -DOTMATRIX_COLOR_LITE=( 0 15 0 0 0 15) -DOTMATRIX_COLOR_GLOW=( 0 15 1 0 0 15) -DOTMATRIX_COLOR_NOTE=( 15 4 0 0 15 4) -DOTMATRIX_COLOR_WARN=( 9 11 1 0 9 11) -DOTMATRIX_COLOR_FAIR=( 0 8 0 0 0 8) +DOTMATRIX_COLOR_DARK=( $li $da 0 0 15 0) +DOTMATRIX_COLOR_LITE=( $da $li 0 0 0 15) +DOTMATRIX_COLOR_GLOW=( 0 $li 0 0 0 15) +DOTMATRIX_COLOR_NOTE=( 0 27 1 1 15 4) +DOTMATRIX_COLOR_WARN=( 88 220 1 1 9 11) +DOTMATRIX_COLOR_FAIR=( 0 $li 1 0 0 8) -DOTMATRIX_COLOR_PATH_SHORT=( 15 0 0 0 0 15) -DOTMATRIX_COLOR_PATH_VCS=( 15 0 0 1 0 15) -DOTMATRIX_COLOR_PATH_LAST=( 15 0 1 0 0 15) +DOTMATRIX_COLOR_PATH_SHORT=( 15 $da 0 0 0 15) +DOTMATRIX_COLOR_PATH_VCS=( 15 $da 0 1 0 15) +DOTMATRIX_COLOR_PATH_LAST=( 15 $da 1 0 0 15) -DOTMATRIX_COLOR_LINE=(15 -1 0 0 15 -1) -DOTMATRIX_COLOR_LINE_START=(15 -1 1 0 15 -1) -DOTMATRIX_COLOR_LINE_END=( 0 -1 1 0 15 -1) +DOTMATRIX_COLOR_LINE=(247 -1 0 0 7 -1) +DOTMATRIX_COLOR_LINE_START=(247 -1 1 0 7 -1) +DOTMATRIX_COLOR_LINE_END=( 247 -1 1 0 7 -1) DOTMATRIX_COLOR_MARK=(15 -1 0 0 15 -1) -DOTMATRIX_COLOR_SEP_DARK=( 15 -2 0 0 15 -2) -DOTMATRIX_COLOR_SEP_FAIR=( 8 -2 0 0 0 -2) -DOTMATRIX_COLOR_SEP_LITE=( 15 -2 0 0 15 -2) +DOTMATRIX_COLOR_SEP_DARK=( 15 -2 0 0 15 -2) +DOTMATRIX_COLOR_SEP_FAIR=( 0 -2 0 0 0 -2) +DOTMATRIX_COLOR_SEP_LITE=( 0 -2 0 0 15 -2) From 31e4b069fef8b0861b8810f49d624c5bd5291187 Mon Sep 17 00:00:00 2001 From: nojhan Date: Sat, 18 Nov 2023 10:48:26 +0100 Subject: [PATCH 08/29] feat(preset): all-blues --- presets/colors-all-blues.conf | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 presets/colors-all-blues.conf diff --git a/presets/colors-all-blues.conf b/presets/colors-all-blues.conf new file mode 100644 index 0000000..b68b839 --- /dev/null +++ b/presets/colors-all-blues.conf @@ -0,0 +1,26 @@ + +da=26 +li=75 +fa=27 + +# Color arrays defaults: fg bg b u ffg fbg +DOTMATRIX_COLOR_DARK=( 153 $da 0 0 15 0) +DOTMATRIX_COLOR_LITE=( 21 $li 0 0 0 15) +DOTMATRIX_COLOR_GLOW=( 0 $li 0 0 0 15) +DOTMATRIX_COLOR_NOTE=( 15 24 1 0 15 4) +DOTMATRIX_COLOR_WARN=( 0 135 1 0 9 11) +DOTMATRIX_COLOR_FAIR=( 0 $li 1 0 0 8) + +DOTMATRIX_COLOR_PATH_SHORT=( 15 $da 0 0 0 15) +DOTMATRIX_COLOR_PATH_VCS=( 15 $da 0 1 0 15) +DOTMATRIX_COLOR_PATH_LAST=( 15 $da 1 0 0 15) + +DOTMATRIX_COLOR_LINE=($fa -1 0 0 7 -1) +DOTMATRIX_COLOR_LINE_START=($fa -1 1 0 7 -1) +DOTMATRIX_COLOR_LINE_END=( $fa -1 1 0 7 -1) + +DOTMATRIX_COLOR_MARK=(15 -1 0 0 15 -1) +DOTMATRIX_COLOR_SEP_DARK=( 0 -2 0 0 15 -2) +DOTMATRIX_COLOR_SEP_FAIR=( 0 -2 0 0 0 -2) +DOTMATRIX_COLOR_SEP_LITE=( $li -2 0 0 15 -2) + From 05b8a335c91262707dde1b2a0c3e765facded3dd Mon Sep 17 00:00:00 2001 From: nojhan Date: Sun, 19 Nov 2023 14:06:50 +0100 Subject: [PATCH 09/29] fix(ssh): do not color ssh if not asked --- dotmatrix.theme | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dotmatrix.theme b/dotmatrix.theme index c6acfda..a645506 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -759,8 +759,12 @@ __dotmatrix_activate_hostname() { 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}" + 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}" From e51375327bdcf1b7d4f5ea0554d2eac367942061 Mon Sep 17 00:00:00 2001 From: nojhan Date: Sun, 19 Nov 2023 14:13:29 +0100 Subject: [PATCH 10/29] fix(sensors): incorrect separator --- dotmatrix.theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotmatrix.theme b/dotmatrix.theme index a645506..4dfd1e1 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -323,7 +323,7 @@ _lp_dotmatrix_theme_prompt() { 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}" + dotmatrix_sep="${lp_terminal_format}${dotmatrix_sep}${DOTMATRIX_SPACE_VOID}" side+="${dotmatrix_sep}${lp_join}" fi From b344f7139817b85d36a0d4207813fa549eba3160 Mon Sep 17 00:00:00 2001 From: nojhan Date: Sun, 19 Nov 2023 15:46:09 +0100 Subject: [PATCH 11/29] bidon --- dotmatrix.theme | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dotmatrix.theme b/dotmatrix.theme index 4dfd1e1..cfca975 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -315,7 +315,7 @@ _lp_dotmatrix_theme_prompt() { __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[@]}" + _lp_join "$dotmatrix_sep" ${blt[@]} if [[ -n "$lp_join" ]] ; then # Match the side sep @@ -323,9 +323,10 @@ _lp_dotmatrix_theme_prompt() { 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}${dotmatrix_sep}${DOTMATRIX_SPACE_VOID}" + # dotmatrix_sep="${lp_terminal_format}${dotmatrix_sep}${DOTMATRIX_SPACE_VOID}" + # side+="${dotmatrix_sep}${lp_join}" + side+="${lp_terminal_format}${DOTMATRIX_SPACE_VOID}${lp_join}" - side+="${dotmatrix_sep}${lp_join}" fi else lp_terminal_format ${DOTMATRIX_COLOR_FAIR[@]+"${DOTMATRIX_COLOR_FAIR[@]}"} From fa47cd5309fcce9504cdc408b57308e735dcaec3 Mon Sep 17 00:00:00 2001 From: nojhan Date: Tue, 21 Nov 2023 09:09:29 +0100 Subject: [PATCH 12/29] refactor(vcs): make the branch name dark - increase readibility with contrast - avoid situations where the remote name pushes the commits at the same screen location than the diff, making it difficult to spot the change --- dotmatrix.theme | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/dotmatrix.theme b/dotmatrix.theme index cfca975..28e05a1 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -117,7 +117,7 @@ _lp_dotmatrix_theme_activate() { [[ ${#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_GLOW[@]} == 0 ]] && DOTMATRIX_COLOR_GLOW=( 255 239 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) @@ -921,7 +921,7 @@ __dotmatrix_prompt_vcs() { color_ahead=(${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"}) fi else # No commit ahead. - color_ahead=(${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"}) + color_ahead=(${DOTMATRIX_COLOR_GLOW[@]+"${DOTMATRIX_COLOR_GLOW[@]}"}) fi # Choice of link type. @@ -947,7 +947,7 @@ __dotmatrix_prompt_vcs() { __dotmatrix_make_field "$DOTMATRIX_DIFF" "${color_ahead[@]}" _DOTMATRIX_VCS+="$dotmatrix_field" fi - __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} + __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_GLOW[@]+"${DOTMATRIX_COLOR_GLOW[@]}"} _DOTMATRIX_VCS+="$dotmatrix_sep" # else # 0 commit ahead => direct segment. fi @@ -955,7 +955,7 @@ __dotmatrix_prompt_vcs() { 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_make_sep_plug ${DOTMATRIX_COLOR_GLOW[@]+"${DOTMATRIX_COLOR_GLOW[@]}"} _DOTMATRIX_VCS+="$dotmatrix_sep" # No local commit segment. fi @@ -966,12 +966,12 @@ __dotmatrix_prompt_vcs() { _DOTMATRIX_VCS+="$dotmatrix_field" if _lp_vcs_bookmark; then - __dotmatrix_make_field ":${lp_vcs_bookmark}" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} + __dotmatrix_make_field ":${lp_vcs_bookmark}" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} _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_make_sep_soft ${DOTMATRIX_COLOR_SEP_DARK[@]+"${DOTMATRIX_COLOR_SEP_DARK[@]}"} + __dotmatrix_make_field "$lp_vcs_tag" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} _DOTMATRIX_VCS+="${dotmatrix_sep}${dotmatrix_field}" fi @@ -1057,13 +1057,8 @@ __dotmatrix_prompt_vcs() { # 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 + __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} + _DOTMATRIX_VCS+="$dotmatrix_sep" fi if [[ -n "$stash" ]] ; then From be28a24b202084526ab286b0dd83435d3c112600 Mon Sep 17 00:00:00 2001 From: nojhan Date: Wed, 22 Nov 2023 10:09:44 +0100 Subject: [PATCH 13/29] fix(mark): add a sudo mark - Do not rely only on color, for some people may be colorblind. Adds an additional character, which can be set to '' for users not wanting it. - Use a more centered square for the prompt mark. --- README.md | 7 ++++++- dotmatrix.theme | 5 +++-- presets/variant-chevron.conf | 1 + presets/variant-round.conf | 1 + presets/variant-slant.conf | 1 + presets/variant-text.conf | 1 + 6 files changed, 13 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ea49bae..a294b18 100644 --- a/README.md +++ b/README.md @@ -326,11 +326,16 @@ The marker used to indicate that there is some change in the VCS state The marker used to indicate that there is a VCS involved in the current directory. -**DOTMATRIX_MARK** *string = "■"* +**DOTMATRIX_MARK** *string = "⯀"* The actual prompt marker, right where the user type text. +**DOTMATRIX_MARK_SUDO** *string = "⋮"* + +An additional character displayed before the last prompt mark +when the user has sudo rights. + **DOTMATRIX_ENABLE_GRADIENT_LINE** *boolean = 0* If set to 0 (the default), will draw the line of the middle section diff --git a/dotmatrix.theme b/dotmatrix.theme index 28e05a1..fb53e60 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -57,7 +57,8 @@ _lp_dotmatrix_theme_activate() { DOTMATRIX_HOST_LOCAL=${DOTMATRIX_HOST_LOCAL:-"⌂"} DOTMATRIX_USER_LOCAL=${DOTMATRIX_USER_LOCAL:-"♟"} DOTMATRIX_VCS=${DOTMATRIX_VCS:-"╟┘"} - DOTMATRIX_MARK=${DOTMATRIX_MARK:-"■"} + DOTMATRIX_MARK=${DOTMATRIX_MARK:-"⯀"} + DOTMATRIX_MARK_SUDO=${DOTMATRIX_MARK_SUDO:-"⋮"} DOTMATRIX_LINE=${DOTMATRIX_LINE:-"━"} DOTMATRIX_PLUG=${DOTMATRIX_PLUG:-"▛"} DOTMATRIX_SOFT=${DOTMATRIX_SOFT:-"╱"} @@ -630,7 +631,7 @@ _lp_dotmatrix_theme_prompt() { local dcwfg="${DOTMATRIX_COLOR_WARN[_LP_FIRST_INDEX+1]}" [[ -z $dcwfg ]] && dcwfg=-1 lp_terminal_format $dcwfg - dotmatrix_prompt+="${lp_terminal_format}${DOTMATRIX_MARK}" + dotmatrix_prompt+="${lp_terminal_format}${DOTMATRIX_MARK_SUDO}${DOTMATRIX_MARK}" else dotmatrix_prompt+="${mark_color}${DOTMATRIX_MARK}" fi diff --git a/presets/variant-chevron.conf b/presets/variant-chevron.conf index eea69bb..8bc2d88 100644 --- a/presets/variant-chevron.conf +++ b/presets/variant-chevron.conf @@ -5,6 +5,7 @@ DOTMATRIX_HOST_LOCAL=${DOTMATRIX_HOST_LOCAL:-""} DOTMATRIX_USER_LOCAL=${DOTMATRIX_USER_LOCAL:-""} DOTMATRIX_VCS=${DOTMATRIX_VCS:-""} DOTMATRIX_MARK=${DOTMATRIX_MARK:-""} +DOTMATRIX_MARK_SUDO=${DOTMATRIX_MARK_SUDO:-"⁘"} # ⁘ 🞙 DOTMATRIX_LINE=${DOTMATRIX_LINE:-"━"} DOTMATRIX_PLUG=${DOTMATRIX_PLUG:-""} DOTMATRIX_SOFT=${DOTMATRIX_SOFT:-"╱"} diff --git a/presets/variant-round.conf b/presets/variant-round.conf index 068325e..167cab3 100644 --- a/presets/variant-round.conf +++ b/presets/variant-round.conf @@ -5,6 +5,7 @@ DOTMATRIX_HOST_LOCAL=${DOTMATRIX_HOST_LOCAL:-""} DOTMATRIX_USER_LOCAL=${DOTMATRIX_USER_LOCAL:-""} DOTMATRIX_VCS=${DOTMATRIX_VCS:-""} DOTMATRIX_MARK=${DOTMATRIX_MARK:-""} +DOTMATRIX_MARK_SUDO=${DOTMATRIX_MARK_SUDO:-"⚬"} # ⁘ ⚬ 🞙 DOTMATRIX_LINE=${DOTMATRIX_LINE:-"━"} DOTMATRIX_PLUG=${DOTMATRIX_PLUG:-""} DOTMATRIX_SOFT=${DOTMATRIX_SOFT:-"╱"} diff --git a/presets/variant-slant.conf b/presets/variant-slant.conf index 5a0bd2d..60dbe02 100644 --- a/presets/variant-slant.conf +++ b/presets/variant-slant.conf @@ -5,6 +5,7 @@ DOTMATRIX_HOST_LOCAL=${DOTMATRIX_HOST_LOCAL:-""} DOTMATRIX_USER_LOCAL=${DOTMATRIX_USER_LOCAL:-""} DOTMATRIX_VCS=${DOTMATRIX_VCS:-""} DOTMATRIX_MARK=${DOTMATRIX_MARK:-""} +DOTMATRIX_MARK_SUDO=${DOTMATRIX_MARK_SUDO:-"🞙"} # ⁘ ⚬ 🞙 DOTMATRIX_LINE=${DOTMATRIX_LINE:-"━"} DOTMATRIX_PLUG=${DOTMATRIX_PLUG:-""} DOTMATRIX_SOFT=${DOTMATRIX_SOFT:-"╱"} diff --git a/presets/variant-text.conf b/presets/variant-text.conf index e6f8e81..5bb2cb3 100644 --- a/presets/variant-text.conf +++ b/presets/variant-text.conf @@ -5,6 +5,7 @@ DOTMATRIX_HOST_LOCAL=${DOTMATRIX_HOST_LOCAL:-"lcl"} DOTMATRIX_USER_LOCAL=${DOTMATRIX_USER_LOCAL:-"me"} DOTMATRIX_VCS=${DOTMATRIX_VCS:-"VCS"} DOTMATRIX_MARK=${DOTMATRIX_MARK:-">"} +DOTMATRIX_MARK_SUDO=${DOTMATRIX_MARK_SUDO:-"!"} DOTMATRIX_LINE=${DOTMATRIX_LINE:-"━"} DOTMATRIX_PLUG=${DOTMATRIX_PLUG:-"▌"} DOTMATRIX_SOFT=${DOTMATRIX_SOFT:-"╱"} From 74086c9fdd35edac376d5e03585ff80994cd237c Mon Sep 17 00:00:00 2001 From: nojhan Date: Thu, 23 Nov 2023 23:46:57 +0100 Subject: [PATCH 14/29] feat(remote): shorten "origin" as a pushpin If the VCS remote name is "origin", then it will be shorten to DOTMATRIX_VCS_REMOTE_ORIGIN --- README.md | 3 +++ dotmatrix.theme | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/README.md b/README.md index a294b18..c03c422 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,9 @@ Number of unpulled remote commits above which the prompt should use the warning Number of modified lines above which the prompt should use the warning color to display the "commit" section. +**DOTMATRIX_VCS_REMOTE_ORIGIN** *string* = "🖈" + +String used as a shorten VCS remote name, if it is "origin". **DOTMATRIX_DETACHED_THRESHOLD** *integer = 3* diff --git a/dotmatrix.theme b/dotmatrix.theme index fb53e60..6f40f0a 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -27,6 +27,8 @@ _lp_dotmatrix_theme_activate() { DOTMATRIX_SHELL_ZSH=${DOTMATRIX_SHELL_ZSH:-"z"} DOTMATRIX_SHELL_BASH=${DOTMATRIX_SHELL_BASH:-"b"} + DOTMATRIX_VCS_REMOTE_ORIGIN=${DOTMATRIX_VCS_REMOTE_ORIGIN:-"🖈"} + 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:-"[…]"} @@ -880,6 +882,9 @@ __dotmatrix_prompt_vcs() { # Mark & commits off remote if _lp_vcs_commits_off_remote; then # There is remote-space-[local]. _lp_vcs_remote # Get remote name. + if [[ "$lp_vcs_remote" == "origin" ]]; then + lp_vcs_remote="$DOTMATRIX_VCS_REMOTE_ORIGIN" + fi # Remote segment. if [[ "$lp_vcs_commit_behind" -ne "0" ]]; then # NOTE remote segment. From a75b4ef1344730363e889c58092a26153b8c64ea Mon Sep 17 00:00:00 2001 From: nojhan Date: Tue, 5 Dec 2023 10:35:22 +0100 Subject: [PATCH 15/29] refactor: atomic theme assembling functions --- dotmatrix.theme | 160 +++++++++++++++++++++++++++--------------------- 1 file changed, 91 insertions(+), 69 deletions(-) diff --git a/dotmatrix.theme b/dotmatrix.theme index 6f40f0a..dfc02a7 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -203,9 +203,7 @@ _lp_dotmatrix_theme_directory() { } -_lp_dotmatrix_theme_prompt() { - - local header inline dotmatrix_prompt +_lp_dotmatrix_make_header() { # Arguments: fg, bg, bold, underline, fallback_fg, fallback_bg # Color codes can be any integer in 256 XTerm's system colors in [0–255]. @@ -219,31 +217,33 @@ _lp_dotmatrix_theme_prompt() { # 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} " + _lp_dotmatrix_make_header="" + _lp_dotmatrix_make_header+="${_DOTMATRIX_DISPLAY}" + _lp_dotmatrix_make_header+="${_DOTMATRIX_CONNECTION}" + _lp_dotmatrix_make_header+="${_DOTMATRIX_USER}" + _lp_dotmatrix_make_header+="${_DOTMATRIX_MULTIPLEXER}" + _lp_dotmatrix_make_header+="${_DOTMATRIX_HOSTNAME}" + _lp_dotmatrix_make_header+="${_DOTMATRIX_FS}" + _lp_dotmatrix_make_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}" + _lp_dotmatrix_make_header+="${dotmatrix_sep}" __dotmatrix_make_field "$lp_dirstack" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} - header+="${dotmatrix_field}" + _lp_dotmatrix_make_header+="${dotmatrix_field}" fi +} + +_lp_dotmatrix_make_side() { #################################################################### # HEADER SIDE (RIGHT) #################################################################### - local has_notes=0 - local has_warns=0 + local _lp_dotmatrix_has_notes=0 + local _lp_dotmatrix_has_warns=0 # DOTMATRIX_COLOR_SEP_FAIR __dotmatrix_make_sep_side "" @@ -255,11 +255,11 @@ _lp_dotmatrix_theme_prompt() { 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)) + _lp_dotmatrix_has_warns=$((_lp_dotmatrix_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)) + _lp_dotmatrix_has_notes=$((_lp_dotmatrix_has_notes+1)) fi fi @@ -268,11 +268,11 @@ _lp_dotmatrix_theme_prompt() { 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)) + _lp_dotmatrix_has_warns=$((_lp_dotmatrix_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)) + _lp_dotmatrix_has_notes=$((_lp_dotmatrix_has_notes+1)) fi fi @@ -281,11 +281,11 @@ _lp_dotmatrix_theme_prompt() { 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)) + _lp_dotmatrix_has_warns=$((_lp_dotmatrix_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)) + _lp_dotmatrix_has_notes=$((_lp_dotmatrix_has_notes+1)) fi fi @@ -294,11 +294,11 @@ _lp_dotmatrix_theme_prompt() { 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)) + _lp_dotmatrix_has_warns=$((_lp_dotmatrix_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)) + _lp_dotmatrix_has_notes=$((_lp_dotmatrix_has_notes+1)) fi fi @@ -307,11 +307,11 @@ _lp_dotmatrix_theme_prompt() { 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)) + _lp_dotmatrix_has_warns=$((_lp_dotmatrix_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)) + _lp_dotmatrix_has_notes=$((_lp_dotmatrix_has_notes+1)) fi fi @@ -344,11 +344,11 @@ _lp_dotmatrix_theme_prompt() { 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)) + _lp_dotmatrix_has_warns=$((_lp_dotmatrix_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)) + _lp_dotmatrix_has_notes=$((_lp_dotmatrix_has_notes+1)) fi fi fi @@ -360,11 +360,11 @@ _lp_dotmatrix_theme_prompt() { 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)) + _lp_dotmatrix_has_warns=$((_lp_dotmatrix_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)) + _lp_dotmatrix_has_notes=$((_lp_dotmatrix_has_notes+1)) fi fi @@ -372,17 +372,17 @@ _lp_dotmatrix_theme_prompt() { 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)) + _lp_dotmatrix_has_warns=$((_lp_dotmatrix_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)) + _lp_dotmatrix_has_notes=$((_lp_dotmatrix_has_notes+1)) fi fi fi lp_terminal_format ${DOTMATRIX_COLOR_FAIR[@]+"${DOTMATRIX_COLOR_FAIR[@]}"} - if [[ $has_warns -gt 0 ]]; then + if [[ $_lp_dotmatrix_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[@]}"} @@ -418,26 +418,13 @@ _lp_dotmatrix_theme_prompt() { 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}" - +_lp_dotmatrix_make_line() { #################################################################### # IN LINE #################################################################### + local color_line_end="" if (( LP_ENABLE_SSH_COLORS )); then local lp_hostname_hash @@ -528,16 +515,16 @@ _lp_dotmatrix_theme_prompt() { inline_right+="${DOTMATRIX_LINE}" - local inline= + local _lp_dotmatrix_make_line= # 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" + __lp_strip_escapes "$_lp_dotmatrix_make_line" local left_as_text="$ret" local line_width=$((${COLUMNS:-80}-${#left_as_text})) - local line="$inline" + local line="$_lp_dotmatrix_make_line" local i c f a b j for ((i=0; i < line_width; i++)); do # For each character in the line. local dash_colors=() @@ -552,50 +539,52 @@ _lp_dotmatrix_theme_prompt() { # line+="${lp_terminal_format}${i}(${dash_colors[@]}) " done - inline="${line}${NO_COL}" + _lp_dotmatrix_make_line="${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}" + _lp_dotmatrix_make_line="${lp_terminal_format}${lp_fill}${NO_COL}" fi +} +_lp_dotmatrix_make_input() { #################################################################### # PROMPT LINE #################################################################### - dotmatrix_prompt="" + _lp_dotmatrix_make_input="" 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}" + _lp_dotmatrix_make_input+="${lp_terminal_format}${LP_MARK_WIFI}" else - dotmatrix_prompt+="${lp_terminal_format}${LP_MARK_WIFI}" + _lp_dotmatrix_make_input+="${lp_terminal_format}${LP_MARK_WIFI}" fi else - dotmatrix_prompt+="${lp_terminal_format}·" + _lp_dotmatrix_make_input+="${lp_terminal_format}·" fi if _lp_http_proxy ; then __dotmatrix_make_sep_link ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} - dotmatrix_prompt+="${dotmatrix_sep}" + _lp_dotmatrix_make_input+="${dotmatrix_sep}" else __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} - dotmatrix_prompt+="${dotmatrix_sep}" + _lp_dotmatrix_make_input+="${dotmatrix_sep}" fi if __dotmatrix_prompt_vcs; then - dotmatrix_prompt+="${_DOTMATRIX_VCS}" + _lp_dotmatrix_make_input+="${_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}" + _lp_dotmatrix_make_input+="${dotmatrix_sep}${dotmatrix_field}" fi if _lp_error ; then @@ -607,11 +596,11 @@ _lp_dotmatrix_theme_prompt() { 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}" + _lp_dotmatrix_make_input+="${dotmatrix_sep}${dotmatrix_field}" fi __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_MARK[@]+"${DOTMATRIX_COLOR_MARK[@]}"} - dotmatrix_prompt+="${dotmatrix_sep}" + _lp_dotmatrix_make_input+="${dotmatrix_sep}" lp_terminal_format ${DOTMATRIX_COLOR_MARK[@]+"${DOTMATRIX_COLOR_MARK[@]}"} local mark_color="$lp_terminal_format" @@ -619,11 +608,11 @@ _lp_dotmatrix_theme_prompt() { if _lp_shell_level ; then local i for ((i=0; i < lp_shell_level-1; i++)); do - dotmatrix_prompt+="${mark_color}${DOTMATRIX_MARK}" + _lp_dotmatrix_make_input+="${mark_color}${DOTMATRIX_MARK}" done fi - # Warning dotmatrix_prompt mark if either root or sudo. + # Warning _lp_dotmatrix_make_input mark if either root or sudo. _lp_user user="$?" # No need to check LP_ENABLE_SUDO, _lp_sudo_active does it. @@ -633,12 +622,45 @@ _lp_dotmatrix_theme_prompt() { local dcwfg="${DOTMATRIX_COLOR_WARN[_LP_FIRST_INDEX+1]}" [[ -z $dcwfg ]] && dcwfg=-1 lp_terminal_format $dcwfg - dotmatrix_prompt+="${lp_terminal_format}${DOTMATRIX_MARK_SUDO}${DOTMATRIX_MARK}" + _lp_dotmatrix_make_input+="${lp_terminal_format}${DOTMATRIX_MARK_SUDO}${DOTMATRIX_MARK}" else - dotmatrix_prompt+="${mark_color}${DOTMATRIX_MARK}" + _lp_dotmatrix_make_input+="${mark_color}${DOTMATRIX_MARK}" fi - dotmatrix_prompt+="${NO_COL}" + _lp_dotmatrix_make_input+="${NO_COL}" +} + +_lp_dotmatrix_theme_prompt() { + + local header side inline dotmatrix_prompt + + _lp_dotmatrix_make_header + header+="$_lp_dotmatrix_make_header" + + _lp_dotmatrix_make_side + side="$_lp_dotmatrix_make_side" + + # 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 "$_lp_dotmatrix_has_warns" "$_lp_dotmatrix_has_notes" + header+="$dotmatrix_sep" + + # Right-align the $side with spaces. + _lp_fill "$header$NO_COL" "$side" " " + header="$lp_fill${NO_COL}" + + _lp_dotmatrix_make_line + inline="$_lp_dotmatrix_make_line" + + _lp_dotmatrix_make_input + dotmatrix_prompt="$_lp_dotmatrix_make_input" # Assemble and setup local n=$'\n' From cac5b1415d944b211e32f4d3f1a89b831a59e4bd Mon Sep 17 00:00:00 2001 From: nojhan Date: Tue, 5 Dec 2023 15:50:07 +0100 Subject: [PATCH 16/29] feat: dotvector theme --- dotmatrix.theme | 219 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 150 insertions(+), 69 deletions(-) diff --git a/dotmatrix.theme b/dotmatrix.theme index dfc02a7..ca259e7 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -420,7 +420,7 @@ _lp_dotmatrix_make_side() { fi } -_lp_dotmatrix_make_line() { +_lp_dotmatrix_make_env() { #################################################################### # IN LINE #################################################################### @@ -434,7 +434,7 @@ _lp_dotmatrix_make_line() { 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}" + _lp_dotmatrix_make_env_inline_left="${NO_COL}$LP_PS1_PREFIX${lp_terminal_format}${DOTMATRIX_LINE}" # Dev env section. local ista="$_LP_FIRST_INDEX" @@ -446,51 +446,51 @@ _lp_dotmatrix_make_line() { 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" + _lp_dotmatrix_make_env_inline_left+="$d${lp_join}$b" fi if _lp_software_collections ; then - inline_left+="$d${lp_software_collections}$b" + _lp_dotmatrix_make_env_inline_left+="$d${lp_software_collections}$b" fi if _lp_python_env ; then - inline_left+="$d${lp_python_env}$b" + _lp_dotmatrix_make_env_inline_left+="$d${lp_python_env}$b" fi if _lp_node_env ; then - inline_left+="$d${lp_node_env}$b" + _lp_dotmatrix_make_env_inline_left+="$d${lp_node_env}$b" fi if _lp_ruby_env ; then - inline_left+="$d${lp_ruby_env}$b" + _lp_dotmatrix_make_env_inline_left+="$d${lp_ruby_env}$b" fi if _lp_container ; then - inline_left+="$d${lp_container}$b" + _lp_dotmatrix_make_env_inline_left+="$d${lp_container}$b" fi if _lp_kubernetes_context ; then - inline_left+="$d${lp_kubernetes_context}$b" + _lp_dotmatrix_make_env_inline_left+="$d${lp_kubernetes_context}$b" fi if _lp_terraform_env ; then - inline_left+="$d${lp_terraform_env}$b" + _lp_dotmatrix_make_env_inline_left+="$d${lp_terraform_env}$b" fi if _lp_aws_profile ; then - inline_left+="$d${lp_aws_profile}$b" + _lp_dotmatrix_make_env_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" + _lp_dotmatrix_make_env_inline_left+="$d${lp_join}$b" fi if _lp_container; then - inline_left+="$d$lp_container$b" + _lp_dotmatrix_make_env_inline_left+="$d$lp_container$b" fi if _lp_modules; then - inline_left+="$d" + _lp_dotmatrix_make_env_inline_left+="$d" _lp_join "$I" "${lp_modules[@]}" - inline_left+="${lp_join}$b" + _lp_dotmatrix_make_env_inline_left+="${lp_join}$b" fi # History section. - local inline_right= + local _lp_dotmatrix_make_env_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" + _lp_dotmatrix_make_env_inline_right+="$d${lp_join}$b" fi if ((DOTMATRIX_ENABLE_HISTORY)) ; then local hist_max @@ -510,76 +510,44 @@ _lp_dotmatrix_make_line() { local hlast="$ret" __lp_escape "$hist_most" local hmost="$ret" - inline_right="$d${hlast}$I${hmost}$b" - fi - - inline_right+="${DOTMATRIX_LINE}" - - local _lp_dotmatrix_make_line= - # 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 "$_lp_dotmatrix_make_line" - local left_as_text="$ret" - local line_width=$((${COLUMNS:-80}-${#left_as_text})) - - local line="$_lp_dotmatrix_make_line" - 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 - - _lp_dotmatrix_make_line="${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. - _lp_dotmatrix_make_line="${lp_terminal_format}${lp_fill}${NO_COL}" + _lp_dotmatrix_make_env_inline_right="$d${hlast}$I${hmost}$b" fi } -_lp_dotmatrix_make_input() { +_lp_dotmatrix_make_vcs() { - #################################################################### - # PROMPT LINE - #################################################################### - - _lp_dotmatrix_make_input="" + _lp_dotmatrix_make_vcs="" 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[@]}"} - _lp_dotmatrix_make_input+="${lp_terminal_format}${LP_MARK_WIFI}" + _lp_dotmatrix_make_vcs+="${lp_terminal_format}${LP_MARK_WIFI}" else - _lp_dotmatrix_make_input+="${lp_terminal_format}${LP_MARK_WIFI}" + _lp_dotmatrix_make_vcs+="${lp_terminal_format}${LP_MARK_WIFI}" fi else - _lp_dotmatrix_make_input+="${lp_terminal_format}·" + _lp_dotmatrix_make_vcs+="${lp_terminal_format}·" fi if _lp_http_proxy ; then __dotmatrix_make_sep_link ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} - _lp_dotmatrix_make_input+="${dotmatrix_sep}" + _lp_dotmatrix_make_vcs+="${dotmatrix_sep}" else __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} - _lp_dotmatrix_make_input+="${dotmatrix_sep}" + _lp_dotmatrix_make_vcs+="${dotmatrix_sep}" fi if __dotmatrix_prompt_vcs; then - _lp_dotmatrix_make_input+="${_DOTMATRIX_VCS}" + _lp_dotmatrix_make_vcs+="${_DOTMATRIX_VCS}" fi +} + +_lp_dotmatrix_make_input() { + #################################################################### + # PROMPT LINE + #################################################################### + _lp_dotmatrix_make_input= if _lp_runtime_format ; then __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} @@ -640,7 +608,7 @@ _lp_dotmatrix_theme_prompt() { _lp_dotmatrix_make_side side="$_lp_dotmatrix_make_side" - # Final assembling + # header/side assembling if _lp_dirstack; then lp_terminal_format ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} else @@ -656,11 +624,51 @@ _lp_dotmatrix_theme_prompt() { _lp_fill "$header$NO_COL" "$side" " " header="$lp_fill${NO_COL}" - _lp_dotmatrix_make_line - inline="$_lp_dotmatrix_make_line" + _lp_dotmatrix_make_env + local inline_left="$_lp_dotmatrix_make_env_inline_left" + local inline_right="$_lp_dotmatrix_make_env_inline_right" + + _lp_dotmatrix_inline_right+="${DOTMATRIX_LINE}" + + inline= + # FIXME deprecated + # # 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 "$_lp_dotmatrix_make_env_inline_left" + # local left_as_text="$ret" + # local line_width=$((${COLUMNS:-80}-${#left_as_text})) + + # local line="$_lp_dotmatrix_make_env" + # 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 + + # _lp_dotmatrix_make_env="${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 + + _lp_dotmatrix_make_vcs + dotmatrix_prompt="$_lp_dotmatrix_make_vcs" _lp_dotmatrix_make_input - dotmatrix_prompt="$_lp_dotmatrix_make_input" + dotmatrix_prompt+="$_lp_dotmatrix_make_input" # Assemble and setup local n=$'\n' @@ -668,6 +676,79 @@ _lp_dotmatrix_theme_prompt() { } + +######################################################################## +# DotVector theme +######################################################################## + +_lp_dotvector_theme_activate() { + _lp_dotmatrix_theme_activate +} + +_lp_dotvector_theme_directory() { + _lp_dotmatrix_theme_directory +} + +_lp_dotvector_theme_prompt() { + local header side inline input vcs main + + _lp_dotmatrix_make_header + header+="$_lp_dotmatrix_make_header" + + _lp_dotmatrix_make_side + side="$_lp_dotmatrix_make_side" + + # header/side 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 "$_lp_dotmatrix_has_warns" "$_lp_dotmatrix_has_notes" + header+="$dotmatrix_sep" + + _lp_dotmatrix_make_vcs + + lp_terminal_format -3 -1 + local last_color="$lp_terminal_format" + + lp_terminal_format ${DOTMATRIX_COLOR_LINE[@]} + local line_color="$lp_terminal_format" + lp_terminal_format ${DOTMATRIX_COLOR_LITE[_LP_FIRST_INDEX+0]} -1 0 0 + local before="${line_color}${DOTMATRIX_LINE}${lp_terminal_format}${DOTMATRIX_LINK[_LP_FIRST_INDEX+2]}" + + local after="${DOTMATRIX_SPACE_VOID}${last_color}${DOTMATRIX_LINK_R[_LP_FIRST_INDEX+0]}" + + vcs="${before}${_lp_dotmatrix_make_vcs}${after}" + + # Right-align the $side with spaces. + # _lp_fill "$header$NO_COL" "$side" " " + # header="$lp_fill${NO_COL}" + + _lp_dotmatrix_make_env + local inline_left="$_lp_dotmatrix_make_env_inline_left" + local inline_right="$_lp_dotmatrix_make_env_inline_right" + + _lp_dotmatrix_inline_right+="${DOTMATRIX_LINE}" + + _lp_fill "${header}${vcs}${inline_left}" "${inline_right}${side}" "$DOTMATRIX_LINE" + main="${lp_terminal_format}${lp_fill}${NO_COL}" + + lp_terminal_format ${DOTMATRIX_COLOR_LITE[@]} + local start="${lp_terminal_format}" + + _lp_dotmatrix_make_input + input="$start$_lp_dotmatrix_make_input" + + # Assemble and setup + local n=$'\n' + PS1="${n}${main}${n}${input} " +} + + ######################################################################## # Functions called at "activate" stage. ######################################################################## From 0348a77e02a2629076ce0e8cc9d9914e204100c1 Mon Sep 17 00:00:00 2001 From: nojhan Date: Tue, 5 Dec 2023 21:21:49 +0100 Subject: [PATCH 17/29] fix: side section --- dotmatrix.theme | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/dotmatrix.theme b/dotmatrix.theme index ca259e7..ad7a515 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -247,7 +247,7 @@ _lp_dotmatrix_make_side() { # DOTMATRIX_COLOR_SEP_FAIR __dotmatrix_make_sep_side "" - side="${dotmatrix_sep}" + _lp_dotmatrix_make_side="${dotmatrix_sep}" # battery / load / temperature local battery= @@ -326,14 +326,12 @@ _lp_dotmatrix_make_side() { 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}${dotmatrix_sep}${DOTMATRIX_SPACE_VOID}" - # side+="${dotmatrix_sep}${lp_join}" - side+="${lp_terminal_format}${DOTMATRIX_SPACE_VOID}${lp_join}" + _lp_dotmatrix_make_side+="${lp_terminal_format}${DOTMATRIX_SPACE_VOID}${lp_join}" fi else lp_terminal_format ${DOTMATRIX_COLOR_FAIR[@]+"${DOTMATRIX_COLOR_FAIR[@]}"} - side+="${lp_terminal_format}" + _lp_dotmatrix_make_side+="${lp_terminal_format}" fi # jobs: detached / running / stopped @@ -394,28 +392,28 @@ _lp_dotmatrix_make_side() { if [[ ${#drs[@]} -gt 0 ]] ; then _lp_join "$dotmatrix_sep" "${drs[@]}" if [[ -n "$lp_join" ]] ; then - side+="${djc_plug}${lp_join}" + _lp_dotmatrix_make_side+="${djc_plug}${lp_join}" fi else lp_terminal_format ${DOTMATRIX_COLOR_FAIR[@]+"${DOTMATRIX_COLOR_FAIR[@]}"} - side+="${lp_terminal_format}" + _lp_dotmatrix_make_side+="${lp_terminal_format}" fi # Called here for an easy access to the configured color. if __dotmatrix_activate_shell ; then - side+="${_DOTMATRIX_SHELL}" + _lp_dotmatrix_make_side+="${_DOTMATRIX_SHELL}" fi # clock if _lp_time ; then __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - side+="${dotmatrix_sep}" + _lp_dotmatrix_make_side+="${dotmatrix_sep}" if _lp_analog_time ; then __dotmatrix_make_field "$lp_analog_time" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - side+="$dotmatrix_field" + _lp_dotmatrix_make_side+="$dotmatrix_field" else __dotmatrix_make_field "$lp_time" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - side+="$dotmatrix_field" + _lp_dotmatrix_make_side+="$dotmatrix_field" fi fi } From 12f989413484eef027efbfa4257fa332d9a8f11d Mon Sep 17 00:00:00 2001 From: nojhan Date: Mon, 5 Feb 2024 19:59:39 +0100 Subject: [PATCH 18/29] first draft --- docs/README.md | 172 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..dc85a68 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,172 @@ + +# Introduction + + + +This article is made of two main sections: generic design principles, +and Jolly's design principles. + +The generic design principles were applied during the development of Liquid Prompt. +They should remain valid for its default theme as well as for the Jolly theme. +However, the folowing section only discuss their implementation within the Jolly theme. + +The Jolly's design principles are more or less specific to the Jolly theme. + + +## What is a Prompt? + +There are two kind of computer scientists: those who use the command line, +and those who are retired. Even developers who embrace highly integrated development interfaces have some kind of terminal available in some panel of their IDE. +Like it or not, the shell is a core part of everyday life for most of the people expecting their computer to work for them. + +Now the shell actually has access to a lot of information about the computer. +And most of this information is about the current state of the work environment, +which is of the highest interest to the user. +However, by default the shell only shows very little information unless you ask specifically for it. +Furthermore, the only location on the screen available for the permanent display of anything is the "prompt". + +The prompt is this string of characters displayed right in front of the line where you type your commands. +In the most common default configuration, it displays only three pieces of information: +the user, the hostname, and the path —`user@hostname:path $ `. + +But it can display more! And this is the objective of prompt systems. +Those "prompts" (to be short) actually add a lot of information to this area of the command line. +For example, the most common feature is to display the state of the Git repository the user is in. + + +## Prompt Features + +This document will refer to feature sets, +as a way to group the information in broad categories. + +Feature categories are: + +1. **shell essentials**: features usually found in a classic prompt (path, user, exit codes…), useful in everyday use (jobs, sensors, multiplexer integration…), or generally considered important (themes…). + 1. **situation**: who is connected, and how. + 2. **location**: where (which path) the user is. + 3. **sensor**: states of the system (temperature, load, spaces, etc.). + 4. **feedback**: information from the last command (error, runtime). + 5. **warnings**: information conditionning the next command (admin rights). +2. **version control**: Git, Mercurial and co. + 1. **remote**: information related to interaction with a remote repository. + 2. **local**: information related to the local repository. +3. **environments**: dynamic configuration detection (virtual env, shell variables, containers…). +4. **toolsets versions**: current version of specific tools (programming languages, build chains, tools…). +5. **miscellaneous shell features**: shell-related features considered less important (network, terminal title, hyperlinks…). +6. **services**: services running permanently, online or on the machine (music, weather…). + +Theses categories are delineated with the main use of the terminal in mind: + +- Features in the *shell essentials* category is what you will need the most often, whatever you are doing in your terminal. +- If you are a programmer, you will pay additional attention to the *version control* and *environments* categories. +- If you are a devops, the *dev context* category is also of interest to you. +- If you do sysadmin, the *miscellaneous* category may contain some mildly interesting features. +- If you need features in the *services* category, you probably misunderstood what a *command line interface* is, or you are looking for a *status bar* (which a prompt system can be). + + +# Generic Design Principles + +The rationale of a prompt system is that it is actually useful to have an immediate access to the current *state* of the system. +Seeing a *state change* right where the user actually looks is a very good *feedback* on their actions. +But of course this feedback should not come in the way of how the user works. + +States should be chosen and displayed according to their importance for the user's work. + +More precisely, a good prompt is a prompt which is: + +- **accentuated**: it makes more visible the feedback for more important state changes, while not polluting the visibility of stable/anecdotal states, +- **focused**: it targets states that are actually useful to the user *during a work session*, +- **seamless**: it does not product friction with the user workflow, +- **scoped**: it targets states that can change by themselves or be changed by the user, +- **measured**: it embraces the fact that some states change less often than others (and thus avoids being just a collection of states that only rarely change), +- **configurable**: be easy to immediately adapt the display of information, if needed. + + +## Accentuated + +The prompt should be organized in several sections, which importance should +be obvious to the user, depending on their location on the screen and/or their styling. + +Section styling should not overflow on neighbor sections. +For instance, given that the terminal is organized as a grid of characters, +the background of two close character will blend. +Therefore, one should maintain a certain degree of contrast between sections +that are touching each other but have a different semantics. + +> Jolly is organized in four sections, spread on three lines: +> 1. The leftmost part of the first line is the first in reading order. +> It is thus used for stable and important information. +> 2. The third line is holding the actual prompt, where the user types. +> It is thus of high importance, and used for the *version control*, +> *feedback* and *warning* sections. +> 3. The rightmost part of the first line is last in the reading order. +> It is thus used to display transient states. +> 4. The second line cannot be of background-colored, or it would overflow on +> the first and last line. It is thus of low importance and holds the +> *environments* and *toolset versions* sections. + + +## Focused + +Information that changes often and/or that is important regarding the user's main tasks +should be easier to see. + +In a regular prompt, most of the text has no background color by default. +Any text which has a background color is thus easier to spot. + +Therefore, important information should be displayed in a background-colored segment, +while less important information can be displayed in a foreground-colored one. + +Information related to the *situation* and *location* of the user should +always be considered important, as they may drastically alter the workflow of the user. + +> In Jolly, the *toolsets versions* and *environment* feature sets are to be +> displayed in a foreground-colored section of the prompt, +> while the others are in background-colored sections. + + +## Seamless + + +## Scoped + +States that are measured and not directly changed by the user should be hidden by default. +Counters that can fall down to zero should be hidden by default. + +> In Jolly, *sensors* are hidden by default, while *situation* and *location* +> information are always shown, even if set to the default state. + + +## Measured + +States that are expected to change often during a work sessions should be considered +important. +States that rarely change or evolve slowly are less important. + +> In Jolly, *sensors* are grouped on the righmost part of the +> first line of the prompt. +> Information about version control is however close to the actual prompt. + + +## Configurable + +Each aspect of theming should have a related configurable variable. + + +# Jolly's Design Principles + +## Stability + +## Proximity + +## Sectioning + +## Accessibility + +## Semantic Spaces + +## Semantic Sequences + +## Semantic Thresholds + + From 8bbf831de952b6bd012c1f44c83121ccb3489b4b Mon Sep 17 00:00:00 2001 From: nojhan Date: Sat, 23 Mar 2024 13:24:44 +0100 Subject: [PATCH 19/29] doc(design): more on design. - Move design sketches in /docs/ --- docs/README.md | 100 +++++++++++++++--- .../liquidprompt_dotmatrix_design.odt | Bin .../liquidprompt_dotmatrix_design.svg | 0 3 files changed, 87 insertions(+), 13 deletions(-) rename liquidprompt_dotmatrix_design.odt => docs/liquidprompt_dotmatrix_design.odt (100%) rename liquidprompt_dotmatrix_design.svg => docs/liquidprompt_dotmatrix_design.svg (100%) diff --git a/docs/README.md b/docs/README.md index dc85a68..c2ea1e0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,8 +1,6 @@ # Introduction - - This article is made of two main sections: generic design principles, and Jolly's design principles. @@ -15,8 +13,8 @@ The Jolly's design principles are more or less specific to the Jolly theme. ## What is a Prompt? -There are two kind of computer scientists: those who use the command line, -and those who are retired. Even developers who embrace highly integrated development interfaces have some kind of terminal available in some panel of their IDE. +There are two kind of computer scientists: those who use the command line, and those who are retired. +Even developers who embrace highly integrated development interfaces have some kind of terminal available in some panel of their IDE. Like it or not, the shell is a core part of everyday life for most of the people expecting their computer to work for them. Now the shell actually has access to a lot of information about the computer. @@ -29,7 +27,7 @@ The prompt is this string of characters displayed right in front of the line whe In the most common default configuration, it displays only three pieces of information: the user, the hostname, and the path —`user@hostname:path $ `. -But it can display more! And this is the objective of prompt systems. +But it can display more! And this is the objective of *prompt systems*. Those "prompts" (to be short) actually add a lot of information to this area of the command line. For example, the most common feature is to display the state of the Git repository the user is in. @@ -89,7 +87,7 @@ be obvious to the user, depending on their location on the screen and/or their s Section styling should not overflow on neighbor sections. For instance, given that the terminal is organized as a grid of characters, -the background of two close character will blend. +the background of two close (horizontally or vertically) characters will blend. Therefore, one should maintain a certain degree of contrast between sections that are touching each other but have a different semantics. @@ -125,9 +123,6 @@ always be considered important, as they may drastically alter the workflow of th > while the others are in background-colored sections. -## Seamless - - ## Scoped States that are measured and not directly changed by the user should be hidden by default. @@ -135,6 +130,7 @@ Counters that can fall down to zero should be hidden by default. > In Jolly, *sensors* are hidden by default, while *situation* and *location* > information are always shown, even if set to the default state. +> However, the default states are represented in the smallest possible way, like a single icon. ## Measured @@ -150,23 +146,101 @@ States that rarely change or evolve slowly are less important. ## Configurable -Each aspect of theming should have a related configurable variable. +Each aspect of theming should have a related configuration variable. # Jolly's Design Principles ## Stability -## Proximity +Essential information should ideally be located at the same location on screen, +whatever the displayed states. +New information being shown after a predictable state change should not +change too much the location of information previously displayed. + +> Using four sections allows Jolly to drastically improve the stability of the prompt, +> as opposed to a prompt on a single line. +> The less stable section is the VCS one, which often changes after each command when the user is working on their repository. +> Sections are thus organized from left to right, in decreasing order of stability. +> Jolly always displays important segments, even in their default state, so that they are always located where the user expect them to be. + ## Sectioning -## Accessibility +The prompts having issued the previous commands should be easy to find while the user is scrolling up the terminal. + +> Jolly uses both background-colored sections that are always displayed and a line traversing the whole terminal to separate all command outputs in sections. +> The graphical design of the prompt itself is quite rare in classical commands outputs, making it easy to spot. +> Finding the command that issued the output is as easy as finding the horizontal line. + + +## Proximity + +The more important and/or the more frequently updated information should be displayed the closer to where the user is looking: the prompt cursor. +Related information should be displayed close to each other, especially if there is some semantic meaning linking them. + +If the information is to be displayed far away, a small segment may be used to recall the user that they should look elswhere. + +> In Jolly, the path (one of the —if not *the*— most important information) usually appears on top of the prompt's cursor location. +> Admin privileges is shown on the prompt's mark, right next to the prompt's cursor. +> VCS information is also next to the input area. +> +> The location at the end of the path can display some right-pointing arrows, recalling the user to look at the sensors section, if there are many information displayed there. + + +## Segments + +To implement the *accentuated* principle, Jolly uses background-colored segments of information. +To ease the visual browsing of those segments, it uses the visual separators introduced by the *Powerline* project. + +> While Jolly can theoretically use many of the "powerline" characters as separators, it recommends using the "arrow" one, which fits better the *semantic sequence* principle. -## Semantic Spaces ## Semantic Sequences +Segments are ordered in sequences that have a meaning. +For instance from the more generic to the more specific, from a natural order of action, or from an architecture hierarchy. + +> The first line of Jolly display the classical how-who-where sequence. +> The VCS section displays elements from the more remote to the more local. +> Spaced reverse arrows in the VCS sections actually show the direction of the expected action +> (e.g. "to be pushed" = local-to-remote = right-to-left). + + +## Semantic Spaces + +Jolly makes use of negative spaces between segments to convey information. +This allows for a compact display, and avoid cluttering the screen with icons. + +When displaying something with a space, the direction of the segments are reversed, making them more easy to spot, at no cost. + +It is possible to insert a separator character within a space, to emphasize its importance. + +Spaces are generally used to mean some kind of "disconnected" state. + +> Jolly spaces comes in three levels: simple space (no inserted character), light space (light arrow inserted in the space) and strong space (heavy, colored arrow). +> Jolly uses spaces to indicate the type of network connection (there is no "direct" connection), the fact that the user does not have writing rights (they are "disconnected" from the directory), or the fact that a state has diverged between local and remote. + + +## Semantic Accessibile Colors + +To avoid colorblindness issues, Jolly relies on as few colors as possible, and tries to maximize the contrast between segments. + +The basic display is built of alternating black and white segments, which should be readable on both dark and light terminal backgrounds. + +Important information may be displayed using two other colors: one for information that should be noticed, and one for warnings and errors. + +> Jolly allows the user to select whatever pair of colors fits their colorblindness issues, and comes with several presets. +> Its default is set to blue/yellow, following the most classical recommendation to bypass the most common colorblindness issues. +> The basic segments use tones of dark and light greys with AAA contrast between them, appearing as black and white on many classical terminal backgrounds. + + ## Semantic Thresholds +Qantitative measurements (number of something, sensors, etc.) may be displayed in three states, each of which is associated with a semantic color: +1. below lower threshold: black or white, +2. between lower and higher threshold: *note* color (blue, by default), +3. above higher threshold: *warning* color (yellow, by default). + +> For instance, the number of commits to be pushed, or the number of modified lines in the VCS section are all displayed with this semantics. diff --git a/liquidprompt_dotmatrix_design.odt b/docs/liquidprompt_dotmatrix_design.odt similarity index 100% rename from liquidprompt_dotmatrix_design.odt rename to docs/liquidprompt_dotmatrix_design.odt diff --git a/liquidprompt_dotmatrix_design.svg b/docs/liquidprompt_dotmatrix_design.svg similarity index 100% rename from liquidprompt_dotmatrix_design.svg rename to docs/liquidprompt_dotmatrix_design.svg From 194996ce45a5f65b0cff1c83ee22ce990c8e72b9 Mon Sep 17 00:00:00 2001 From: nojhan Date: Mon, 1 Apr 2024 11:04:43 +0200 Subject: [PATCH 20/29] refactor!: rename theme as "jolly" BREAKING CHANGE: all configuration variables are renamed as `JOLLY_*` instead of `DOTMATRIX_*`. --- Makefile | 2 +- README.md | 160 +- ...sign.odt => liquidprompt_jolly_design.odt} | Bin ...sign.svg => liquidprompt_jolly_design.svg} | 12 +- dotmatrix.theme | 1415 ----------------- jolly.theme | 1415 +++++++++++++++++ ...esign.png => liquidprompt_jolly_design.png | Bin presets/colors-all-blues.conf | 32 +- presets/colors-cyan-magenta.conf | 4 +- presets/colors-green-red.conf | 4 +- presets/colors-high-contrast.conf | 32 +- presets/variant-chevron.conf | 44 +- presets/variant-round.conf | 44 +- presets/variant-slant.conf | 44 +- presets/variant-text.conf | 45 +- 15 files changed, 1626 insertions(+), 1627 deletions(-) rename docs/{liquidprompt_dotmatrix_design.odt => liquidprompt_jolly_design.odt} (100%) rename docs/{liquidprompt_dotmatrix_design.svg => liquidprompt_jolly_design.svg} (99%) delete mode 100644 dotmatrix.theme create mode 100644 jolly.theme rename liquidprompt_dotmatrix_design.png => liquidprompt_jolly_design.png (100%) diff --git a/Makefile b/Makefile index fdac496..f5acd64 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ LP ?= /home/nojhan/code/liquidprompt HEIGHT := 450 -THEME := dotmatrix dotmatrix.theme +THEME := jolly jolly.theme ALL := $(addprefix screenshots/,variant-chevron.png variant-round.png variant-slant.png variant-text.png variant-chevron_colors-cyan-magenta.png variant-chevron_colors-green-red.png variant-chevron_colors-high-contrast.png) diff --git a/README.md b/README.md index c03c422..ee38404 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -DotMatrix — A Liquid Prompt Theme +Jolly — A Liquid Prompt Theme ================================= -DotMatrix is a theme for [Liquid Prompt](https://github.com/nojhan/liquidprompt). +Jolly is a theme for [Liquid Prompt](https://github.com/nojhan/liquidprompt). It is an original prompt design, very carefully designed, that will completely changes the way you imagine the prompt. @@ -21,7 +21,7 @@ Using the (recommended) "chevron" preset: ![](screenshots/variant-chevron.png) -The DotMatrix theme also comes as several variants, changing the shape of the segments separators, +The Jolly theme also comes as several variants, changing the shape of the segments separators, like the "slant" variant: ![](screenshots/variant-slant.png) @@ -32,7 +32,7 @@ Design ### Rationale -The DotMatrix theme use a couple of design principles: +The Jolly theme use a couple of design principles: * It is accessible to colorblind people, hence it uses: * only four colors: dark grey, white, blue and yellow (different color pairs are available as presets for people having blue-yellow colorblindess). @@ -73,18 +73,18 @@ for the default login user ("", a figure), on localhost ("", an island), i ### Full description -The following diagram shows almost all the possible states of a DotMatrix Liquid Prompt +The following diagram shows almost all the possible states of a Jolly Liquid Prompt -![](liquidprompt_dotmatrix_design.png) +![](liquidprompt_jolly_design.png) -The diagram is available [in a vector format](liquidprompt_dotmatrix_design.svg) (note: you need a browser/viewer configured to use a [nerd-font](https://www.nerdfonts.com) to see it correctly). +The diagram is available [in a vector format](liquidprompt_jolly_design.svg) (note: you need a browser/viewer configured to use a [nerd-font](https://www.nerdfonts.com) to see it correctly). Setup ----- -To actually use the DotMatrix theme, you need to add a few configuration commands to the script that loads Liquid Prompt. +To actually use the Jolly theme, you need to add a few configuration commands to the script that loads Liquid Prompt. For example: ```sh @@ -92,14 +92,14 @@ For example: # Load Liquid Prompt. source ~/liquidprompt/liquidprompt # Configure the desired variant (or colors, etc.). - source ~/lp-dotmatrix/presets/variant-chevron.conf + source ~/lp-jolly/presets/variant-chevron.conf # Load the theme. - source ~/lp-dotmatrix/dotmatrix.theme && lp_theme dotmatrix + source ~/lp-jolly/jolly.theme && lp_theme jolly ``` NOTE: The recommended segment markers (the "chevron" variant) uses characters in the private section of unicode that are defined by the "Nerd-fonts" project. -You will either need a compatible font, or use a variant that does not need them, like "text" and "dotmatrix". +You will either need a compatible font, or use a variant that does not need them, like "text" and "jolly". See the [Nerd-fonts Fonts installation docs](https://www.nerdfonts.com) for help on installing this kind of fonts. @@ -129,7 +129,7 @@ Variants needing a Nerd-fonts font: Variants available with a regular font: -- "dotmatrix" (the default): +- "jolly" (the default): ![](screenshots/variant-dots.png) @@ -143,7 +143,7 @@ Configuration ### Liquid Prompt Configuration -The DotMatrix theme honors Liquid Prompt configuration options, +The Jolly theme honors Liquid Prompt configuration options, except for the ones defining colors, specific marks and disabling some features. The following options are honored: @@ -190,7 +190,7 @@ A second set changes the colors: #### High-level -**DOTMATRIX_SPACED** *boolean = 1* +**JOLLY_SPACED** *boolean = 1* If set to false, this flag will configure a compact prompt, showing segments without extra spaces around their joints. @@ -198,85 +198,85 @@ showing segments without extra spaces around their joints. #### Specific features -**DOTMATRIX_VCS_AHEAD_THRESHOLD** *integer = 5* +**JOLLY_VCS_AHEAD_THRESHOLD** *integer = 5* Number of unpushed local commits above which the prompt should use the warning color to display the "push" section. -**DOTMATRIX_VCS_BEHIND_THRESHOLD** *integer = 5* +**JOLLY_VCS_BEHIND_THRESHOLD** *integer = 5* Number of unpulled remote commits above which the prompt should use the warning color to display the "pull" section. -**DOTMATRIX_VCS_DIFF_THRESHOLD** *integer = 300* +**JOLLY_VCS_DIFF_THRESHOLD** *integer = 300* Number of modified lines above which the prompt should use the warning color to display the "commit" section. -**DOTMATRIX_VCS_REMOTE_ORIGIN** *string* = "🖈" +**JOLLY_VCS_REMOTE_ORIGIN** *string* = "🖈" String used as a shorten VCS remote name, if it is "origin". -**DOTMATRIX_DETACHED_THRESHOLD** *integer = 3* +**JOLLY_DETACHED_THRESHOLD** *integer = 3* Number of detached jobs above which the prompt should use the warning color. -**DOTMATRIX_RUNNING_THRESHOLD** *integer = 3* +**JOLLY_RUNNING_THRESHOLD** *integer = 3* Number of running jobs above which the prompt should use the warning color. -**DOTMATRIX_STOPPED_THRESHOLD** *integer = 3* +**JOLLY_STOPPED_THRESHOLD** *integer = 3* Number of stopped jobs above which the prompt should use the warning color. -**DOTMATRIX_BATTERY_THRESHOLD** *integer = $((LP_BATTERY_THRESHOLD/2))* +**JOLLY_BATTERY_THRESHOLD** *integer = $((LP_BATTERY_THRESHOLD/2))* Percentage below which the prompt should use the warning color. -**DOTMATRIX_TEMP_THRESHOLD** *integer = $((LP_TEMP_THRESHOLD*2))* +**JOLLY_TEMP_THRESHOLD** *integer = $((LP_TEMP_THRESHOLD*2))* Temperature above which the prompt should use the warning color. -**DOTMATRIX_LOAD_THRESHOLD** *integer = $((_LP_LOAD_THRESHOLD+(_LP_LOAD_CAP-_LP_LOAD_THRESHOLD)/2))* +**JOLLY_LOAD_THRESHOLD** *integer = $((_LP_LOAD_THRESHOLD+(_LP_LOAD_CAP-_LP_LOAD_THRESHOLD)/2))* Load percentage above which the prompt should use the warning color. -**DOTMATRIX_ENABLE_HISTORY** *boolean = 1* +**JOLLY_ENABLE_HISTORY** *boolean = 1* Enable the history sections displayed on the right side of the middle line. -**DOTMATRIX_HISTORY_MOST_BACK** *integer = 100* +**JOLLY_HISTORY_MOST_BACK** *integer = 100* Number of the last history events to take into account when looking for the most used command. -**DOTMATRIX_HISTORY_LAST_LEN** *integer = $((COLUMNS/4))* +**JOLLY_HISTORY_LAST_LEN** *integer = $((COLUMNS/4))* -Maximum length of the *last* command used (counting the `DOTMATRIX_HISTORY_LAST_LEN_MARK` length). +Maximum length of the *last* command used (counting the `JOLLY_HISTORY_LAST_LEN_MARK` length). -**DOTMATRIX_HISTORY_LAST_LEN_MARK** *integer = "[…]"* +**JOLLY_HISTORY_LAST_LEN_MARK** *integer = "[…]"* Mark to display when the last command string is shortened. -**DOTMATRIX_ENABLE_SHELL** *boolean = 0* +**JOLLY_ENABLE_SHELL** *boolean = 0* Display the current shell in the top-right section. -**DOTMATRIX_SHELL_ZSH** *string = "z"* +**JOLLY_SHELL_ZSH** *string = "z"* The mark indicating a *zsh* shell. -**DOTMATRIX_SHELL_BASH** *string = "b"* +**JOLLY_SHELL_BASH** *string = "b"* The mark indicating a *bash* shell. @@ -285,72 +285,72 @@ The mark indicating a *bash* shell. The following options configure some marks that will be used across all variants of the theme. -**DOTMATRIX_DISPLAY_TEXT** *string = "T"* +**JOLLY_DISPLAY_TEXT** *string = "T"* The marker used to indicates that the shell is in text mode, i.e. that does not have a graphical display (more rigorously: there is no X11 `DISPLAY` environment variable). -**DOTMATRIX_DISPLAY_X11** *string = "X"* +**JOLLY_DISPLAY_X11** *string = "X"* The marker used to indicates that the shell does have access to a graphical server (more rigorously: there is a X11 `DISPLAY` environment variable). -**DOTMATRIX_HOST_LOCAL** *string = "⌂"* +**JOLLY_HOST_LOCAL** *string = "⌂"* The marker used to indicate that the hostname is `localhost`. -**DOTMATRIX_USER_LOCAL** *string = "♟"* +**JOLLY_USER_LOCAL** *string = "♟"* The marker used to indicate that the user is the same than the login one. -**DOTMATRIX_MARK_STASH** *string = "✝"* +**JOLLY_MARK_STASH** *string = "✝"* The marker used to indicate that the VCS stash is not empty. -**DOTMATRIX_MARK_UNTRACKED** *string = "?"* +**JOLLY_MARK_UNTRACKED** *string = "?"* The marker used to indicate that there are some files that are untracked by the VCS in the current repository. -**DOTMATRIX_DIFF** *string = "≠"* +**JOLLY_DIFF** *string = "≠"* The marker used to indicate that there is some change in the VCS state (either changes needed to be committed, or commits needed to be pushed). -**DOTMATRIX_VCS** *string = "╟┘"* +**JOLLY_VCS** *string = "╟┘"* The marker used to indicate that there is a VCS involved in the current directory. -**DOTMATRIX_MARK** *string = "⯀"* +**JOLLY_MARK** *string = "⯀"* The actual prompt marker, right where the user type text. -**DOTMATRIX_MARK_SUDO** *string = "⋮"* +**JOLLY_MARK_SUDO** *string = "⋮"* An additional character displayed before the last prompt mark when the user has sudo rights. -**DOTMATRIX_ENABLE_GRADIENT_LINE** *boolean = 0* +**JOLLY_ENABLE_GRADIENT_LINE** *boolean = 0* If set to 0 (the default), will draw the line of the middle section -as a sequence of `DOTMATRIX_LINE` characters, -using the `DOTMATRIX_COLOR_LINE` color. +as a sequence of `JOLLY_LINE` characters, +using the `JOLLY_COLOR_LINE` color. If set to 1, will draw the same line with a gradient of color -interpolated from `DOTMATRIX_COLOR_LINE_START` -to `DOTMATRIX_COLOR_LINE_END`. +interpolated from `JOLLY_COLOR_LINE_START` +to `JOLLY_COLOR_LINE_END`. -**DOTMATRIX_MARK_ERROR** *string = " "* +**JOLLY_MARK_ERROR** *string = " "* Icon displayed in front of the last exit error code. @@ -360,48 +360,48 @@ Icon displayed in front of the last exit error code. These options are the one used to actually define the theme variants. You may overcome them with your own configuration. -**DOTMATRIX_LINE** *string = "━"* +**JOLLY_LINE** *string = "━"* The character used to draw the middle line. -**DOTMATRIX_PLUG** *string = "▛"* +**JOLLY_PLUG** *string = "▛"* The character for joined segments limits. -**DOTMATRIX_SOFT** *string = "╱"* +**JOLLY_SOFT** *string = "╱"* The character for "soft" separation (e.g. path elements, branch details, jobs, etc.) -**DOTMATRIX_MEAN** *string = "▞"* +**JOLLY_MEAN** *string = "▞"* The character for "mean" separation (used when two segments of the same color are joint). -**DOTMATRIX_LINK** *array = ("▙" " " "▜")* +**JOLLY_LINK** *array = ("▙" " " "▜")* Characters used for showing a small gap. -**DOTMATRIX_OPEN** *array = ("▙" " ▚ " "▜")* +**JOLLY_OPEN** *array = ("▙" " ▚ " "▜")* Characters used for showing a large gap. -**DOTMATRIX_DANG** *array = ("▙" " □ " "▜")* +**JOLLY_DANG** *array = ("▙" " □ " "▜")* Characters used for showing a very lareg gap (i.e. a dangerous state). -**DOTMATRIX_ENDS** *array = ("▛▞▗ ▝" "▖ ▘▞▟")* +**JOLLY_ENDS** *array = ("▛▞▗ ▝" "▖ ▘▞▟")* Characters marking the ends of the right and left parts of the first line. -**DOTMATRIX_ITEMS** *array = ("┫" "┃" "┣")* +**JOLLY_ITEMS** *array = ("┫" "┃" "┣")* Characters used to separate keywords in the middle line. The middle character separates keywords of the same type (e.g. every Software Collection). @@ -411,27 +411,27 @@ The middle character separates keywords of the same type (e.g. every Software Co You may overcome the spacing details with these options. -**DOTMATRIX_SPACE_VOID** *string = " "* +**JOLLY_SPACE_VOID** *string = " "* Spacing character around segments joints marker. -**DOTMATRIX_SPACE_PATH** *string = " "* +**JOLLY_SPACE_PATH** *string = " "* Spacing character specifically for the "current path" section. -**DOTMATRIX_SPACE_FIELD** *string = ""* +**JOLLY_SPACE_FIELD** *string = ""* Spacing character around the content of the segments themselves. -**DOTMATRIX_SPACE_LINE** *string = " "* +**JOLLY_SPACE_LINE** *string = " "* Spacing character around the keywords of the middle line. -**DOTMATRIX_SPACE_FILL** *string = "█"* +**JOLLY_SPACE_FILL** *string = "█"* Spacing character for filled sections. You probably don't want to touch this. @@ -440,91 +440,91 @@ You probably don't want to touch this. #### Colors -**DOTMATRIX_COLOR_DARK** *array = (252 239 0 0 15 0)* +**JOLLY_COLOR_DARK** *array = (252 239 0 0 15 0)* The color of dark segments. -**DOTMATRIX_COLOR_LITE** *array = (239 252 0 0 0 15)* +**JOLLY_COLOR_LITE** *array = (239 252 0 0 0 15)* The color of light segments. -**DOTMATRIX_COLOR_GLOW** *array = ( 0 252 1 0 0 15)* +**JOLLY_COLOR_GLOW** *array = ( 0 252 1 0 0 15)* The color for bright elements. -**DOTMATRIX_COLOR_NOTE** *array = ( 15 33 0 0 15 12)* +**JOLLY_COLOR_NOTE** *array = ( 15 33 0 0 15 12)* The color for notable elements. -**DOTMATRIX_COLOR_WARN** *array = (196 220 1 0 0 11)* +**JOLLY_COLOR_WARN** *array = (196 220 1 0 0 11)* The color for elements related to a warning. -**DOTMATRIX_COLOR_FAIR** *array = ( 0 244 0 0 0 8)* +**JOLLY_COLOR_FAIR** *array = ( 0 244 0 0 0 8)* The color for elements that are not very important. -**DOTMATRIX_COLOR_PATH_SHORT** *array = (252 239 0 0 0 15)* +**JOLLY_COLOR_PATH_SHORT** *array = (252 239 0 0 0 15)* The color of the shorten path marker. -**DOTMATRIX_COLOR_PATH_VCS** *array = (252 239 0 1 0 15)* +**JOLLY_COLOR_PATH_VCS** *array = (252 239 0 1 0 15)* The color of the VCS repository in the path. -**DOTMATRIX_COLOR_PATH_LAST** *array = (15 239 1 0 0 15)* +**JOLLY_COLOR_PATH_LAST** *array = (15 239 1 0 0 15)* The color of the current directory. -**DOTMATRIX_COLOR_LINE** *array = (244 -1 0 0 15 -1)* +**JOLLY_COLOR_LINE** *array = (244 -1 0 0 15 -1)* The color of the middle line. -**DOTMATRIX_COLOR_MARK** *array = (15 -1 0 0 15 -1)* +**JOLLY_COLOR_MARK** *array = (15 -1 0 0 15 -1)* The color of the actual prompt mark. -**DOTMATRIX_COLOR_SEP_DARK** *array = ( 0 -2 0 0 0 -2)* +**JOLLY_COLOR_SEP_DARK** *array = ( 0 -2 0 0 0 -2)* The color for dark separators. -**DOTMATRIX_COLOR_SEP_FAIR** *array = (244 -2 0 0 0 -2)* +**JOLLY_COLOR_SEP_FAIR** *array = (244 -2 0 0 0 -2)* The color for fair separators. -**DOTMATRIX_COLOR_SEP_LITE** *array = ( 15 -2 0 0 15 -2)* +**JOLLY_COLOR_SEP_LITE** *array = ( 15 -2 0 0 15 -2)* The color for light separators. -**DOTMATRIX_COLOR_LINE_START** *array = (255 -1 1 0 15 -1)* +**JOLLY_COLOR_LINE_START** *array = (255 -1 1 0 15 -1)* The color starting the gradient of the line of the middle section. Default is white. -Valus being linearly interpolated up to `DOTMATRIX_COLOR_LINE_END`, +Valus being linearly interpolated up to `JOLLY_COLOR_LINE_END`, it is recommended to stick to aligned ANSI values (i.e. greys) -**DOTMATRIX_COLOR_LINE_END** *array = (232 -1 1 0 15 -1)* +**JOLLY_COLOR_LINE_END** *array = (232 -1 1 0 15 -1)* The color ending the gradient of the line of the middle section. Default is black. -Valus being linearly interpolated from `DOTMATRIX_COLOR_LINE_START`, +Valus being linearly interpolated from `JOLLY_COLOR_LINE_START`, it is recommended to stick to aligned ANSI values (i.e. greys). diff --git a/docs/liquidprompt_dotmatrix_design.odt b/docs/liquidprompt_jolly_design.odt similarity index 100% rename from docs/liquidprompt_dotmatrix_design.odt rename to docs/liquidprompt_jolly_design.odt diff --git a/docs/liquidprompt_dotmatrix_design.svg b/docs/liquidprompt_jolly_design.svg similarity index 99% rename from docs/liquidprompt_dotmatrix_design.svg rename to docs/liquidprompt_jolly_design.svg index 5afd105..58190f3 100644 --- a/docs/liquidprompt_dotmatrix_design.svg +++ b/docs/liquidprompt_jolly_design.svg @@ -8,9 +8,9 @@ width="793.66663" height="725.40625" viewBox="0 0 793.66663 725.40628" - sodipodi:docname="liquidprompt_dotmatrix_design.svg" + sodipodi:docname="liquidprompt_jolly_design.svg" inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" - inkscape:export-filename="/home/nojhan/code/lp-dotmatrix/liquidprompt_dotmatrix_design.png" + inkscape:export-filename="liquidprompt_jolly_design.png" inkscape:export-xdpi="123.86" inkscape:export-ydpi="123.86" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" @@ -41,7 +41,7 @@ inkscape:current-layer="g12" />dotmatrix jolly dotmatrix jolly dotmatrixjolly= 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_VCS_REMOTE_ORIGIN=${DOTMATRIX_VCS_REMOTE_ORIGIN:-"🖈"} - - 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_MARK_SUDO=${DOTMATRIX_MARK_SUDO:-"⋮"} - 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=( 255 239 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_make_header() { - - # 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) - #################################################################### - - _lp_dotmatrix_make_header="" - _lp_dotmatrix_make_header+="${_DOTMATRIX_DISPLAY}" - _lp_dotmatrix_make_header+="${_DOTMATRIX_CONNECTION}" - _lp_dotmatrix_make_header+="${_DOTMATRIX_USER}" - _lp_dotmatrix_make_header+="${_DOTMATRIX_MULTIPLEXER}" - _lp_dotmatrix_make_header+="${_DOTMATRIX_HOSTNAME}" - _lp_dotmatrix_make_header+="${_DOTMATRIX_FS}" - _lp_dotmatrix_make_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[@]}"} - _lp_dotmatrix_make_header+="${dotmatrix_sep}" - __dotmatrix_make_field "$lp_dirstack" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} - _lp_dotmatrix_make_header+="${dotmatrix_field}" - fi -} - -_lp_dotmatrix_make_side() { - - #################################################################### - # HEADER SIDE (RIGHT) - #################################################################### - - local _lp_dotmatrix_has_notes=0 - local _lp_dotmatrix_has_warns=0 - - # DOTMATRIX_COLOR_SEP_FAIR - __dotmatrix_make_sep_side "" - _lp_dotmatrix_make_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}" - _lp_dotmatrix_has_warns=$((_lp_dotmatrix_has_warns+1)) - else - __dotmatrix_make_field "$lp_battery$_LP_PERCENT" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - battery="${dotmatrix_field}${LP_MARK_BATTERY}" - _lp_dotmatrix_has_notes=$((_lp_dotmatrix_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}" - _lp_dotmatrix_has_warns=$((_lp_dotmatrix_has_warns+1)) - else - __dotmatrix_make_field "$lp_load" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - load="${dotmatrix_field}${LP_MARK_LOAD}" - _lp_dotmatrix_has_notes=$((_lp_dotmatrix_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}" - _lp_dotmatrix_has_warns=$((_lp_dotmatrix_has_warns+1)) - else - __dotmatrix_make_field "$lp_ram_perc$_LP_PERCENT" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - ram="${dotmatrix_field}${LP_MARK_RAM}" - _lp_dotmatrix_has_notes=$((_lp_dotmatrix_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}" - _lp_dotmatrix_has_warns=$((_lp_dotmatrix_has_warns+1)) - else - __dotmatrix_make_field "$lp_disk_perc$_LP_PERCENT" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - disk="${dotmatrix_field}${LP_MARK_DISK}" - _lp_dotmatrix_has_notes=$((_lp_dotmatrix_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}" - _lp_dotmatrix_has_warns=$((_lp_dotmatrix_has_warns+1)) - else - __dotmatrix_make_field "$lp_temperature" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - temperature="${dotmatrix_field}${LP_MARK_TEMP}" - _lp_dotmatrix_has_notes=$((_lp_dotmatrix_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. - _lp_dotmatrix_make_side+="${lp_terminal_format}${DOTMATRIX_SPACE_VOID}${lp_join}" - - fi - else - lp_terminal_format ${DOTMATRIX_COLOR_FAIR[@]+"${DOTMATRIX_COLOR_FAIR[@]}"} - _lp_dotmatrix_make_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}" - _lp_dotmatrix_has_warns=$((_lp_dotmatrix_has_warns+1)) - else - __dotmatrix_make_field "${lp_detached_sessions}d" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} - detached_sessions="${dotmatrix_field}" - _lp_dotmatrix_has_notes=$((_lp_dotmatrix_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}" - _lp_dotmatrix_has_warns=$((_lp_dotmatrix_has_warns+1)) - else - __dotmatrix_make_field "${lp_running_jobs}&" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} - running_jobs="${dotmatrix_field}" - _lp_dotmatrix_has_notes=$((_lp_dotmatrix_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}" - _lp_dotmatrix_has_warns=$((_lp_dotmatrix_has_warns+1)) - else - __dotmatrix_make_field "${lp_stopped_jobs}z" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} - stopped_jobs="${dotmatrix_field}" - _lp_dotmatrix_has_notes=$((_lp_dotmatrix_has_notes+1)) - fi - fi - fi - - lp_terminal_format ${DOTMATRIX_COLOR_FAIR[@]+"${DOTMATRIX_COLOR_FAIR[@]}"} - if [[ $_lp_dotmatrix_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 - _lp_dotmatrix_make_side+="${djc_plug}${lp_join}" - fi - else - lp_terminal_format ${DOTMATRIX_COLOR_FAIR[@]+"${DOTMATRIX_COLOR_FAIR[@]}"} - _lp_dotmatrix_make_side+="${lp_terminal_format}" - fi - - # Called here for an easy access to the configured color. - if __dotmatrix_activate_shell ; then - _lp_dotmatrix_make_side+="${_DOTMATRIX_SHELL}" - fi - - # clock - if _lp_time ; then - __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - _lp_dotmatrix_make_side+="${dotmatrix_sep}" - if _lp_analog_time ; then - __dotmatrix_make_field "$lp_analog_time" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - _lp_dotmatrix_make_side+="$dotmatrix_field" - else - __dotmatrix_make_field "$lp_time" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - _lp_dotmatrix_make_side+="$dotmatrix_field" - fi - fi -} - -_lp_dotmatrix_make_env() { - #################################################################### - # 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" - _lp_dotmatrix_make_env_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[@]} - _lp_dotmatrix_make_env_inline_left+="$d${lp_join}$b" - fi - if _lp_software_collections ; then - _lp_dotmatrix_make_env_inline_left+="$d${lp_software_collections}$b" - fi - if _lp_python_env ; then - _lp_dotmatrix_make_env_inline_left+="$d${lp_python_env}$b" - fi - if _lp_node_env ; then - _lp_dotmatrix_make_env_inline_left+="$d${lp_node_env}$b" - fi - if _lp_ruby_env ; then - _lp_dotmatrix_make_env_inline_left+="$d${lp_ruby_env}$b" - fi - if _lp_container ; then - _lp_dotmatrix_make_env_inline_left+="$d${lp_container}$b" - fi - if _lp_kubernetes_context ; then - _lp_dotmatrix_make_env_inline_left+="$d${lp_kubernetes_context}$b" - fi - if _lp_terraform_env ; then - _lp_dotmatrix_make_env_inline_left+="$d${lp_terraform_env}$b" - fi - if _lp_aws_profile ; then - _lp_dotmatrix_make_env_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} - _lp_dotmatrix_make_env_inline_left+="$d${lp_join}$b" - fi - if _lp_container; then - _lp_dotmatrix_make_env_inline_left+="$d$lp_container$b" - fi - if _lp_modules; then - _lp_dotmatrix_make_env_inline_left+="$d" - _lp_join "$I" "${lp_modules[@]}" - _lp_dotmatrix_make_env_inline_left+="${lp_join}$b" - fi - - # History section. - local _lp_dotmatrix_make_env_inline_right= - if _lp_os; then - _lp_join "$I" ${lp_os_arch} ${lp_os_family} ${lp_os_kernel} ${lp_os_distrib} ${lp_os_version} - _lp_dotmatrix_make_env_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" - _lp_dotmatrix_make_env_inline_right="$d${hlast}$I${hmost}$b" - fi -} - -_lp_dotmatrix_make_vcs() { - - _lp_dotmatrix_make_vcs="" - 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[@]}"} - _lp_dotmatrix_make_vcs+="${lp_terminal_format}${LP_MARK_WIFI}" - else - _lp_dotmatrix_make_vcs+="${lp_terminal_format}${LP_MARK_WIFI}" - fi - else - _lp_dotmatrix_make_vcs+="${lp_terminal_format}·" - fi - - if _lp_http_proxy ; then - __dotmatrix_make_sep_link ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} - _lp_dotmatrix_make_vcs+="${dotmatrix_sep}" - else - __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} - _lp_dotmatrix_make_vcs+="${dotmatrix_sep}" - fi - - if __dotmatrix_prompt_vcs; then - _lp_dotmatrix_make_vcs+="${_DOTMATRIX_VCS}" - fi -} - -_lp_dotmatrix_make_input() { - #################################################################### - # PROMPT LINE - #################################################################### - _lp_dotmatrix_make_input= - - 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[@]}"} - _lp_dotmatrix_make_input+="${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[@]}"} - _lp_dotmatrix_make_input+="${dotmatrix_sep}${dotmatrix_field}" - fi - - __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_MARK[@]+"${DOTMATRIX_COLOR_MARK[@]}"} - _lp_dotmatrix_make_input+="${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 - _lp_dotmatrix_make_input+="${mark_color}${DOTMATRIX_MARK}" - done - fi - - # Warning _lp_dotmatrix_make_input 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 - _lp_dotmatrix_make_input+="${lp_terminal_format}${DOTMATRIX_MARK_SUDO}${DOTMATRIX_MARK}" - else - _lp_dotmatrix_make_input+="${mark_color}${DOTMATRIX_MARK}" - fi - - _lp_dotmatrix_make_input+="${NO_COL}" -} - -_lp_dotmatrix_theme_prompt() { - - local header side inline dotmatrix_prompt - - _lp_dotmatrix_make_header - header+="$_lp_dotmatrix_make_header" - - _lp_dotmatrix_make_side - side="$_lp_dotmatrix_make_side" - - # header/side 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 "$_lp_dotmatrix_has_warns" "$_lp_dotmatrix_has_notes" - header+="$dotmatrix_sep" - - # Right-align the $side with spaces. - _lp_fill "$header$NO_COL" "$side" " " - header="$lp_fill${NO_COL}" - - _lp_dotmatrix_make_env - local inline_left="$_lp_dotmatrix_make_env_inline_left" - local inline_right="$_lp_dotmatrix_make_env_inline_right" - - _lp_dotmatrix_inline_right+="${DOTMATRIX_LINE}" - - inline= - # FIXME deprecated - # # 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 "$_lp_dotmatrix_make_env_inline_left" - # local left_as_text="$ret" - # local line_width=$((${COLUMNS:-80}-${#left_as_text})) - - # local line="$_lp_dotmatrix_make_env" - # 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 - - # _lp_dotmatrix_make_env="${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 - - _lp_dotmatrix_make_vcs - dotmatrix_prompt="$_lp_dotmatrix_make_vcs" - - _lp_dotmatrix_make_input - dotmatrix_prompt+="$_lp_dotmatrix_make_input" - - # Assemble and setup - local n=$'\n' - PS1="${n}${header}${n}${inline}${n}${dotmatrix_prompt} " -} - - - -######################################################################## -# DotVector theme -######################################################################## - -_lp_dotvector_theme_activate() { - _lp_dotmatrix_theme_activate -} - -_lp_dotvector_theme_directory() { - _lp_dotmatrix_theme_directory -} - -_lp_dotvector_theme_prompt() { - local header side inline input vcs main - - _lp_dotmatrix_make_header - header+="$_lp_dotmatrix_make_header" - - _lp_dotmatrix_make_side - side="$_lp_dotmatrix_make_side" - - # header/side 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 "$_lp_dotmatrix_has_warns" "$_lp_dotmatrix_has_notes" - header+="$dotmatrix_sep" - - _lp_dotmatrix_make_vcs - - lp_terminal_format -3 -1 - local last_color="$lp_terminal_format" - - lp_terminal_format ${DOTMATRIX_COLOR_LINE[@]} - local line_color="$lp_terminal_format" - lp_terminal_format ${DOTMATRIX_COLOR_LITE[_LP_FIRST_INDEX+0]} -1 0 0 - local before="${line_color}${DOTMATRIX_LINE}${lp_terminal_format}${DOTMATRIX_LINK[_LP_FIRST_INDEX+2]}" - - local after="${DOTMATRIX_SPACE_VOID}${last_color}${DOTMATRIX_LINK_R[_LP_FIRST_INDEX+0]}" - - vcs="${before}${_lp_dotmatrix_make_vcs}${after}" - - # Right-align the $side with spaces. - # _lp_fill "$header$NO_COL" "$side" " " - # header="$lp_fill${NO_COL}" - - _lp_dotmatrix_make_env - local inline_left="$_lp_dotmatrix_make_env_inline_left" - local inline_right="$_lp_dotmatrix_make_env_inline_right" - - _lp_dotmatrix_inline_right+="${DOTMATRIX_LINE}" - - _lp_fill "${header}${vcs}${inline_left}" "${inline_right}${side}" "$DOTMATRIX_LINE" - main="${lp_terminal_format}${lp_fill}${NO_COL}" - - lp_terminal_format ${DOTMATRIX_COLOR_LITE[@]} - local start="${lp_terminal_format}" - - _lp_dotmatrix_make_input - input="$start$_lp_dotmatrix_make_input" - - # Assemble and setup - local n=$'\n' - PS1="${n}${main}${n}${input} " -} - - -######################################################################## -# 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. - if [[ "$lp_vcs_remote" == "origin" ]]; then - lp_vcs_remote="$DOTMATRIX_VCS_REMOTE_ORIGIN" - fi - - # 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_GLOW[@]+"${DOTMATRIX_COLOR_GLOW[@]}"}) - 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_GLOW[@]+"${DOTMATRIX_COLOR_GLOW[@]}"} - _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_plug ${DOTMATRIX_COLOR_GLOW[@]+"${DOTMATRIX_COLOR_GLOW[@]}"} - _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_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - _DOTMATRIX_VCS+="$dotmatrix_field" - fi - if _lp_vcs_tag; then - __dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_DARK[@]+"${DOTMATRIX_COLOR_SEP_DARK[@]}"} - __dotmatrix_make_field "$lp_vcs_tag" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} - _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 - __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} - _DOTMATRIX_VCS+="$dotmatrix_sep" - 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]}" -} - diff --git a/jolly.theme b/jolly.theme new file mode 100644 index 0000000..c8e6a0c --- /dev/null +++ b/jolly.theme @@ -0,0 +1,1415 @@ + +######################################################################## +# API +######################################################################## + +_lp_jolly_theme_activate() { + + if ! _lp_version_greatereq 2 2 0 ; then + _lp_join "." ${_LP_VERSION[@]} + printf "WARNING: the Jolly 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} + + JOLLY_DISPLAY_TEXT=${JOLLY_DISPLAY_TEXT:-"T"} + JOLLY_DISPLAY_X11=${JOLLY_DISPLAY_X11:-"X"} + JOLLY_HOST_LOCAL=${JOLLY_HOST_LOCAL:-"⌂"} + JOLLY_MARK_STASH=${JOLLY_MARK_STASH:-"✝"} + JOLLY_MARK_UNTRACKED=${JOLLY_MARK_UNTRACKED:-"?"} # ⛶ + JOLLY_DIFF=${JOLLY_DIFF:-"≠"} + + JOLLY_ENABLE_GRADIENT_LINE=${JOLLY_ENABLE_GRADIENT_LINE:-0} + JOLLY_ENABLE_SHELL=${JOLLY_ENABLE_SHELL:-0} + + JOLLY_SHELL_ZSH=${JOLLY_SHELL_ZSH:-"z"} + JOLLY_SHELL_BASH=${JOLLY_SHELL_BASH:-"b"} + + JOLLY_VCS_REMOTE_ORIGIN=${JOLLY_VCS_REMOTE_ORIGIN:-"🖈"} + + JOLLY_ENABLE_HISTORY=${JOLLY_ENABLE_HISTORY:-0} + JOLLY_HISTORY_LAST_LEN=${JOLLY_HISTORY_LAST_LEN:-$((COLUMNS/4))} + JOLLY_HISTORY_LAST_LEN_MARK=${JOLLY_HISTORY_LAST_LEN_MARK:-"[…]"} + JOLLY_HISTORY_MOST_BACK=${JOLLY_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/ + JOLLY_VCS_AHEAD_THRESHOLD=${JOLLY_VCS_AHEAD_THRESHOLD:-5} + JOLLY_VCS_BEHIND_THRESHOLD=${JOLLY_VCS_BEHIND_THRESHOLD:-5} + JOLLY_VCS_DIFF_THRESHOLD=${JOLLY_VCS_DIFF_THRESHOLD:-300} + + JOLLY_DETACHED_THRESHOLD=${JOLLY_DETACHED_THRESHOLD:-3} + JOLLY_RUNNING_THRESHOLD=${JOLLY_RUNNING_THRESHOLD:-3} + JOLLY_STOPPED_THRESHOLD=${JOLLY_STOPPED_THRESHOLD:-3} + + JOLLY_BATTERY_THRESHOLD=${JOLLY_BATTERY_THRESHOLD:-$((LP_BATTERY_THRESHOLD/2))} + JOLLY_RAM_THRESHOLD=${JOLLY_RAM_THRESHOLD:-$((LP_RAM_THRESHOLD/2))} + JOLLY_DISK_THRESHOLD=${JOLLY_DISK_THRESHOLD:-$((LP_DISK_THRESHOLD/2))} + JOLLY_TEMP_THRESHOLD=${JOLLY_TEMP_THRESHOLD:-$((LP_TEMP_THRESHOLD*2))} + # Use prefixed _LP_* variables, which are integers. + JOLLY_LOAD_THRESHOLD=${JOLLY_LOAD_THRESHOLD:-$((_LP_LOAD_THRESHOLD+(_LP_LOAD_CAP-_LP_LOAD_THRESHOLD)/2))} + + JOLLY_MARK_ERROR=${JOLLY_MARK_ERROR:-""} + + # Sets of characters + # "dotmatrix" variant by default (non-patched font) + JOLLY_HOST_LOCAL=${JOLLY_HOST_LOCAL:-"⌂"} + JOLLY_USER_LOCAL=${JOLLY_USER_LOCAL:-"♟"} + JOLLY_VCS=${JOLLY_VCS:-"╟┘"} + JOLLY_MARK=${JOLLY_MARK:-"⯀"} + JOLLY_MARK_SUDO=${JOLLY_MARK_SUDO:-"⋮"} + JOLLY_LINE=${JOLLY_LINE:-"━"} + JOLLY_PLUG=${JOLLY_PLUG:-"▛"} + JOLLY_SOFT=${JOLLY_SOFT:-"╱"} + JOLLY_MEAN=${JOLLY_MEAN:-"▞"} + # Separator arrays (left center right) + JOLLY_LINK=( ${JOLLY_LINK[@]+"${JOLLY_LINK[@]}"} ) + [[ ${#JOLLY_LINK[@]} == 0 ]] && JOLLY_LINK=("▙" " " "▜") + JOLLY_LINK_R=( ${JOLLY_LINK_R[@]+"${JOLLY_LINK_R[@]}"} ) + [[ ${#JOLLY_LINK_R[@]} == 0 ]] && JOLLY_LINK_R=("▛" " " "▟") + JOLLY_OPEN=( ${JOLLY_OPEN[@]+"${JOLLY_OPEN[@]}"} ) + [[ ${#JOLLY_OPEN[@]} == 0 ]] && JOLLY_OPEN=("▙" " ▚ " "▜") + JOLLY_DANG=( ${JOLLY_DANG[@]+"${JOLLY_DANG[@]}"} ) + [[ ${#JOLLY_DANG[@]} == 0 ]] && JOLLY_DANG=("▙" " □ " "▜") + JOLLY_ENDS=( ${JOLLY_ENDS[@]+"${JOLLY_ENDS[@]}"} ) + [[ ${#JOLLY_ENDS[@]} == 0 ]] && JOLLY_ENDS=("▛" "▞▗ ▝" "▖ ▘▞▟") + JOLLY_ITEMS=( ${JOLLY_ITEMS[@]+"${JOLLY_ITEMS[@]}"} ) + [[ ${#JOLLY_ITEMS[@]} == 0 ]] && JOLLY_ITEMS=("┫" "┃" "┣") + + JOLLY_SPACED=${JOLLY_SPACED:-1} + + # Number of spaces to add + if [[ ${JOLLY_SPACED} == 0 ]] ; then + JOLLY_SPACE_VOID="" + JOLLY_SPACE_FILL="" + JOLLY_SPACE_PATH=${JOLLY_SPACE_PATH:-""} + JOLLY_SPACE_FIELD=${JOLLY_SPACE_FIELD:-""} + JOLLY_SPACE_LINE=${JOLLY_SPACE_LINE:-""} + + elif [[ ${JOLLY_SPACED} == 1 ]] ; then + JOLLY_SPACE_VOID=" " + JOLLY_SPACE_FILL="█" + JOLLY_SPACE_PATH=${JOLLY_SPACE_PATH:-" "} + JOLLY_SPACE_FIELD=${JOLLY_SPACE_FIELD:-""} + JOLLY_SPACE_LINE=${JOLLY_SPACE_LINE:-" "} + else + local n="${JOLLY_SPACED:-1}" + [[ $n -lt 0 ]] && n=1 + local i + JOLLY_SPACE_VOID="" + JOLLY_SPACE_FILL="" + for ((i=0; i < n; i++)); do + JOLLY_SPACE_VOID+=" " # Regular space + JOLLY_SPACE_FILL+="█" # Inverted space + done + + JOLLY_SPACE_PATH=${JOLLY_SPACE_PATH:-"${JOLLY_SPACE_VOID}"} + JOLLY_SPACE_FIELD=${JOLLY_SPACE_FIELD:-""} + JOLLY_SPACE_LINE=${JOLLY_SPACE_LINE:-""} + fi + + + # Color arrays defaults fg bg b u ffg fbg + JOLLY_COLOR_DARK=( ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} ) + [[ ${#JOLLY_COLOR_DARK[@]} == 0 ]] && JOLLY_COLOR_DARK=(252 239 0 0 15 0) + + JOLLY_COLOR_LITE=( ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} ) + [[ ${#JOLLY_COLOR_LITE[@]} == 0 ]] && JOLLY_COLOR_LITE=(239 252 0 0 0 15) + + JOLLY_COLOR_GLOW=( ${JOLLY_COLOR_GLOW[@]+"${JOLLY_COLOR_GLOW[@]}"} ) + [[ ${#JOLLY_COLOR_GLOW[@]} == 0 ]] && JOLLY_COLOR_GLOW=( 255 239 1 0 0 15) + + JOLLY_COLOR_NOTE=( ${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"} ) + [[ ${#JOLLY_COLOR_NOTE[@]} == 0 ]] && JOLLY_COLOR_NOTE=( 15 33 0 0 15 12) + + JOLLY_COLOR_WARN=( ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} ) + [[ ${#JOLLY_COLOR_WARN[@]} == 0 ]] && JOLLY_COLOR_WARN=(196 220 1 0 0 11) + + JOLLY_COLOR_FAIR=( ${JOLLY_COLOR_FAIR[@]+"${JOLLY_COLOR_FAIR[@]}"} ) + [[ ${#JOLLY_COLOR_FAIR[@]} == 0 ]] && JOLLY_COLOR_FAIR=( 0 239 1 0 0 8) + + + JOLLY_COLOR_PATH_SHORT=( ${JOLLY_COLOR_PATH_SHORT[@]+"${JOLLY_COLOR_PATH_SHORT[@]}"} ) + [[ ${#JOLLY_COLOR_PATH_SHORT[@]} == 0 ]] && JOLLY_COLOR_PATH_SHORT=(252 239 0 0 0 15) + + JOLLY_COLOR_PATH_VCS=( ${JOLLY_COLOR_PATH_VCS[@]+"${JOLLY_COLOR_PATH_VCS[@]}"} ) + [[ ${#JOLLY_COLOR_PATH_VCS[@]} == 0 ]] && JOLLY_COLOR_PATH_VCS=(252 239 0 1 0 15) + + JOLLY_COLOR_PATH_LAST=( ${JOLLY_COLOR_PATH_LAST[@]+"${JOLLY_COLOR_PATH_LAST[@]}"} ) + [[ ${#JOLLY_COLOR_PATH_LAST[@]} == 0 ]] && JOLLY_COLOR_PATH_LAST=(15 239 1 0 0 15) + + + JOLLY_COLOR_LINE=( ${JOLLY_COLOR_LINE[@]+"${JOLLY_COLOR_LINE[@]}"} ) + [[ ${#JOLLY_COLOR_LINE[@]} == 0 ]] && JOLLY_COLOR_LINE=(244 -1 0 0 15 -1) + + JOLLY_COLOR_LINE_START=( ${JOLLY_COLOR_LINE_START[@]+"${JOLLY_COLOR_LINE_START[@]}"} ) + [[ ${#JOLLY_COLOR_LINE_START[@]} == 0 ]] && JOLLY_COLOR_LINE_START=(255 -1 1 0 15 -1) + + JOLLY_COLOR_LINE_END=( ${JOLLY_COLOR_LINE_END[@]+"${JOLLY_COLOR_LINE_END[@]}"} ) + [[ ${#JOLLY_COLOR_LINE_END[@]} == 0 ]] && JOLLY_COLOR_LINE_END=(232 -1 1 0 15 -1) + + + JOLLY_COLOR_MARK=( ${JOLLY_COLOR_MARK[@]+"${JOLLY_COLOR_MARK[@]}"} ) + [[ ${#JOLLY_COLOR_MARK[@]} == 0 ]] && JOLLY_COLOR_MARK=(15 -1 0 0 15 -1) + + JOLLY_COLOR_SEP_DARK=( ${JOLLY_COLOR_SEP_DARK[@]+"${JOLLY_COLOR_SEP_DARK[@]}"} ) + [[ ${#JOLLY_COLOR_SEP_DARK[@]} == 0 ]] && JOLLY_COLOR_SEP_DARK=( 0 -2 0 0 0 -2) + + JOLLY_COLOR_SEP_FAIR=( ${JOLLY_COLOR_SEP_FAIR[@]+"${JOLLY_COLOR_SEP_FAIR[@]}"} ) + [[ ${#JOLLY_COLOR_SEP_FAIR[@]} == 0 ]] && JOLLY_COLOR_SEP_FAIR=(244 -2 0 0 0 -2) + + JOLLY_COLOR_SEP_LITE=( ${JOLLY_COLOR_SEP_LITE[@]+"${JOLLY_COLOR_SEP_LITE[@]}"} ) + [[ ${#JOLLY_COLOR_SEP_LITE[@]} == 0 ]] && JOLLY_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 "${JOLLY_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 ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + local l1="$lp_terminal_format" + lp_terminal_format ${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"} + local l2="$lp_terminal_format" + lp_terminal_format ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + local l3="$lp_terminal_format" + LP_COLORMAP=( + "" # l0 + "$l1" + "$l2" + "$l3" + ) + # fi + + __jolly_activate_display + # __jolly_activate_shell + __jolly_activate_connection + __jolly_activate_user + __jolly_activate_multiplexer + __jolly_activate_hostname +} + + +_lp_jolly_theme_directory() { + lp_terminal_format ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + __jolly_directory_FS + __jolly_directory_path +} + + +_lp_jolly_make_header() { + + # 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) + #################################################################### + + _lp_jolly_make_header="" + _lp_jolly_make_header+="${_JOLLY_DISPLAY}" + _lp_jolly_make_header+="${_JOLLY_CONNECTION}" + _lp_jolly_make_header+="${_JOLLY_USER}" + _lp_jolly_make_header+="${_JOLLY_MULTIPLEXER}" + _lp_jolly_make_header+="${_JOLLY_HOSTNAME}" + _lp_jolly_make_header+="${_JOLLY_FS}" + _lp_jolly_make_header+="${_JOLLY_PATH} " + + if _lp_dirstack; then + # Pseudo-recall the path section format. + lp_terminal_format ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + __jolly_make_sep_plug ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _lp_jolly_make_header+="${jolly_sep}" + __jolly_make_field "$lp_dirstack" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _lp_jolly_make_header+="${jolly_field}" + fi +} + +_lp_jolly_make_side() { + + #################################################################### + # HEADER SIDE (RIGHT) + #################################################################### + + local _lp_jolly_has_notes=0 + local _lp_jolly_has_warns=0 + + # JOLLY_COLOR_SEP_FAIR + __jolly_make_sep_side "" + _lp_jolly_make_side="${jolly_sep}" + + # battery / load / temperature + local battery= + if _lp_battery_color ; then + if [[ $lp_battery -le "$JOLLY_BATTERY_THRESHOLD" ]]; then + __jolly_make_field "$lp_battery$_LP_PERCENT" ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + battery="${jolly_field}${LP_MARK_BATTERY}" + _lp_jolly_has_warns=$((_lp_jolly_has_warns+1)) + else + __jolly_make_field "$lp_battery$_LP_PERCENT" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + battery="${jolly_field}${LP_MARK_BATTERY}" + _lp_jolly_has_notes=$((_lp_jolly_has_notes+1)) + fi + fi + + local load= + if _lp_load_color ; then + if [[ $lp_load_adjusted -ge "$JOLLY_LOAD_THRESHOLD" ]]; then + __jolly_make_field "$lp_load" ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + load="${jolly_field}${LP_MARK_LOAD}" + _lp_jolly_has_warns=$((_lp_jolly_has_warns+1)) + else + __jolly_make_field "$lp_load" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + load="${jolly_field}${LP_MARK_LOAD}" + _lp_jolly_has_notes=$((_lp_jolly_has_notes+1)) + fi + fi + + local ram= + if _lp_ram_color ; then + if [[ $lp_ram_perc -le "$JOLLY_RAM_THRESHOLD" ]]; then + __jolly_make_field "$lp_ram_perc$_LP_PERCENT" ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + ram="${jolly_field}${LP_MARK_RAM}" + _lp_jolly_has_warns=$((_lp_jolly_has_warns+1)) + else + __jolly_make_field "$lp_ram_perc$_LP_PERCENT" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + ram="${jolly_field}${LP_MARK_RAM}" + _lp_jolly_has_notes=$((_lp_jolly_has_notes+1)) + fi + fi + + local disk= + if _lp_disk_color ; then + if [[ $lp_disk_perc -le "$JOLLY_DISK_THRESHOLD" ]]; then + __jolly_make_field "$lp_disk_perc$_LP_PERCENT" ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + disk="${jolly_field}${LP_MARK_DISK}" + _lp_jolly_has_warns=$((_lp_jolly_has_warns+1)) + else + __jolly_make_field "$lp_disk_perc$_LP_PERCENT" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + disk="${jolly_field}${LP_MARK_DISK}" + _lp_jolly_has_notes=$((_lp_jolly_has_notes+1)) + fi + fi + + local temperature= + if _lp_temperature_color ; then + if [[ $lp_temperature -ge "$JOLLY_TEMP_THRESHOLD" ]]; then + __jolly_make_field "$lp_temperature" ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + temperature="${jolly_field}${LP_MARK_TEMP}" + _lp_jolly_has_warns=$((_lp_jolly_has_warns+1)) + else + __jolly_make_field "$lp_temperature" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + temperature="${jolly_field}${LP_MARK_TEMP}" + _lp_jolly_has_notes=$((_lp_jolly_has_notes+1)) + fi + fi + + __jolly_make_sep_soft ${JOLLY_COLOR_SEP_DARK[@]+"${JOLLY_COLOR_SEP_DARK[@]}"} + declare -a blt=($battery $load $ram $disk $temperature) # Unquoted on purpose. + if [[ ${#blt[@]} -gt 0 ]] ; then + _lp_join "$jolly_sep" ${blt[@]} + if [[ -n "$lp_join" ]] ; then + + # Match the side sep + local fg="${JOLLY_COLOR_SEP_FAIR[0]}" + local ffg="${JOLLY_COLOR_SEP_FAIR[4]}" + lp_terminal_format "$fg" -2 0 0 "$ffg" -2 + # No space before sep. + _lp_jolly_make_side+="${lp_terminal_format}${JOLLY_SPACE_VOID}${lp_join}" + + fi + else + lp_terminal_format ${JOLLY_COLOR_FAIR[@]+"${JOLLY_COLOR_FAIR[@]}"} + _lp_jolly_make_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 "${JOLLY_DETACHED_THRESHOLD}" ]]; then + __jolly_make_field "${lp_detached_sessions}d" ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + detached_sessions="${jolly_field}" + _lp_jolly_has_warns=$((_lp_jolly_has_warns+1)) + else + __jolly_make_field "${lp_detached_sessions}d" ${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"} + detached_sessions="${jolly_field}" + _lp_jolly_has_notes=$((_lp_jolly_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 "${JOLLY_RUNNING_THRESHOLD}" ]]; then + __jolly_make_field "${lp_running_jobs}&" ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + running_jobs="${jolly_field}" + _lp_jolly_has_warns=$((_lp_jolly_has_warns+1)) + else + __jolly_make_field "${lp_running_jobs}&" ${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"} + running_jobs="${jolly_field}" + _lp_jolly_has_notes=$((_lp_jolly_has_notes+1)) + fi + fi + + if [[ -n "${lp_stopped_jobs}" && "${lp_stopped_jobs}" -gt 0 ]] ; then + if [[ "${lp_stopped_jobs}" -ge "${JOLLY_STOPPED_THRESHOLD}" ]]; then + __jolly_make_field "${lp_stopped_jobs}z" ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + stopped_jobs="${jolly_field}" + _lp_jolly_has_warns=$((_lp_jolly_has_warns+1)) + else + __jolly_make_field "${lp_stopped_jobs}z" ${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"} + stopped_jobs="${jolly_field}" + _lp_jolly_has_notes=$((_lp_jolly_has_notes+1)) + fi + fi + fi + + lp_terminal_format ${JOLLY_COLOR_FAIR[@]+"${JOLLY_COLOR_FAIR[@]}"} + if [[ $_lp_jolly_has_warns -gt 0 ]]; then + __jolly_make_sep_plug ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + else + __jolly_make_sep_plug ${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"} + fi + local djc_plug="${jolly_sep}" + + __jolly_make_sep_soft ${JOLLY_COLOR_SEP_LITE[@]+"${JOLLY_COLOR_SEP_LITE[@]}"} + declare -a drs=($detached_sessions $running_jobs $stopped_jobs) # Unquoted on purpose. + if [[ ${#drs[@]} -gt 0 ]] ; then + _lp_join "$jolly_sep" "${drs[@]}" + if [[ -n "$lp_join" ]] ; then + _lp_jolly_make_side+="${djc_plug}${lp_join}" + fi + else + lp_terminal_format ${JOLLY_COLOR_FAIR[@]+"${JOLLY_COLOR_FAIR[@]}"} + _lp_jolly_make_side+="${lp_terminal_format}" + fi + + # Called here for an easy access to the configured color. + if __jolly_activate_shell ; then + _lp_jolly_make_side+="${_JOLLY_SHELL}" + fi + + # clock + if _lp_time ; then + __jolly_make_sep_plug ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + _lp_jolly_make_side+="${jolly_sep}" + if _lp_analog_time ; then + __jolly_make_field "$lp_analog_time" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + _lp_jolly_make_side+="$jolly_field" + else + __jolly_make_field "$lp_time" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + _lp_jolly_make_side+="$jolly_field" + fi + fi +} + +_lp_jolly_make_env() { + #################################################################### + # 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 ${JOLLY_COLOR_LINE[@]+"${JOLLY_COLOR_LINE[@]}"} + color_line_start="$lp_terminal_format" + _lp_jolly_make_env_inline_left="${NO_COL}$LP_PS1_PREFIX${lp_terminal_format}${JOLLY_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}${JOLLY_ITEMS[ista]}${JOLLY_SPACE_LINE}" + local I="${color_line_start}${JOLLY_SPACE_LINE}${JOLLY_ITEMS[imid]}${JOLLY_SPACE_LINE}" + local b="${color_line_start}${JOLLY_SPACE_LINE}${JOLLY_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[@]} + _lp_jolly_make_env_inline_left+="$d${lp_join}$b" + fi + if _lp_software_collections ; then + _lp_jolly_make_env_inline_left+="$d${lp_software_collections}$b" + fi + if _lp_python_env ; then + _lp_jolly_make_env_inline_left+="$d${lp_python_env}$b" + fi + if _lp_node_env ; then + _lp_jolly_make_env_inline_left+="$d${lp_node_env}$b" + fi + if _lp_ruby_env ; then + _lp_jolly_make_env_inline_left+="$d${lp_ruby_env}$b" + fi + if _lp_container ; then + _lp_jolly_make_env_inline_left+="$d${lp_container}$b" + fi + if _lp_kubernetes_context ; then + _lp_jolly_make_env_inline_left+="$d${lp_kubernetes_context}$b" + fi + if _lp_terraform_env ; then + _lp_jolly_make_env_inline_left+="$d${lp_terraform_env}$b" + fi + if _lp_aws_profile ; then + _lp_jolly_make_env_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} + _lp_jolly_make_env_inline_left+="$d${lp_join}$b" + fi + if _lp_container; then + _lp_jolly_make_env_inline_left+="$d$lp_container$b" + fi + if _lp_modules; then + _lp_jolly_make_env_inline_left+="$d" + _lp_join "$I" "${lp_modules[@]}" + _lp_jolly_make_env_inline_left+="${lp_join}$b" + fi + + # History section. + local _lp_jolly_make_env_inline_right= + if _lp_os; then + _lp_join "$I" ${lp_os_arch} ${lp_os_family} ${lp_os_kernel} ${lp_os_distrib} ${lp_os_version} + _lp_jolly_make_env_inline_right+="$d${lp_join}$b" + fi + if ((JOLLY_ENABLE_HISTORY)) ; then + local hist_max + hist_max=$((JOLLY_HISTORY_LAST_LEN-${#JOLLY_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]}${JOLLY_HISTORY_LAST_LEN_MARK}" + else # bash + hist_last="${hist_last:0:$hist_max}${JOLLY_HISTORY_LAST_LEN_MARK}" + fi + fi + local hist_most + hist_most=$(history | tail -n "${JOLLY_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" + _lp_jolly_make_env_inline_right="$d${hlast}$I${hmost}$b" + fi +} + +_lp_jolly_make_vcs() { + + _lp_jolly_make_vcs="" + lp_terminal_format ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + + if (( LP_ENABLE_WIFI_STRENGTH )) ; then + if _lp_wifi_signal_strength ; then + lp_terminal_format ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + _lp_jolly_make_vcs+="${lp_terminal_format}${LP_MARK_WIFI}" + else + _lp_jolly_make_vcs+="${lp_terminal_format}${LP_MARK_WIFI}" + fi + else + _lp_jolly_make_vcs+="${lp_terminal_format}·" + fi + + if _lp_http_proxy ; then + __jolly_make_sep_link ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _lp_jolly_make_vcs+="${jolly_sep}" + else + __jolly_make_sep_plug ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _lp_jolly_make_vcs+="${jolly_sep}" + fi + + if __jolly_prompt_vcs; then + _lp_jolly_make_vcs+="${_JOLLY_VCS}" + fi +} + +_lp_jolly_make_input() { + #################################################################### + # PROMPT LINE + #################################################################### + _lp_jolly_make_input= + + if _lp_runtime_format ; then + __jolly_make_sep_plug ${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"} + __jolly_make_field "${lp_runtime_format}" ${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"} + _lp_jolly_make_input+="${jolly_sep}${jolly_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 + __jolly_make_sep_link ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + __jolly_make_field "${JOLLY_MARK_ERROR}${JOLLY_SPACE_VOID}${error_msg}" ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + _lp_jolly_make_input+="${jolly_sep}${jolly_field}" + fi + + __jolly_make_sep_plug ${JOLLY_COLOR_MARK[@]+"${JOLLY_COLOR_MARK[@]}"} + _lp_jolly_make_input+="${jolly_sep}" + lp_terminal_format ${JOLLY_COLOR_MARK[@]+"${JOLLY_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 + _lp_jolly_make_input+="${mark_color}${JOLLY_MARK}" + done + fi + + # Warning _lp_jolly_make_input 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="${JOLLY_COLOR_WARN[_LP_FIRST_INDEX+1]}" + [[ -z $dcwfg ]] && dcwfg=-1 + lp_terminal_format $dcwfg + _lp_jolly_make_input+="${lp_terminal_format}${JOLLY_MARK_SUDO}${JOLLY_MARK}" + else + _lp_jolly_make_input+="${mark_color}${JOLLY_MARK}" + fi + + _lp_jolly_make_input+="${NO_COL}" +} + +_lp_jolly_theme_prompt() { + + local header side inline jolly_prompt + + _lp_jolly_make_header + header+="$_lp_jolly_make_header" + + _lp_jolly_make_side + side="$_lp_jolly_make_side" + + # header/side assembling + if _lp_dirstack; then + lp_terminal_format ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + else + # Recall a dark format to correctly reset sections history + # to match the path's section colors. + lp_terminal_format ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + fi + + __jolly_make_sep_last "$_lp_jolly_has_warns" "$_lp_jolly_has_notes" + header+="$jolly_sep" + + # Right-align the $side with spaces. + _lp_fill "$header$NO_COL" "$side" " " + header="$lp_fill${NO_COL}" + + _lp_jolly_make_env + local inline_left="$_lp_jolly_make_env_inline_left" + local inline_right="$_lp_jolly_make_env_inline_right" + + _lp_jolly_inline_right+="${JOLLY_LINE}" + + inline= + # FIXME deprecated + # # FIXME use _lp_fill-like function to handle multi-character line? + # if ((JOLLY_ENABLE_GRADIENT_LINE)); then + # # Fill up the center section with a line colored as a gradient. + # local ret + # __lp_strip_escapes "$_lp_jolly_make_env_inline_left" + # local left_as_text="$ret" + # local line_width=$((${COLUMNS:-80}-${#left_as_text})) + + # local line="$_lp_jolly_make_env" + # 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="${JOLLY_COLOR_LINE_START[c]}" + # b="${JOLLY_COLOR_LINE_END[c]}" + # j=$((a+(b-a)*i/line_width)) + # dash_colors+=("$j") + # done + # lp_terminal_format "${dash_colors[@]}" + # line+="${lp_terminal_format}${JOLLY_LINE}" + # # line+="${lp_terminal_format}${i}(${dash_colors[@]}) " + # done + + # _lp_jolly_make_env="${line}${NO_COL}" + + # else + # Fill up the remaining space with a fixed-color line. + _lp_fill "$inline_left" "$inline_right" "$JOLLY_LINE" + # Format here is JOLLY_COLOR_LINE. + inline="${lp_terminal_format}${lp_fill}${NO_COL}" + # fi + + _lp_jolly_make_vcs + jolly_prompt="$_lp_jolly_make_vcs" + + _lp_jolly_make_input + jolly_prompt+="$_lp_jolly_make_input" + + # Assemble and setup + local n=$'\n' + PS1="${n}${header}${n}${inline}${n}${jolly_prompt} " +} + + + +######################################################################## +# DotVector theme +######################################################################## + +_lp_dotvector_theme_activate() { + _lp_jolly_theme_activate +} + +_lp_dotvector_theme_directory() { + _lp_jolly_theme_directory +} + +_lp_dotvector_theme_prompt() { + local header side inline input vcs main + + _lp_jolly_make_header + header+="$_lp_jolly_make_header" + + _lp_jolly_make_side + side="$_lp_jolly_make_side" + + # header/side assembling + if _lp_dirstack; then + lp_terminal_format ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + else + # Recall a dark format to correctly reset sections history + # to match the path's section colors. + lp_terminal_format ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + fi + + __jolly_make_sep_last "$_lp_jolly_has_warns" "$_lp_jolly_has_notes" + header+="$jolly_sep" + + _lp_jolly_make_vcs + + lp_terminal_format -3 -1 + local last_color="$lp_terminal_format" + + lp_terminal_format ${JOLLY_COLOR_LINE[@]} + local line_color="$lp_terminal_format" + lp_terminal_format ${JOLLY_COLOR_LITE[_LP_FIRST_INDEX+0]} -1 0 0 + local before="${line_color}${JOLLY_LINE}${lp_terminal_format}${JOLLY_LINK[_LP_FIRST_INDEX+2]}" + + local after="${JOLLY_SPACE_VOID}${last_color}${JOLLY_LINK_R[_LP_FIRST_INDEX+0]}" + + vcs="${before}${_lp_jolly_make_vcs}${after}" + + # Right-align the $side with spaces. + # _lp_fill "$header$NO_COL" "$side" " " + # header="$lp_fill${NO_COL}" + + _lp_jolly_make_env + local inline_left="$_lp_jolly_make_env_inline_left" + local inline_right="$_lp_jolly_make_env_inline_right" + + _lp_jolly_inline_right+="${JOLLY_LINE}" + + _lp_fill "${header}${vcs}${inline_left}" "${inline_right}${side}" "$JOLLY_LINE" + main="${lp_terminal_format}${lp_fill}${NO_COL}" + + lp_terminal_format ${JOLLY_COLOR_LITE[@]} + local start="${lp_terminal_format}" + + _lp_jolly_make_input + input="$start$_lp_jolly_make_input" + + # Assemble and setup + local n=$'\n' + PS1="${n}${main}${n}${input} " +} + + +######################################################################## +# Functions called at "activate" stage. +######################################################################## + +__jolly_activate_display() { + if _lp_connected_display ; then + __jolly_make_field "$JOLLY_DISPLAY_X11" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _JOLLY_DISPLAY="$jolly_field" + else + __jolly_make_field "$JOLLY_DISPLAY_TEXT" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + _JOLLY_DISPLAY="$jolly_field" + fi +} + +__jolly_activate_shell() { + ((JOLLY_ENABLE_SHELL)) || return 2 + + if ((_LP_SHELL_zsh)) ; then + __jolly_make_sep_plug ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + __jolly_make_field "$JOLLY_SHELL_ZSH" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + _JOLLY_SHELL="${jolly_sep}${jolly_field}" + else + __jolly_make_sep_plug ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + __jolly_make_field "$JOLLY_SHELL_BASH" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _JOLLY_SHELL="${jolly_sep}${jolly_field}" + fi +} + + +__jolly_activate_connection() { + _lp_user + user_type="$?" + local user_color + case "$user_type" in + 0) # logged-in user + user_color=(${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"}) + ;; + 1) # other user + user_color=(${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"}) + ;; + 2) # root + user_color=(${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"}) + ;; + esac + + + local connection + _lp_connection + case "$lp_connection" in + lcl) + __jolly_make_sep_plug "${user_color[@]}" + connection="${jolly_sep}" + ;; + su) + __jolly_make_sep_link "${user_color[@]}" + connection="${jolly_sep}" + ;; + ssh) + __jolly_make_sep_open "${user_color[@]}" + connection="${jolly_sep}" + ;; + tel) + __jolly_make_sep_dang "${user_color[@]}" + connection="${jolly_sep}" + ;; + *) + __jolly_make_sep_plug "${user_color[@]}" + connection="${jolly_sep}" + ;; + esac + + _JOLLY_CONNECTION="${connection}" +} + + +__jolly_activate_user() { + _lp_user + user_type="$?" + case "$user_type" in + 0) # logged-in user + if [[ -z $lp_username ]] ; then # Honors LP_USER_ALWAYS + __jolly_make_field "$JOLLY_USER_LOCAL" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + _JOLLY_USER="$jolly_field" + else + __jolly_make_field "$lp_username" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + _JOLLY_USER="$jolly_field" + fi + ;; + 1) # other user + _lp_username_color + __jolly_make_field "$lp_username_color" ${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"} + _JOLLY_USER="$jolly_field" + ;; + 2) # root + _lp_username + __jolly_make_field "$lp_username" ${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"} + _JOLLY_USER="$jolly_field" + ;; + esac + return $user_type +} + + +__jolly_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+="${JOLLY_HOST_LOCAL}" + ;; + esac + else + hostname="${JOLLY_HOST_LOCAL}" + fi + + __jolly_make_field "$hostname" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _JOLLY_HOSTNAME="${jolly_field}" +} + + +__jolly_activate_multiplexer() { + local lp_multiplexer multiplexer + if _lp_multiplexer ; then + case "$lp_multiplexer" in + tmux) + __jolly_make_sep_link ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + multiplexer="${jolly_sep}" + ;; + screen) + __jolly_make_sep_link ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + multiplexer="${jolly_sep}" + ;; + *) + __jolly_make_sep_link ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + multiplexer="${jolly_sep}" + ;; + esac + else + __jolly_make_sep_plug ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + multiplexer="${jolly_sep}" + fi + + _JOLLY_MULTIPLEXER="${multiplexer}" +} + + +######################################################################## +# Functions called at directory change. +######################################################################## + +__jolly_directory_FS() { + local fs= + if (( LP_ENABLE_PERM )); then + if _lp_chroot ; then + if [[ -w "$PWD" ]]; then + __jolly_make_sep_open ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + fs="$jolly_sep" + else + __jolly_make_sep_dang ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + fs="$jolly_sep" + fi + else + if [[ -w "$PWD" ]]; then + __jolly_make_sep_plug ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + fs="$jolly_sep" + else + __jolly_make_sep_link ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + fs="$jolly_sep" + fi + fi + fi + _JOLLY_FS="$fs" +} + + +__jolly_directory_path() { + local lp_terminal_format + + lp_terminal_format ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + local path_format="${lp_terminal_format}" + + lp_terminal_format ${JOLLY_COLOR_SEP_DARK[@]+"${JOLLY_COLOR_SEP_DARK[@]}"} + local separator_format=$lp_terminal_format + + lp_terminal_format ${JOLLY_COLOR_PATH_SHORT[@]+"${JOLLY_COLOR_PATH_SHORT[@]}"} + local shortened_format=$lp_terminal_format + + lp_terminal_format ${JOLLY_COLOR_PATH_VCS[@]+"${JOLLY_COLOR_PATH_VCS[@]}"} + local vcs_format=$lp_terminal_format + + lp_terminal_format ${JOLLY_COLOR_PATH_LAST[@]+"${JOLLY_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" \ + "${JOLLY_SPACE_PATH}${JOLLY_SOFT}${JOLLY_SPACE_PATH}" "$separator_format" + + _JOLLY_PATH=${lp_path_format} +} + + +######################################################################## +# Functions called at jolly_prompt update. +######################################################################## + +__jolly_prompt_vcs() { + if _lp_find_vcs ; then + declare -a color color_behind color_ahead + + _lp_smart_mark + + _JOLLY_VCS="" + + # Mark & commits off remote + if _lp_vcs_commits_off_remote; then # There is remote-space-[local]. + _lp_vcs_remote # Get remote name. + if [[ "$lp_vcs_remote" == "origin" ]]; then + lp_vcs_remote="$JOLLY_VCS_REMOTE_ORIGIN" + fi + + # Remote segment. + if [[ "$lp_vcs_commit_behind" -ne "0" ]]; then # NOTE remote segment. + if [[ "$lp_vcs_commit_behind" -ge "${JOLLY_VCS_BEHIND_THRESHOLD}" ]]; then + color_behind=(${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"}) + else + color_behind=(${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"}) + fi + if (( LP_ENABLE_VCS_DIFFSTATS )) ; then + __jolly_make_field "${lp_smart_mark}" "${color_behind[@]}" + _JOLLY_VCS+="$jolly_field" + __jolly_make_sep_soft ${JOLLY_COLOR_SEP_LITE[@]+"${JOLLY_COLOR_SEP_LITE[@]}"} + _JOLLY_VCS+="$jolly_sep" + __jolly_make_field "${lp_vcs_remote} ${lp_vcs_commit_behind}" "${color_behind[@]}" + _JOLLY_VCS+="$jolly_field" + else + __jolly_make_field "${lp_smart_mark}" "${color_behind[@]}" + _JOLLY_VCS+="$jolly_field" + __jolly_make_sep_soft ${JOLLY_COLOR_SEP_LITE[@]+"${JOLLY_COLOR_SEP_LITE[@]}"} + _JOLLY_VCS+="$jolly_sep" + __jolly_make_field "${lp_vcs_remote} ${JOLLY_DIFF}" "${color_behind[@]}" + _JOLLY_VCS+="$jolly_field" + fi + + else # LITE remote segment. + __jolly_make_field "${lp_smart_mark}" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _JOLLY_VCS+="$jolly_field" + __jolly_make_sep_soft ${JOLLY_COLOR_SEP_LITE[@]+"${JOLLY_COLOR_SEP_LITE[@]}"} + _JOLLY_VCS+="$jolly_sep" + __jolly_make_field "${lp_vcs_remote}" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _JOLLY_VCS+="$jolly_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 "${JOLLY_VCS_AHEAD_THRESHOLD}" ]]; then + color_ahead=(${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"}) + else + color_ahead=(${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"}) + fi + else # No commit ahead. + color_ahead=(${JOLLY_COLOR_GLOW[@]+"${JOLLY_COLOR_GLOW[@]}"}) + 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 + __jolly_make_sep_link_opposed "${color_ahead[@]}" + # Only remote have commit. + elif [[ "$lp_vcs_commit_behind" -ne "0" && "$lp_vcs_commit_ahead" -eq "0" ]]; then + __jolly_make_sep_link_reverse "${color_ahead[@]}" + # Only local have commits. + else + __jolly_make_sep_link "${color_ahead[@]}" + fi + _JOLLY_VCS+="$jolly_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 + __jolly_make_field "$lp_vcs_commit_ahead" "${color_ahead[@]}" + _JOLLY_VCS+="$jolly_field" + else + __jolly_make_field "$JOLLY_DIFF" "${color_ahead[@]}" + _JOLLY_VCS+="$jolly_field" + fi + __jolly_make_sep_plug ${JOLLY_COLOR_GLOW[@]+"${JOLLY_COLOR_GLOW[@]}"} + _JOLLY_VCS+="$jolly_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. + __jolly_make_field "${lp_smart_mark}" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _JOLLY_VCS+="$jolly_field" + __jolly_make_sep_plug ${JOLLY_COLOR_GLOW[@]+"${JOLLY_COLOR_GLOW[@]}"} + _JOLLY_VCS+="$jolly_sep" + # No local commit segment. + fi + + # Branch:bookmark/tag + if _lp_vcs_branch; then + __jolly_make_field "$lp_vcs_branch" ${JOLLY_COLOR_GLOW[@]+"${JOLLY_COLOR_GLOW[@]}"} + _JOLLY_VCS+="$jolly_field" + + if _lp_vcs_bookmark; then + __jolly_make_field ":${lp_vcs_bookmark}" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + _JOLLY_VCS+="$jolly_field" + fi + if _lp_vcs_tag; then + __jolly_make_sep_soft ${JOLLY_COLOR_SEP_DARK[@]+"${JOLLY_COLOR_SEP_DARK[@]}"} + __jolly_make_field "$lp_vcs_tag" ${JOLLY_COLOR_DARK[@]+"${JOLLY_COLOR_DARK[@]}"} + _JOLLY_VCS+="${jolly_sep}${jolly_field}" + fi + + elif _lp_vcs_bookmark; then + __jolly_make_field "$lp_vcs_bookmark" ${JOLLY_COLOR_GLOW[@]+"${JOLLY_COLOR_GLOW[@]}"} + _JOLLY_VCS+="$jolly_field" + elif _lp_vcs_tag; then + __jolly_make_field "$lp_vcs_tag" ${JOLLY_COLOR_GLOW[@]+"${JOLLY_COLOR_GLOW[@]}"} + _JOLLY_VCS+="$jolly_field" + else + _lp_vcs_commit_id + __jolly_make_field "${lp_vcs_commit_id:0:7}" ${JOLLY_COLOR_GLOW[@]+"${JOLLY_COLOR_GLOW[@]}"} + _JOLLY_VCS+="$jolly_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 "${JOLLY_VCS_DIFF_THRESHOLD}" ]]; then + color=(${JOLLY_COLOR_WARN[@]+"${JOLLY_COLOR_WARN[@]}"}) + else + color=(${JOLLY_COLOR_NOTE[@]+"${JOLLY_COLOR_NOTE[@]}"}) + fi + __jolly_make_sep_link "${color[@]}" + _JOLLY_VCS+="$jolly_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. + __jolly_make_field "±$lp_vcs_unstaged_i_lines" "${color[@]}" + has_lines="$jolly_field" + else + __jolly_make_field "+$lp_vcs_unstaged_i_lines" "${color[@]}" + has_lines="$jolly_field" + __jolly_make_sep_soft ${JOLLY_COLOR_SEP_LITE[@]+"${JOLLY_COLOR_SEP_LITE[@]}"} + has_lines+="$jolly_sep" + __jolly_make_field "-$lp_vcs_unstaged_d_lines" "${color[@]}" + has_lines+="$jolly_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. + __jolly_make_field "±0" ${JOLLY_COLOR_DARK[@]+"${color[@]}"} + has_lines="${jolly_field}" + else + if [[ "$lp_vcs_uncommitted_i_lines" == "$lp_vcs_uncommitted_d_lines" ]] ; then + __jolly_make_field "±$lp_vcs_uncommitted_i_lines" "${color[@]}" + has_lines="$jolly_field" + else + __jolly_make_field "+$lp_vcs_uncommitted_i_lines" "${color[@]}" + has_lines="$jolly_field" + __jolly_make_sep_soft ${JOLLY_COLOR_SEP_LITE[@]+"${JOLLY_COLOR_SEP_LITE[@]}"} + has_lines+="$jolly_sep" + __jolly_make_field "-$lp_vcs_uncommitted_d_lines" "${color[@]}" + has_lines+="$jolly_field" + fi + fi + if (( LP_ENABLE_VCS_DIFFSTATS )) ; then + _JOLLY_VCS+="$has_lines" + else + __jolly_make_field "$JOLLY_DIFF" "${color[@]}" + _JOLLY_VCS+="$jolly_field" + fi # LP_ENABLE_VCS_DIFFSTATS + fi # uncommitted files + + # Stash / untracked / head + local stash="" untracked="" head="" + if _lp_vcs_stash_count; then + stash="$JOLLY_MARK_STASH" + fi + if _lp_vcs_untracked_files; then + untracked="$JOLLY_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 + __jolly_make_sep_plug ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _JOLLY_VCS+="$jolly_sep" + fi + + if [[ -n "$stash" ]] ; then + __jolly_make_field "$stash" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _JOLLY_VCS+="$jolly_field" + if [[ -n "$untracked" ]] ; then + __jolly_make_field "$untracked" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + __jolly_make_sep_soft ${JOLLY_COLOR_SEP_LITE[@]+"${JOLLY_COLOR_SEP_LITE[@]}"} + _JOLLY_VCS+="${jolly_sep}${jolly_field}" + fi + if [[ -n "$head" ]] ; then + __jolly_make_field "$head" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + __jolly_make_sep_soft ${JOLLY_COLOR_SEP_LITE[@]+"${JOLLY_COLOR_SEP_LITE[@]}"} + _JOLLY_VCS+="${jolly_sep}${jolly_field}" + fi + else # no stash + if [[ -n "$untracked" ]] ; then + __jolly_make_field "$untracked" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _JOLLY_VCS+="$jolly_field" + if [[ -n "$head" ]] ; then + __jolly_make_field "$head" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + __jolly_make_sep_soft ${JOLLY_COLOR_SEP_LITE[@]+"${JOLLY_COLOR_SEP_LITE[@]}"} + _JOLLY_VCS+="${jolly_sep}${jolly_field}" + fi + else # no untracked + if [[ -n "$head" ]] ; then + __jolly_make_field "$head" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} + _JOLLY_VCS+="$jolly_field" + fi + fi + fi # stash + return 0 + else + _JOLLY_VCS="" + return 1 + fi # find_vcs +} + +######################################################################## +# Helper functions +######################################################################## + +__jolly_join_fields() { + jolly_join_fields="" + local sep="${1-}" + shift + if [[ -n "$*" ]] ; then + local first_field="${1-}" + shift + jolly_join_fields="${first_field}" + for f in "$@"; do + [[ -z $f ]] && continue + jolly_join_fields+="${sep}${f}" + done + fi +} + +__jolly_make_field() { # string, color_array + local lp_terminal_format string="${1-}" + [[ -z $string ]] && return 1 + + shift + lp_terminal_format "$@" + + jolly_field="${lp_terminal_format}${JOLLY_SPACE_FIELD}${string}${JOLLY_SPACE_FIELD}" +} + +__jolly_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="${JOLLY_PLUG}" + if [[ "${_lp_last_ab_color-}" == "$bg" ]] ; then + sep="${JOLLY_MEAN}" + fi + + lp_terminal_format -3 "$bg" 0 0 -3 "$fbg" + jolly_sep="${JOLLY_SPACE_VOID}${lp_terminal_format}${sep}${JOLLY_SPACE_VOID}" +} + +__jolly_make_sep_link() { # color + local lp_terminal_format + jolly_sep="" + + local fg="${2-}" + [[ -z $fg ]] && fg=-1 + local fbg="${6-}" + [[ -z $fbg ]] && fbg=-1 + + lp_terminal_format -3 -1 0 0 -1 "$fbg" + jolly_sep+="${JOLLY_SPACE_VOID}${lp_terminal_format}${JOLLY_LINK[_LP_FIRST_INDEX]}" + + local dsfg="${JOLLY_COLOR_SEP_FAIR[_LP_FIRST_INDEX]}" + [[ -z $dsfg ]] && dsfg=-1 + lp_terminal_format "$dsfg" -1 0 0 -1 "$fbg" + jolly_sep+="${lp_terminal_format}${JOLLY_LINK[_LP_FIRST_INDEX+1]}" + + lp_terminal_format "$fg" -1 0 0 -1 "$fbg" + jolly_sep+="${lp_terminal_format}${JOLLY_LINK[_LP_FIRST_INDEX+2]}${JOLLY_SPACE_FILL}" +} + +__jolly_make_sep_link_reverse() { # color + local lp_terminal_format + jolly_sep="" + + local fg="${2-}" + [[ -z $fg ]] && fg=-1 + local fbg="${6-}" + [[ -z $fbg ]] && fbg=-1 + + lp_terminal_format -3 -1 0 0 -1 "$fbg" + jolly_sep+="${JOLLY_SPACE_VOID}${lp_terminal_format}${JOLLY_LINK_R[_LP_FIRST_INDEX]}" + + local dsfg="${JOLLY_COLOR_SEP_FAIR[_LP_FIRST_INDEX]}" + [[ -z $dsfg ]] && dsfg=-1 + lp_terminal_format "$dsfg" -1 0 0 -1 "$fbg" + jolly_sep+="${lp_terminal_format}${JOLLY_LINK_R[_LP_FIRST_INDEX+1]}" + + lp_terminal_format "$fg" -1 0 0 -1 "$fbg" + jolly_sep+="${lp_terminal_format}${JOLLY_LINK_R[_LP_FIRST_INDEX+2]}${JOLLY_SPACE_FILL}" +} + +__jolly_make_sep_link_opposed() { # color + local lp_terminal_format + jolly_sep="" + + local fg="${2-}" + [[ -z $fg ]] && fg=-1 + local fbg="${6-}" + [[ -z $fbg ]] && fbg=-1 + + lp_terminal_format -3 -1 0 0 -1 "$fbg" + jolly_sep+="${JOLLY_SPACE_VOID}${lp_terminal_format}${JOLLY_LINK_R[_LP_FIRST_INDEX]}" + + local dsfg="${JOLLY_COLOR_SEP_FAIR[_LP_FIRST_INDEX]}" + [[ -z $dsfg ]] && dsfg=-1 + lp_terminal_format "$dsfg" -1 0 0 -1 "$fbg" + jolly_sep+="${lp_terminal_format}${JOLLY_LINK[_LP_FIRST_INDEX+1]}" + + lp_terminal_format "$fg" -1 0 0 -1 "$fbg" + jolly_sep+="${lp_terminal_format}${JOLLY_LINK[_LP_FIRST_INDEX+2]}${JOLLY_SPACE_FILL}" +} + + +__jolly_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" + jolly_sep+="${JOLLY_SPACE_VOID}${lp_terminal_format}${JOLLY_OPEN[_LP_FIRST_INDEX]}" + + local dsfg="${JOLLY_COLOR_SEP_FAIR[_LP_FIRST_INDEX]}" + [[ -z $dsfg ]] && dsfg=-1 + lp_terminal_format "$dsfg" -1 0 0 -1 "$fbg" + jolly_sep+="${lp_terminal_format}${JOLLY_OPEN[_LP_FIRST_INDEX+1]}" + + lp_terminal_format "$fg" -1 0 0 -1 "$fbg" + jolly_sep+="${lp_terminal_format}${JOLLY_OPEN[_LP_FIRST_INDEX+2]}${JOLLY_SPACE_FILL}" +} + +__jolly_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" + jolly_sep+="${JOLLY_SPACE_VOID}${lp_terminal_format}${JOLLY_DANG[_LP_FIRST_INDEX]}" + + local dcwfg="${JOLLY_COLOR_WARN[_LP_FIRST_INDEX+1]}" + [[ -z $dcwfg ]] && dcwfg=-1 + lp_terminal_format "$dcwfg" -1 0 0 -1 "$fbg" + jolly_sep+="${lp_terminal_format}${JOLLY_DANG[_LP_FIRST_INDEX+1]}" + + lp_terminal_format "$fg" -1 0 0 -1 "$fbg" + jolly_sep+="${lp_terminal_format}${JOLLY_DANG[_LP_FIRST_INDEX+2]}${JOLLY_SPACE_FILL}" +} + +__jolly_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" + jolly_sep="${lp_terminal_format}${JOLLY_SOFT}" +} + +__jolly_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" + jolly_sep="${lp_terminal_format}${JOLLY_SPACE_VOID}${JOLLY_MEAN}${JOLLY_SPACE_VOID}" +} + +__jolly_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 + jolly_sep="${lp_terminal_format}${JOLLY_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 "${JOLLY_COLOR_NOTE[1]}" + jolly_sep+="${lp_terminal_format}${JOLLY_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 "${JOLLY_COLOR_WARN[1]}" + jolly_sep+="${lp_terminal_format}${JOLLY_ENDS[_LP_FIRST_INDEX+1]}${JOLLY_ENDS[_LP_FIRST_INDEX+1]}${NO_COL}" + else + jolly_sep="${lp_terminal_format}${JOLLY_ENDS[_LP_FIRST_INDEX+0]}${NO_COL}" + fi + fi +} + +__jolly_make_sep_side() { # no arg + local lp_terminal_format + lp_terminal_format -3 -1 0 0 -3 -1 # Reset to no background. + local dsf=(${JOLLY_COLOR_SEP_FAIR[@]+"${JOLLY_COLOR_SEP_FAIR[@]}"}) + [[ -z "${dsf[*]}" ]] && dsf=(-1) + lp_terminal_format "${dsf[@]}" + jolly_sep="${lp_terminal_format}${JOLLY_ENDS[_LP_FIRST_INDEX+2]}" +} + diff --git a/liquidprompt_dotmatrix_design.png b/liquidprompt_jolly_design.png similarity index 100% rename from liquidprompt_dotmatrix_design.png rename to liquidprompt_jolly_design.png diff --git a/presets/colors-all-blues.conf b/presets/colors-all-blues.conf index b68b839..01aebc2 100644 --- a/presets/colors-all-blues.conf +++ b/presets/colors-all-blues.conf @@ -4,23 +4,23 @@ li=75 fa=27 # Color arrays defaults: fg bg b u ffg fbg -DOTMATRIX_COLOR_DARK=( 153 $da 0 0 15 0) -DOTMATRIX_COLOR_LITE=( 21 $li 0 0 0 15) -DOTMATRIX_COLOR_GLOW=( 0 $li 0 0 0 15) -DOTMATRIX_COLOR_NOTE=( 15 24 1 0 15 4) -DOTMATRIX_COLOR_WARN=( 0 135 1 0 9 11) -DOTMATRIX_COLOR_FAIR=( 0 $li 1 0 0 8) +JOLLY_COLOR_DARK=( 153 $da 0 0 15 0) +JOLLY_COLOR_LITE=( 21 $li 0 0 0 15) +JOLLY_COLOR_GLOW=( 0 $li 0 0 0 15) +JOLLY_COLOR_NOTE=( 15 24 1 0 15 4) +JOLLY_COLOR_WARN=( 0 135 1 0 9 11) +JOLLY_COLOR_FAIR=( 0 $li 1 0 0 8) -DOTMATRIX_COLOR_PATH_SHORT=( 15 $da 0 0 0 15) -DOTMATRIX_COLOR_PATH_VCS=( 15 $da 0 1 0 15) -DOTMATRIX_COLOR_PATH_LAST=( 15 $da 1 0 0 15) +JOLLY_COLOR_PATH_SHORT=( 15 $da 0 0 0 15) +JOLLY_COLOR_PATH_VCS=( 15 $da 0 1 0 15) +JOLLY_COLOR_PATH_LAST=( 15 $da 1 0 0 15) -DOTMATRIX_COLOR_LINE=($fa -1 0 0 7 -1) -DOTMATRIX_COLOR_LINE_START=($fa -1 1 0 7 -1) -DOTMATRIX_COLOR_LINE_END=( $fa -1 1 0 7 -1) +JOLLY_COLOR_LINE=($fa -1 0 0 7 -1) +JOLLY_COLOR_LINE_START=($fa -1 1 0 7 -1) +JOLLY_COLOR_LINE_END=( $fa -1 1 0 7 -1) -DOTMATRIX_COLOR_MARK=(15 -1 0 0 15 -1) -DOTMATRIX_COLOR_SEP_DARK=( 0 -2 0 0 15 -2) -DOTMATRIX_COLOR_SEP_FAIR=( 0 -2 0 0 0 -2) -DOTMATRIX_COLOR_SEP_LITE=( $li -2 0 0 15 -2) +JOLLY_COLOR_MARK=(15 -1 0 0 15 -1) +JOLLY_COLOR_SEP_DARK=( 0 -2 0 0 15 -2) +JOLLY_COLOR_SEP_FAIR=( 0 -2 0 0 0 -2) +JOLLY_COLOR_SEP_LITE=( $li -2 0 0 15 -2) diff --git a/presets/colors-cyan-magenta.conf b/presets/colors-cyan-magenta.conf index b9bbc2b..31ce875 100644 --- a/presets/colors-cyan-magenta.conf +++ b/presets/colors-cyan-magenta.conf @@ -1,4 +1,4 @@ -DOTMATRIX_COLOR_NOTE=( 15 30 0 0 15 2) -DOTMATRIX_COLOR_WARN=(231 128 1 0 0 9) +JOLLY_COLOR_NOTE=( 15 30 0 0 15 2) +JOLLY_COLOR_WARN=(231 128 1 0 0 9) diff --git a/presets/colors-green-red.conf b/presets/colors-green-red.conf index c9f96fe..af73d06 100644 --- a/presets/colors-green-red.conf +++ b/presets/colors-green-red.conf @@ -1,4 +1,4 @@ -DOTMATRIX_COLOR_NOTE=( 15 28 0 0 15 2) -DOTMATRIX_COLOR_WARN=(220 160 1 0 0 9) +JOLLY_COLOR_NOTE=( 15 28 0 0 15 2) +JOLLY_COLOR_WARN=(220 160 1 0 0 9) diff --git a/presets/colors-high-contrast.conf b/presets/colors-high-contrast.conf index b45db0e..2689bb0 100644 --- a/presets/colors-high-contrast.conf +++ b/presets/colors-high-contrast.conf @@ -3,23 +3,23 @@ da=238 li=254 # Color arrays defaults: fg bg b u ffg fbg -DOTMATRIX_COLOR_DARK=( $li $da 0 0 15 0) -DOTMATRIX_COLOR_LITE=( $da $li 0 0 0 15) -DOTMATRIX_COLOR_GLOW=( 0 $li 0 0 0 15) -DOTMATRIX_COLOR_NOTE=( 0 27 1 1 15 4) -DOTMATRIX_COLOR_WARN=( 88 220 1 1 9 11) -DOTMATRIX_COLOR_FAIR=( 0 $li 1 0 0 8) +JOLLY_COLOR_DARK=( $li $da 0 0 15 0) +JOLLY_COLOR_LITE=( $da $li 0 0 0 15) +JOLLY_COLOR_GLOW=( 0 $li 0 0 0 15) +JOLLY_COLOR_NOTE=( 0 27 1 1 15 4) +JOLLY_COLOR_WARN=( 88 220 1 1 9 11) +JOLLY_COLOR_FAIR=( 0 $li 1 0 0 8) -DOTMATRIX_COLOR_PATH_SHORT=( 15 $da 0 0 0 15) -DOTMATRIX_COLOR_PATH_VCS=( 15 $da 0 1 0 15) -DOTMATRIX_COLOR_PATH_LAST=( 15 $da 1 0 0 15) +JOLLY_COLOR_PATH_SHORT=( 15 $da 0 0 0 15) +JOLLY_COLOR_PATH_VCS=( 15 $da 0 1 0 15) +JOLLY_COLOR_PATH_LAST=( 15 $da 1 0 0 15) -DOTMATRIX_COLOR_LINE=(247 -1 0 0 7 -1) -DOTMATRIX_COLOR_LINE_START=(247 -1 1 0 7 -1) -DOTMATRIX_COLOR_LINE_END=( 247 -1 1 0 7 -1) +JOLLY_COLOR_LINE=(247 -1 0 0 7 -1) +JOLLY_COLOR_LINE_START=(247 -1 1 0 7 -1) +JOLLY_COLOR_LINE_END=( 247 -1 1 0 7 -1) -DOTMATRIX_COLOR_MARK=(15 -1 0 0 15 -1) -DOTMATRIX_COLOR_SEP_DARK=( 15 -2 0 0 15 -2) -DOTMATRIX_COLOR_SEP_FAIR=( 0 -2 0 0 0 -2) -DOTMATRIX_COLOR_SEP_LITE=( 0 -2 0 0 15 -2) +JOLLY_COLOR_MARK=(15 -1 0 0 15 -1) +JOLLY_COLOR_SEP_DARK=( 15 -2 0 0 15 -2) +JOLLY_COLOR_SEP_FAIR=( 0 -2 0 0 0 -2) +JOLLY_COLOR_SEP_LITE=( 0 -2 0 0 15 -2) diff --git a/presets/variant-chevron.conf b/presets/variant-chevron.conf index 8bc2d88..c0386ef 100644 --- a/presets/variant-chevron.conf +++ b/presets/variant-chevron.conf @@ -1,26 +1,26 @@ -DOTMATRIX_SPACED=${DOTMATRIX_SPACED:-1} +JOLLY_SPACED=${JOLLY_SPACED:-1} # Powerline chevron theme -DOTMATRIX_HOST_LOCAL=${DOTMATRIX_HOST_LOCAL:-""} -DOTMATRIX_USER_LOCAL=${DOTMATRIX_USER_LOCAL:-""} -DOTMATRIX_VCS=${DOTMATRIX_VCS:-""} -DOTMATRIX_MARK=${DOTMATRIX_MARK:-""} -DOTMATRIX_MARK_SUDO=${DOTMATRIX_MARK_SUDO:-"⁘"} # ⁘ 🞙 -DOTMATRIX_LINE=${DOTMATRIX_LINE:-"━"} -DOTMATRIX_PLUG=${DOTMATRIX_PLUG:-""} -DOTMATRIX_SOFT=${DOTMATRIX_SOFT:-"╱"} -DOTMATRIX_MEAN=${DOTMATRIX_MEAN:-""} +JOLLY_HOST_LOCAL=${JOLLY_HOST_LOCAL:-""} +JOLLY_USER_LOCAL=${JOLLY_USER_LOCAL:-""} +JOLLY_VCS=${JOLLY_VCS:-""} +JOLLY_MARK=${JOLLY_MARK:-""} +JOLLY_MARK_SUDO=${JOLLY_MARK_SUDO:-"⁘"} # ⁘ 🞙 +JOLLY_LINE=${JOLLY_LINE:-"━"} +JOLLY_PLUG=${JOLLY_PLUG:-""} +JOLLY_SOFT=${JOLLY_SOFT:-"╱"} +JOLLY_MEAN=${JOLLY_MEAN:-""} -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=("" "┃" "") +JOLLY_LINK=( ${JOLLY_LINK[@]+"${JOLLY_LINK[@]}"} ) +[[ ${#JOLLY_LINK[@]} == 0 ]] && JOLLY_LINK=("" "" "") +JOLLY_LINK_R=( ${JOLLY_LINK_R[@]+"${JOLLY_LINK_R[@]}"} ) +[[ ${#JOLLY_LINK_R[@]} == 0 ]] && JOLLY_LINK_R=("" "" "") +JOLLY_OPEN=( ${JOLLY_OPEN[@]+"${JOLLY_OPEN[@]}"} ) +[[ ${#JOLLY_OPEN[@]} == 0 ]] && JOLLY_OPEN=("" "" "") +JOLLY_DANG=( ${JOLLY_DANG[@]+"${JOLLY_DANG[@]}"} ) +[[ ${#JOLLY_DANG[@]} == 0 ]] && JOLLY_DANG=("" "" "") +JOLLY_ENDS=( ${JOLLY_ENDS[@]+"${JOLLY_ENDS[@]}"} ) +[[ ${#JOLLY_ENDS[@]} == 0 ]] && JOLLY_ENDS=("" "" "") +JOLLY_ITEMS=( ${JOLLY_ITEMS[@]+"${JOLLY_ITEMS[@]}"} ) +[[ ${#JOLLY_ITEMS[@]} == 0 ]] && JOLLY_ITEMS=("" "┃" "") diff --git a/presets/variant-round.conf b/presets/variant-round.conf index 167cab3..5175c1b 100644 --- a/presets/variant-round.conf +++ b/presets/variant-round.conf @@ -1,26 +1,26 @@ -DOTMATRIX_SPACED=${DOTMATRIX_SPACED:-1} +JOLLY_SPACED=${JOLLY_SPACED:-1} # Powerline round theme -DOTMATRIX_HOST_LOCAL=${DOTMATRIX_HOST_LOCAL:-""} -DOTMATRIX_USER_LOCAL=${DOTMATRIX_USER_LOCAL:-""} -DOTMATRIX_VCS=${DOTMATRIX_VCS:-""} -DOTMATRIX_MARK=${DOTMATRIX_MARK:-""} -DOTMATRIX_MARK_SUDO=${DOTMATRIX_MARK_SUDO:-"⚬"} # ⁘ ⚬ 🞙 -DOTMATRIX_LINE=${DOTMATRIX_LINE:-"━"} -DOTMATRIX_PLUG=${DOTMATRIX_PLUG:-""} -DOTMATRIX_SOFT=${DOTMATRIX_SOFT:-"╱"} -DOTMATRIX_MEAN=${DOTMATRIX_MEAN:-""} +JOLLY_HOST_LOCAL=${JOLLY_HOST_LOCAL:-""} +JOLLY_USER_LOCAL=${JOLLY_USER_LOCAL:-""} +JOLLY_VCS=${JOLLY_VCS:-""} +JOLLY_MARK=${JOLLY_MARK:-""} +JOLLY_MARK_SUDO=${JOLLY_MARK_SUDO:-"⚬"} # ⁘ ⚬ 🞙 +JOLLY_LINE=${JOLLY_LINE:-"━"} +JOLLY_PLUG=${JOLLY_PLUG:-""} +JOLLY_SOFT=${JOLLY_SOFT:-"╱"} +JOLLY_MEAN=${JOLLY_MEAN:-""} -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=("" "┃" "") +JOLLY_LINK=( ${JOLLY_LINK[@]+"${JOLLY_LINK[@]}"} ) +[[ ${#JOLLY_LINK[@]} == 0 ]] && JOLLY_LINK=("█" "" "") +JOLLY_LINK_R=( ${JOLLY_LINK_R[@]+"${JOLLY_LINK_R[@]}"} ) +[[ ${#JOLLY_LINK_R[@]} == 0 ]] && JOLLY_LINK_R=("" "" "█") +JOLLY_OPEN=( ${JOLLY_OPEN[@]+"${JOLLY_OPEN[@]}"} ) +[[ ${#JOLLY_OPEN[@]} == 0 ]] && JOLLY_OPEN=("█" "" "") +JOLLY_DANG=( ${JOLLY_DANG[@]+"${JOLLY_DANG[@]}"} ) +[[ ${#JOLLY_DANG[@]} == 0 ]] && JOLLY_DANG=("█" "" "") +JOLLY_ENDS=( ${JOLLY_ENDS[@]+"${JOLLY_ENDS[@]}"} ) +[[ ${#JOLLY_ENDS[@]} == 0 ]] && JOLLY_ENDS=("" "" "") +JOLLY_ITEMS=( ${JOLLY_ITEMS[@]+"${JOLLY_ITEMS[@]}"} ) +[[ ${#JOLLY_ITEMS[@]} == 0 ]] && JOLLY_ITEMS=("" "┃" "") diff --git a/presets/variant-slant.conf b/presets/variant-slant.conf index 60dbe02..5254d9d 100644 --- a/presets/variant-slant.conf +++ b/presets/variant-slant.conf @@ -1,25 +1,25 @@ -DOTMATRIX_SPACED=${DOTMATRIX_SPACED:-1} +JOLLY_SPACED=${JOLLY_SPACED:-1} # Powerline slanted theme -DOTMATRIX_HOST_LOCAL=${DOTMATRIX_HOST_LOCAL:-""} -DOTMATRIX_USER_LOCAL=${DOTMATRIX_USER_LOCAL:-""} -DOTMATRIX_VCS=${DOTMATRIX_VCS:-""} -DOTMATRIX_MARK=${DOTMATRIX_MARK:-""} -DOTMATRIX_MARK_SUDO=${DOTMATRIX_MARK_SUDO:-"🞙"} # ⁘ ⚬ 🞙 -DOTMATRIX_LINE=${DOTMATRIX_LINE:-"━"} -DOTMATRIX_PLUG=${DOTMATRIX_PLUG:-""} -DOTMATRIX_SOFT=${DOTMATRIX_SOFT:-"╱"} -DOTMATRIX_MEAN=${DOTMATRIX_MEAN:-" "} -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=("" "┃" "") +JOLLY_HOST_LOCAL=${JOLLY_HOST_LOCAL:-""} +JOLLY_USER_LOCAL=${JOLLY_USER_LOCAL:-""} +JOLLY_VCS=${JOLLY_VCS:-""} +JOLLY_MARK=${JOLLY_MARK:-""} +JOLLY_MARK_SUDO=${JOLLY_MARK_SUDO:-"🞙"} # ⁘ ⚬ 🞙 +JOLLY_LINE=${JOLLY_LINE:-"━"} +JOLLY_PLUG=${JOLLY_PLUG:-""} +JOLLY_SOFT=${JOLLY_SOFT:-"╱"} +JOLLY_MEAN=${JOLLY_MEAN:-" "} +JOLLY_LINK=( ${JOLLY_LINK[@]+"${JOLLY_LINK[@]}"} ) +[[ ${#JOLLY_LINK[@]} == 0 ]] && JOLLY_LINK=("" "" " ") +JOLLY_LINK_R=( ${JOLLY_LINK_R[@]+"${JOLLY_LINK_R[@]}"} ) +[[ ${#JOLLY_LINK_R[@]} == 0 ]] && JOLLY_LINK_R=("" "" "") +JOLLY_OPEN=( ${JOLLY_OPEN[@]+"${JOLLY_OPEN[@]}"} ) +[[ ${#JOLLY_OPEN[@]} == 0 ]] && JOLLY_OPEN=("" "" " ") +JOLLY_DANG=( ${JOLLY_DANG[@]+"${JOLLY_DANG[@]}"} ) +[[ ${#JOLLY_DANG[@]} == 0 ]] && JOLLY_DANG=("" " " " ") +JOLLY_ENDS=( ${JOLLY_ENDS[@]+"${JOLLY_ENDS[@]}"} ) +[[ ${#JOLLY_ENDS[@]} == 0 ]] && JOLLY_ENDS=("" " " " ") +JOLLY_ITEMS=( ${JOLLY_ITEMS[@]+"${JOLLY_ITEMS[@]}"} ) +[[ ${#JOLLY_ITEMS[@]} == 0 ]] && JOLLY_ITEMS=("" "┃" "") diff --git a/presets/variant-text.conf b/presets/variant-text.conf index 5bb2cb3..b2ced90 100644 --- a/presets/variant-text.conf +++ b/presets/variant-text.conf @@ -1,27 +1,26 @@ -DOTMATRIX_SPACED=${DOTMATRIX_SPACED:-0} +JOLLY_SPACED=${JOLLY_SPACED:-0} -# Dotmatrix theme -DOTMATRIX_HOST_LOCAL=${DOTMATRIX_HOST_LOCAL:-"lcl"} -DOTMATRIX_USER_LOCAL=${DOTMATRIX_USER_LOCAL:-"me"} -DOTMATRIX_VCS=${DOTMATRIX_VCS:-"VCS"} -DOTMATRIX_MARK=${DOTMATRIX_MARK:-">"} -DOTMATRIX_MARK_SUDO=${DOTMATRIX_MARK_SUDO:-"!"} -DOTMATRIX_LINE=${DOTMATRIX_LINE:-"━"} -DOTMATRIX_PLUG=${DOTMATRIX_PLUG:-"▌"} -DOTMATRIX_SOFT=${DOTMATRIX_SOFT:-"╱"} -DOTMATRIX_MEAN=${DOTMATRIX_MEAN:-"┃"} +JOLLY_HOST_LOCAL=${JOLLY_HOST_LOCAL:-"lcl"} +JOLLY_USER_LOCAL=${JOLLY_USER_LOCAL:-"me"} +JOLLY_VCS=${JOLLY_VCS:-"VCS"} +JOLLY_MARK=${JOLLY_MARK:-">"} +JOLLY_MARK_SUDO=${JOLLY_MARK_SUDO:-"!"} +JOLLY_LINE=${JOLLY_LINE:-"━"} +JOLLY_PLUG=${JOLLY_PLUG:-"▌"} +JOLLY_SOFT=${JOLLY_SOFT:-"╱"} +JOLLY_MEAN=${JOLLY_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=("┫" "┃" "┣") +JOLLY_LINK=( ${JOLLY_LINK[@]+"${JOLLY_LINK[@]}"} ) +[[ ${#JOLLY_LINK[@]} == 0 ]] && JOLLY_LINK=("▌" "<" "▐") +JOLLY_LINK_R=( ${JOLLY_LINK_R[@]+"${JOLLY_LINK_R[@]}"} ) +[[ ${#JOLLY_LINK_R[@]} == 0 ]] && JOLLY_LINK_R=("▌" ">" "▐") +JOLLY_OPEN=( ${JOLLY_OPEN[@]+"${JOLLY_OPEN[@]}"} ) +[[ ${#JOLLY_OPEN[@]} == 0 ]] && JOLLY_OPEN=("▌" "<<" "▐") +JOLLY_DANG=( ${JOLLY_DANG[@]+"${JOLLY_DANG[@]}"} ) +[[ ${#JOLLY_DANG[@]} == 0 ]] && JOLLY_DANG=("▌" "<<<" "▐") +JOLLY_ENDS=( ${JOLLY_ENDS[@]+"${JOLLY_ENDS[@]}"} ) +[[ ${#JOLLY_ENDS[@]} == 0 ]] && JOLLY_ENDS=("▌" "···" "···▐") +JOLLY_ITEMS=( ${JOLLY_ITEMS[@]+"${JOLLY_ITEMS[@]}"} ) +[[ ${#JOLLY_ITEMS[@]} == 0 ]] && JOLLY_ITEMS=("┫" "┃" "┣") From 5d8f9926b026b9100efa8676f787b2517162c89f Mon Sep 17 00:00:00 2001 From: nojhan Date: Mon, 1 Apr 2024 12:11:29 +0200 Subject: [PATCH 21/29] doc: add Jolly's emblem --- README.md | 3 + docs/jolly_emblem.svg | 2740 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2743 insertions(+) create mode 100644 docs/jolly_emblem.svg diff --git a/README.md b/README.md index ee38404..612a6fc 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,9 @@ Has such, you may find it a little bit disconcerting at first. But we believe that the advantages of this design makes it worth the effort. +![A ship with black sails, three of which are printed with the symbols "~", "$", and ">"; going out of a circling boat wheel with sun rays in her back; and navigating a blue wave with froth going over a banner that reads "Liquid Prompt". A large black flag is attached to the front shroud, showing a skull and two crossed bones, on top of a legend reading "jolly roger".](docs/jolly_emblem.svg) + + Preview ------- diff --git a/docs/jolly_emblem.svg b/docs/jolly_emblem.svg new file mode 100644 index 0000000..c6b6ccd --- /dev/null +++ b/docs/jolly_emblem.svg @@ -0,0 +1,2740 @@ + + + +Liquid Prompt — Jolly Roger Emblem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nojhan, dolmen, Rycieos & co~ https://github.com/ liquidprompt/liquidprompt + + + jollyrogerLiquid Prompt — Jolly Roger Emblem2024-04-01nojhanLiquid PromptBashZshAGPL~$>Jolly Rogeren_USA ship with black sails, three of which are printed with the symbols "~", "$", and ">"; going out of a circling boat wheel with sun rays in her back; and navigating a blue wave with froth going over a banner that reads "Liquid Prompt". A large black flag is attached to the front shroud, showing a skull and two crossed bones, on top of a legend reading "jolly roger".Mariana Ruiz "LadyofHats " Villarreal From 721554725def20ea7696fcf3bbe9df4b0b1d4edb Mon Sep 17 00:00:00 2001 From: nojhan Date: Mon, 1 Apr 2024 14:18:08 +0200 Subject: [PATCH 22/29] refactor: better emblem --- docs/jolly_emblem.svg | 109 +++++++++++++++++++++++++----------------- 1 file changed, 65 insertions(+), 44 deletions(-) diff --git a/docs/jolly_emblem.svg b/docs/jolly_emblem.svg index c6b6ccd..3ecd7ff 100644 --- a/docs/jolly_emblem.svg +++ b/docs/jolly_emblem.svg @@ -33,9 +33,9 @@ inkscape:deskcolor="black" inkscape:document-units="mm" showgrid="false" - inkscape:zoom="1.3258182" - inkscape:cx="463.86449" - inkscape:cy="439.35133" + inkscape:zoom="1.6384291" + inkscape:cx="350.0304" + inkscape:cy="436.08845" inkscape:current-layer="g30972" showguides="true" />jollyroger Date: Mon, 1 Apr 2024 14:23:39 +0200 Subject: [PATCH 23/29] doc: link to LP + screenshot --- docs/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/README.md b/docs/README.md index c2ea1e0..4a94ac4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -149,6 +149,13 @@ States that rarely change or evolve slowly are less important. Each aspect of theming should have a related configuration variable. +## More details + +If you want to know more, check our +[opinionated prompt systems comparison](https://github.com/liquidprompt/liquidprompt/wiki/Why) +that goes into more details and give examples across various other prompt systems. + + # Jolly's Design Principles ## Stability @@ -164,6 +171,8 @@ change too much the location of information previously displayed. > Sections are thus organized from left to right, in decreasing order of stability. > Jolly always displays important segments, even in their default state, so that they are always located where the user expect them to be. +![](../screenshots/variant-chevron.png) + ## Sectioning From 3aaf5fa592705e1576432fb2544812155da3d19c Mon Sep 17 00:00:00 2001 From: nojhan Date: Mon, 1 Apr 2024 14:32:13 +0200 Subject: [PATCH 24/29] doc: more screenshots in design --- docs/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/README.md b/docs/README.md index 4a94ac4..65b50e3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -204,6 +204,8 @@ To ease the visual browsing of those segments, it uses the visual separators int > While Jolly can theoretically use many of the "powerline" characters as separators, it recommends using the "arrow" one, which fits better the *semantic sequence* principle. +![](../screenshots/variant-round.png) + ## Semantic Sequences @@ -215,6 +217,8 @@ For instance from the more generic to the more specific, from a natural order of > Spaced reverse arrows in the VCS sections actually show the direction of the expected action > (e.g. "to be pushed" = local-to-remote = right-to-left). +![](../screenshots/git_commits.png) + ## Semantic Spaces @@ -243,6 +247,8 @@ Important information may be displayed using two other colors: one for informati > Its default is set to blue/yellow, following the most classical recommendation to bypass the most common colorblindness issues. > The basic segments use tones of dark and light greys with AAA contrast between them, appearing as black and white on many classical terminal backgrounds. +![](../screenshots/variant-chevron_colors-cyan-magenta.png) + ## Semantic Thresholds From 0c92a648ce167118947113322fc963b04fe85ee7 Mon Sep 17 00:00:00 2001 From: Ludovic Rousseau Date: Tue, 7 Jan 2025 16:47:52 +0100 Subject: [PATCH 25/29] Some patches for README.md (#4) doc(README): fix typos and deprecated features - LP_ENABLE_VCS_DIFFSTATS no more exist and is not documented. - Remove LP_ENABLE_UNCOMMITED. --- README.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 612a6fc..447d6f2 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ It is an original prompt design, very carefully designed, that will completely changes the way you imagine the prompt. It is focused on *improving the user experience*, -by vastly improving the ability of the user to immediatly spot +by vastly improving the ability of the user to immediately spot what she should do following her system's state changes. Has such, you may find it a little bit disconcerting at first. @@ -63,7 +63,7 @@ The prompt itself is designed in three lines: ### Example For instance, in the following prompt, you can see that the user is in a Git repository and has some action waiting to be done: -- the rightmost blue "≠" indicates that there are some modifications waiting to be commited (hence the directional hint, from a diff to the branch). +- the rightmost blue "≠" indicates that there are some modifications waiting to be committed (hence the directional hint, from a diff to the branch). - the leftmost blue segment indicates that there are some commits that may be pushed to the remote (hence the directional hint, from the branch to the VCS symbol). ![](screenshots/variant-chevron.png) @@ -100,7 +100,7 @@ For example: source ~/lp-jolly/jolly.theme && lp_theme jolly ``` -NOTE: The recommended segment markers (the "chevron" variant) uses characters in the private section of unicode +NOTE: The recommended segment markers (the "chevron" variant) uses characters in the private section of Unicode that are defined by the "Nerd-fonts" project. You will either need a compatible font, or use a variant that does not need them, like "text" and "jolly". @@ -152,8 +152,6 @@ except for the ones defining colors, specific marks and disabling some features. The following options are honored: - [`LP_ENABLE_PERM`](https://liquidprompt.readthedocs.io/en/stable/config.html#LP_ENABLE_PERM), -- [`LP_ENABLE_VCS_DIFFSTATS`](https://liquidprompt.readthedocs.io/en/stable/config.html#LP_ENABLE_VCS_DIFFSTATS), -- [`LP_ENABLE_UNCOMMITED`](https://liquidprompt.readthedocs.io/en/stable/config.html#LP_ENABLE_UNCOMMITED), - [`LP_MARK_BATTERY`](https://liquidprompt.readthedocs.io/en/stable/config.html#LP_MARK_BATTERY), - [`LP_MARK_LOAD`](https://liquidprompt.readthedocs.io/en/stable/config.html#LP_MARK_LOAD), - [`LP_MARK_TEMP`](https://liquidprompt.readthedocs.io/en/stable/config.html#LP_MARK_TEMP), @@ -176,13 +174,13 @@ Note: the order in which you load the presets may be important. When changing the colors of the first line, presets needs to be loaded from your shell configuration and not just sourced in the prompt. -A first set is are called "variants" and mainly change the segment joints, +A first set is called "variants" and mainly change the segment joints, but can also impact the icons on some variants: -- `source presets/variant-chevron.conf" (the *recommended*, need a Nerd-fonts font), -- `source presets/variant-slant.conf" (need a Nerd-fonts font), -- `source presets/variant-round.conf" (need a Nerd-fonts font), -- `source presets/variant-text.conf" (the one that works anywhere). +- `source presets/variant-chevron.conf` (the *recommended*, need a Nerd-fonts font), +- `source presets/variant-slant.conf` (need a Nerd-fonts font), +- `source presets/variant-round.conf` (need a Nerd-fonts font), +- `source presets/variant-text.conf` (the one that works anywhere). A second set changes the colors: @@ -519,6 +517,7 @@ The color starting the gradient of the line of the middle section. Default is white. Valus being linearly interpolated up to `JOLLY_COLOR_LINE_END`, + it is recommended to stick to aligned ANSI values (i.e. greys) @@ -527,7 +526,9 @@ it is recommended to stick to aligned ANSI values (i.e. greys) The color ending the gradient of the line of the middle section. Default is black. + Valus being linearly interpolated from `JOLLY_COLOR_LINE_START`, + it is recommended to stick to aligned ANSI values (i.e. greys). From afc9e26765e5ce7de6b45ce9a816338de75bb522 Mon Sep 17 00:00:00 2001 From: steelman Date: Tue, 7 Jan 2025 16:52:06 +0100 Subject: [PATCH 26/29] fix: change scope of _lp_jolly_make_env_inline_right Make it visible outside of _lp_dotmatrix_make_env, as its left counterpart. --- jolly.theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jolly.theme b/jolly.theme index c8e6a0c..4e246b4 100644 --- a/jolly.theme +++ b/jolly.theme @@ -485,7 +485,7 @@ _lp_jolly_make_env() { fi # History section. - local _lp_jolly_make_env_inline_right= + _lp_jolly_make_env_inline_right= if _lp_os; then _lp_join "$I" ${lp_os_arch} ${lp_os_family} ${lp_os_kernel} ${lp_os_distrib} ${lp_os_version} _lp_jolly_make_env_inline_right+="$d${lp_join}$b" From 9fb90f451edfe778b424777813ebf60e9ea187da Mon Sep 17 00:00:00 2001 From: nojhan Date: Sat, 11 Jan 2025 20:32:10 +0100 Subject: [PATCH 27/29] fix(hostname): was sometimes showing the username --- jolly.theme | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/jolly.theme b/jolly.theme index 4e246b4..64ca113 100644 --- a/jolly.theme +++ b/jolly.theme @@ -851,17 +851,18 @@ __jolly_activate_user() { __jolly_activate_hostname() { - local hostname + local hostname= if _lp_hostname; then case "$lp_connection" in ssh) - local client_ip client_port server_ip server_port hostname= + hostname="$lp_hostname" + local client_ip client_port server_ip server_port 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 + if _lp_create_link "ssh://${username}@${server_ip}:${server_port}" "$hostname"; then hostname="$link" else - hostname="$lp_hostname" + hostname="$hostname" fi # If we want a different color for each host if (( LP_ENABLE_SSH_COLORS )); then @@ -882,8 +883,11 @@ __jolly_activate_hostname() { hostname="${JOLLY_HOST_LOCAL}" fi - __jolly_make_field "$hostname" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} - _JOLLY_HOSTNAME="${jolly_field}" + if __jolly_make_field "$hostname" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} ; then + _JOLLY_HOSTNAME="${jolly_field}" + else + _JOLLY_HOSTNAME="${lp_hostname}" + fi } @@ -1224,7 +1228,8 @@ __jolly_join_fields() { } __jolly_make_field() { # string, color_array - local lp_terminal_format string="${1-}" + local string="${1-}" + local lp_terminal_format [[ -z $string ]] && return 1 shift From da773f822cc747e72cefcd65d678fde8f97a13c4 Mon Sep 17 00:00:00 2001 From: nojhan Date: Sat, 11 Jan 2025 20:49:33 +0100 Subject: [PATCH 28/29] feat(env): display env name before contents Remove container duplicate. --- jolly.theme | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/jolly.theme b/jolly.theme index 64ca113..fa6b870 100644 --- a/jolly.theme +++ b/jolly.theme @@ -444,40 +444,37 @@ _lp_jolly_make_env() { if _lp_env_vars "${LP_COLOR_ENV_VARS_SET}" "${LP_COLOR_ENV_VARS_UNSET}"; then local lp_join _lp_join "$I" ${lp_env_vars[@]} - _lp_jolly_make_env_inline_left+="$d${lp_join}$b" + _lp_jolly_make_env_inline_left+="${d}${lp_join}$b" fi if _lp_software_collections ; then - _lp_jolly_make_env_inline_left+="$d${lp_software_collections}$b" + _lp_jolly_make_env_inline_left+="${d}sc:${lp_software_collections}$b" fi if _lp_python_env ; then - _lp_jolly_make_env_inline_left+="$d${lp_python_env}$b" + _lp_jolly_make_env_inline_left+="${d}py:${lp_python_env}$b" fi if _lp_node_env ; then - _lp_jolly_make_env_inline_left+="$d${lp_node_env}$b" + _lp_jolly_make_env_inline_left+="${d}node:${lp_node_env}$b" fi if _lp_ruby_env ; then - _lp_jolly_make_env_inline_left+="$d${lp_ruby_env}$b" + _lp_jolly_make_env_inline_left+="${d}ruby:${lp_ruby_env}$b" fi if _lp_container ; then - _lp_jolly_make_env_inline_left+="$d${lp_container}$b" + _lp_jolly_make_env_inline_left+="${d}c:${lp_container}$b" fi if _lp_kubernetes_context ; then - _lp_jolly_make_env_inline_left+="$d${lp_kubernetes_context}$b" + _lp_jolly_make_env_inline_left+="${d}kub:${lp_kubernetes_context}$b" fi if _lp_terraform_env ; then - _lp_jolly_make_env_inline_left+="$d${lp_terraform_env}$b" + _lp_jolly_make_env_inline_left+="${d}tf:${lp_terraform_env}$b" fi if _lp_aws_profile ; then - _lp_jolly_make_env_inline_left+="$d${lp_aws_profile}$b" + _lp_jolly_make_env_inline_left+="${d}aws:${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} _lp_jolly_make_env_inline_left+="$d${lp_join}$b" fi - if _lp_container; then - _lp_jolly_make_env_inline_left+="$d$lp_container$b" - fi if _lp_modules; then _lp_jolly_make_env_inline_left+="$d" _lp_join "$I" "${lp_modules[@]}" From a3de7483472d80048408886f6bc523002124a189 Mon Sep 17 00:00:00 2001 From: nojhan Date: Sat, 11 Jan 2025 20:50:14 +0100 Subject: [PATCH 29/29] fix(hostname): handle background color when failed --- jolly.theme | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jolly.theme b/jolly.theme index fa6b870..184b94e 100644 --- a/jolly.theme +++ b/jolly.theme @@ -883,7 +883,11 @@ __jolly_activate_hostname() { if __jolly_make_field "$hostname" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} ; then _JOLLY_HOSTNAME="${jolly_field}" else - _JOLLY_HOSTNAME="${lp_hostname}" + if __jolly_make_field "$lp_hostname" ${JOLLY_COLOR_LITE[@]+"${JOLLY_COLOR_LITE[@]}"} ; then + _JOLLY_HOSTNAME="${jolly_field}" + else + _JOLLY_HOSTNAME="${lp_hostname}" + fi fi }

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 diff --git a/screenshots/dotmatrix-short-chevron.png b/screenshots/dotmatrix-short-chevron.png deleted file mode 100644 index ba64f68d76f80ea6a264214752d14a66cfd33bc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4607 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 diff --git a/screenshots/dotmatrix-short-dots.png b/screenshots/dotmatrix-short-dots.png deleted file mode 100644 index c0114ae23ee8f21864484d2bafdd680cffe4c45c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1915 zcmai#e^66b7RMj88bEHWWd4-1?86!qHZvW4JuSYekKYrlmt=)fdWCmRSY3O z)3FqyWPlMHkXRszl3=if1QCS=`C$ko3!z02h(Ue_VlTGSai`AgAMf5b@11+T=bn4c z=h9A}L>U=c8bT0cgh3+%A!q{=ykqq@fzi75#(%(M@HILl5rT|c*B`x`PR3Rc1lx~6 z9zBzKYkK$;xtCxGdqd2UB_F})>)m6VcMp4tsN~HOZ{V?EmhL+km|&IO;i>i)+~VC0 ziyHjr2^(G?H<98!>vbWMMiGRRo2gr-I!T zr}#!WPUR{OH<#e-*u`{*PgCMk<9Xe8+;q4JOXfA(1ago22$##Yb$h7S2Yi5u)uSSo_%6*ox-n zE4_Sfc;i;<%%$@@96<$I&pEF1Fp&1k*VhL6`J{p4I2^9Gx3_in*N(O% zjK9BsQc_ZDFXzijF4ws%b(9t`;CS;y9aXy!Lnh}FI=+`AcKKMqlc#Pd6pDbpn)}V3 zWmj~I-3oE18UgZMeLBH*r)k2{n~@*f2q)&|=OrM%3%b?iz1tnP(_1o&JAS?XZ{Ea< zyUO~yW96q4sA|O{S1+#}g$P|L5;+8%YhFebN>J8Rb1M(>jndN6YAwr?65llYlpTL7 zgclRgwEP=RwKD(O)Kv3i?{iIGFsyA3{>*H6m_RZ)=n=%f&#b#u8~snB9+WldBkv9n zEVK*aD!IYavRHL3kK(n>fvL>Y#!V@k5kdFPnHm`xX=Fq;<1_5qn--IViJm)F>@GF} zF&Ua`ygTo1S(>9;$ukB&*E-Xy>J)pAg>yK%nxDD0@=C2P492Z}k+G_2t|%W#(agPg zz1Md1XIQcH3zxY3YnwZ+g06dfKSV+s>%0xG6bL-_Q0KarbXv9Qc8Y>_6=rfgF)?v= zV`I2;WQIoagFC68!9QCQ{EXC(*jlBs>wXA@?}+PyAM_WsDSt}*f5aj0{8Y84gUoas}_VvVvWovrEW zN8|Ihp#Bi9ppzb@xhGE#ZhJf4Rp>|GK70<>aM6F4Z-y6$X0+XbjTPcYe!13?`5?NT zX<)=exPy}odmy$352CvkIKhVgD`!kh)sD7VU&*(KOg;akYUhEANMCm0qx3~-J)xt5 z%jH&&%E%rk?gVbxvgM38WALYU^9L%PvpkDyjf{<@Pj5P*&YFPTP8wk@?ccw@yQe2G zK{eS|6E#2ChmpWGZ5o{)z*$pMwl#t7QiZOY9&8b#0AwJ?KagOH1~e){zGo2TFGAT1 zEr7`kWd8v?KD7J@t*VAsM`Q&Bw8;%X1pe4TE+~2L`uGQUV`6>TE`G?lg*j}J3lJF6 z!@lRz|8e~%2wAT-Ny9XZ0p@~*ZfTs&F#|%ls(&1v&6Y|7EF8@Z2_(sdy6Of8p$J8# zNFuAZ^xq%0Px z4X+)O=`Pfr>$~QV8Mt{pL3D&15W=SYC$n}?i$OjF0M-8vv>^Y^e-KyZiu%-E*6wAW zZ*#@INh~2)iMRXC7A;=uS2_qc0@>=Z?jSHR|A+Qto=lL7nnQEB467>zky3wl6V0uaXUB$9g!pYuD&JXab3 diff --git a/screenshots/dotmatrix-short-round.png b/screenshots/dotmatrix-short-round.png deleted file mode 100644 index 3eb328a68df51403450b9ee87acba21d5720d3d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4252 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 diff --git a/screenshots/dotmatrix-short-slant.png b/screenshots/dotmatrix-short-slant.png deleted file mode 100644 index a49fb4428f88851871890ac5cce5c6283898de93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2623 zcmV-F3c&S=P)89z6-EO;SwVG}02b0E+T30t_7HgGF;|G#e2v`&}yd2# zm>C&nxcxwfopA=|&OPUHZ+Fk{8+Y#cpFd|F&N=to!+AKpUe5!-%ds&q7)m2T?gSW& zw-F^(;K;~GXtmmq_f1bv!|8NNmBzeq9EXUA(0`vi&tqn0W&twthqd1Q}H=-I#ot<#I-J;5BG#c#Lvj=HuX#fDH(}{+L28@i1 z5a;EksHlke_k8~RIijPZk&uu;DXXs`X}^WQGBE+3=ZWL^jbB==78Mm0Fquqv^5n_f z^?`u_3=IvTs;Y{LI9)Cmy1TnYmoF|Zo)aek#Kgp)va*smFE7#2(a`C1RASZF*W>i* z(^O)4A#FdYnVFe^)oi8`D`0|ESXhYE)KoMzHG$`Ocsw37H#Z|UHy1fMIaDg`>FL4L z)RgG*>FMbK*L(#_icY74Mx&t;ORZKTGBT1%EH9+(Cp9*+ncCbqU=GT09IC6UVK5kA zGMQktT4A@_QB_q%r9zL#gU-%Qq8P!34vyo9VtR>;j6_jUk?8VPs}*r^ahRN(gxl@L z&Ye5w^0injh>wpa%8y3-NeR#MFu!_5End(^)aA>UW9{0tXlZFddwV;|%geEN@nR|! z-nnxJlarG~G3<7Gz%|mCUe>K!heeAPi7tQc+&MgW@Bjvb0Y;+{y}i9Sd-g1bhlg?g z{CVR1XtbY{*en)!D9(-NT|=p;sDRC8gIcX7>QQ{*c^|w}v&MX#=<4{^! zN)*H4aG~R2Os?0Z=HAJ#zLa0lHF#*^z^jo z^1%oyP_x;Ln>TNwxVRWOIXSp??HZLOgN}|4;usvqAvZTS;IBV3GZRr!WXrmGy>L6{u+S*!7O-o|XVBBrgTlf>(G?924&vFf zXQImkv&&%Hw{J&AMn=GA)z#G~FE2-9V3_fs-ds0s!1@H_T@9 zTyHe-zhTembmGK`6Hu$wVaKP@em0v8t*zH#u~^XD+>B+*mZGX^3)0im@y(_~P&5+KWR4Ntr z?%f+yoL*vLVz6V!4rFI%haI1!_w?dBys1?;C8#IY^i%2 zlJ3S;`i5GzA(;%?Z;gT>>9^C@*C%CoVwAig8Bl)vN!@z_0LT6>o}pxvJH9a(U;kbEhN58tWhfdZP==!Md)4`aUAyGUgTV+2>p>Zch6$9RXqZ45iiW+5 zXDAxhgEABi6DUK`Fo7}@4HGCs(J+BB6b%z7L(wpSG8D}>&S_5R4syr;_SdlP|HH3; zFHt7{ANUD0YnAw;_uizkvJ%C`#UbyL%PEc20gVKqq6=5d-$W!C;yI2JBu=@U(!zB> z<2VjK-uDx{Tl;+pvtk58k|AE`@rQC9Oc2gtR~*OT7r*)?zW46zseZ9qEiV1zqEx9d z-awKbRLEJIayg}i>wvan*UmX{0>Jw}`zdzreou+O-M)(bk?R^PH8k8(7L<2nMfCy zc?GJ`XrR;Suu9Bdt~|=&VgzPIKWx+X2mZ*N8`hj{>fjZTc>?IvBH18RCnIiUhg5(Quj*1I=^P z)oL{kA3KV?{5-$wBf}&3%dt9}gKotyV*)(}lc`hEtjtXgZ*I z#i=Xw|9u~ijNqf+eu!5Ka3uD(4dNbj!-frlY*pl#djj-4e3&@pfk>cHQBi_6g-GR; z77AJpXraV8@sf#CDu@JHP*5Of&!=2YX*7CICQf+~El`f*1Q}Gx<&;Lt0d3chb_a;_ z$>YaNoC}0#f#&Du&zYsZ4Y{1sXg#_AyQLLYpS`0`9zVwK4l!{q6ru$x$v%^E!u}afIPCaEhN58y hH!u_p6DUK`{1>8;bW*mx_gDY`002ovPDHLkV1gM650d}@ diff --git a/screenshots/dotmatrix-short-text.png b/screenshots/dotmatrix-short-text.png deleted file mode 100644 index cfec6073ecb02affabc1845132430a38dce1c5cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2019 zcmY*ac{tR27at<3LE=rBEM@JrFX=Xxgt5d-#zKe$Vrq&c0wvbQ z!d{9k0mXj$NKzuzbn#>WNb0fmX=Qc$<&oQRr7%;3?TfI!iN0Yy&p%sx_8P05iw4G* zJmhW{(1_lOXo@*7Sx5OmG z(Z!|u$&(aREyBpc!X+Xi;!e)+?I0Fj2~=*CSSqK5FoZ%chlZXFZt|>KyfQaQi*~eOVurM?_%G%(w(g-vk{jF85GZt$`rBc1@WX3x?K{y<){wBSG!C*}D zOG-*C627{21y(w__*_P#l?AI@{v=J&-oc@uql4$GI^yq_5C)za_~k_uq0GG*kCz5e zPfJVlp(iPo^_k7H8R0-q5Pga;wI;*E19rR<9IgR{mL~3O!Q&dxln{2F#s`L#M#~>? z)uWveEmyp1MlV7ff@b*&pSG7Ne#Rv!4myuxc|z13ST2#+-JRVhCOTtI;rbdrH?&gT z@9k|l9?;6NjIiNYD9bGLlR~(yn9l+M>gv^Qpdy^57*vI8#{P{e2~iR7!2|1y@ipu~ zGL>48nVIR-4}m~Xg&U!kaqFOzv9as8d<&YM_e(=#W5$C6k$FU7U$#LKK>%wFK1B)d7L6dgfRyhlES+6kz!0;r&gCz6zpncMTwuR`J^1gNj-n4hYHDhW zU+!=30KM{w*bxr53VC-51msO^Aq89Mfu*H4g$qrp&p^w2} z>Tk3a0^q=HGRYJQp~`{a=IUyVM9LzONT82>^cBuWOb$SKVizu4h_g^GM`(3*bye5a zHUTu7-XxRH9M`>W?d*JHWo3oQWcoIZKOzv4$-;DO%*m%uMTC|U@7ZgdGugY!a7kHp zn4FEs*}un`)+k2)%^fa%ugt3I z^rDxM0i!ap(KFcwUq7pm26-d)s;U<)6ox_uYpS~aE32#1CntUMHnlPQZK-eAuaf3y zp@>A%9wY{88L6C*9VXNfzX^u@VQLxY2%Wea$F zCKxIeeDTBxw6wS~IEdpPpl5osz1N$*r_?~{7=+@B#R2Vvmv`vT;lt3(Vpw3vqaXIv z-z7+qt@vnjJ|4STzN*`=OIyT$)!&RP1D2VYQpR5!ZC`vPpjbrv*Q`WfYlEC%2)hOw H-_-vBP08BJ diff --git a/screenshots/dotmatrix-spaced.png b/screenshots/dotmatrix-spaced.png deleted file mode 100644 index e9983a99317d76896385df6c635856e0e16c5571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6079 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 N=tEt#LY0?+{{;njwY2~M diff --git a/screenshots/variant-chevron.png b/screenshots/variant-chevron.png new file mode 100644 index 0000000000000000000000000000000000000000..774f3e5cf681ce09bfa7f1be8fcb22a7e12ceea5 GIT binary patch literal 35157 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%0DAI+z@; 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 literal 0 HcmV?d00001 diff --git a/screenshots/variant-chevron_colors-green-red.png b/screenshots/variant-chevron_colors-green-red.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e840c45783cc9cb6c726066de6195e45869fa1 GIT binary patch literal 36919 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 QexD#Cp(tJ^`swTc0!Gvh#{d8T literal 0 HcmV?d00001 diff --git a/screenshots/variant-round.png b/screenshots/variant-round.png new file mode 100644 index 0000000000000000000000000000000000000000..ece011984a06eca931a82afccdf9f0dfdd5b3680 GIT binary patch literal 37405 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