diff --git a/dotfiles/install/install-linux-global.sh b/dotfiles/install/install-linux-global.sh index 871c75d..4270088 100644 --- a/dotfiles/install/install-linux-global.sh +++ b/dotfiles/install/install-linux-global.sh @@ -27,6 +27,7 @@ season_mode="dynamic" season_choice="" style_choice="aurora" style_pack="standard" +contest_layout="day-time-user" if [[ -t 0 ]]; then echo "Install options:" echo " 1) PS1 only" @@ -66,14 +67,27 @@ if [[ -t 0 ]]; then style_pack="standard" ;; - ""|2) + 2) season_mode="dynamic" style_pack="standard" ;; - 3) + ""|3) season_mode="static" style_pack="contest" - season_choice="winter" + contest_layout="day-time-user" + echo "Contest layout order:" + echo " 1) day-time-user" + echo " 2) user-time" + echo " 3) time-user" + echo " 4) day-time" + read -r -p "Choose [1]: " layout_pick + case "${layout_pick}" in + 2) contest_layout="user-time" ;; + 3) contest_layout="time-user" ;; + 4) contest_layout="day-time" ;; + ""|1) contest_layout="day-time-user" ;; + *) echo "Invalid choice, using day-time-user."; contest_layout="day-time-user" ;; + esac ;; *) echo "Invalid choice, using dynamic." @@ -176,7 +190,13 @@ if [[ "$install_ps1" -eq 1 ]]; then } > /etc/ps1-season chmod 0644 /etc/ps1-season - printf 'PS1_STYLE=%s\n' "$style_choice" > /etc/ps1-style + { + printf 'PS1_STYLE=%s\n' "$style_choice" + printf 'PS1_STYLE_PACK=%s\n' "$style_pack" + if [[ "$style_pack" == "contest" ]]; then + printf 'PS1_CONTEST_LAYOUT=%s\n' "$contest_layout" + fi + } > /etc/ps1-style chmod 0644 /etc/ps1-style else rm -f "$DST_PS1" diff --git a/dotfiles/install/install-macos-user.sh b/dotfiles/install/install-macos-user.sh index 97be7e4..8cc14d0 100644 --- a/dotfiles/install/install-macos-user.sh +++ b/dotfiles/install/install-macos-user.sh @@ -16,6 +16,7 @@ MARKER_END="# <<< user ps1 (managed) <<<" season_mode="dynamic" season_choice="" style_choice="aurora" +contest_layout="day-time-user" if [[ -t 0 ]]; then style_pack="standard" echo "PS1 mode:" @@ -42,14 +43,27 @@ if [[ -t 0 ]]; then style_pack="standard" ;; - ""|2) + 2) season_mode="dynamic" style_pack="standard" ;; - 3) + ""|3) season_mode="static" style_pack="contest" - season_choice="winter" + contest_layout="day-time-user" + echo "Contest layout order:" + echo " 1) day-time-user" + echo " 2) user-time" + echo " 3) time-user" + echo " 4) day-time" + read -r -p "Choose [1]: " layout_pick + case "${layout_pick}" in + 2) contest_layout="user-time" ;; + 3) contest_layout="time-user" ;; + 4) contest_layout="day-time" ;; + ""|1) contest_layout="day-time-user" ;; + *) echo "Invalid choice, using day-time-user."; contest_layout="day-time-user" ;; + esac ;; *) echo "Invalid choice, using dynamic." @@ -97,7 +111,13 @@ chmod 0644 "$DST_PS1" } > "$SEASON_FILE" chmod 0644 "$SEASON_FILE" -printf 'PS1_STYLE=%s\n' "$style_choice" > "$STYLE_FILE" +{ + printf 'PS1_STYLE=%s\n' "$style_choice" + printf 'PS1_STYLE_PACK=%s\n' "$style_pack" + if [[ "$style_pack" == "contest" ]]; then + printf 'PS1_CONTEST_LAYOUT=%s\n' "$contest_layout" + fi +} > "$STYLE_FILE" chmod 0644 "$STYLE_FILE" add_source_block() { diff --git a/dotfiles/ps1/ps1.sh b/dotfiles/ps1/ps1.sh index ff0cc85..0e273f2 100644 --- a/dotfiles/ps1/ps1.sh +++ b/dotfiles/ps1/ps1.sh @@ -91,6 +91,8 @@ _ps1_season() { # Style selection (aurora/neon/forge/circuit/mono) # PS1_STYLE=aurora|neon|forge|circuit|mono +# PS1_STYLE_PACK=standard|contest +# PS1_CONTEST_LAYOUT=day-time-user|user-time|time-user|day-time # Also reads config from /etc/ps1-style or ~/.config/ps1/style _ps1_style_config() { local cfg="" @@ -106,6 +108,8 @@ _ps1_style_config() { v="${v//[[:space:]]/}" case "$k" in PS1_STYLE) export PS1_STYLE="$v" ;; + PS1_STYLE_PACK) export PS1_STYLE_PACK="$v" ;; + PS1_CONTEST_LAYOUT) export PS1_CONTEST_LAYOUT="$v" ;; esac done < "$cfg" fi @@ -117,6 +121,18 @@ _ps1_style() { echo "$style" } +_ps1_style_pack() { + _ps1_style_config + local pack="${PS1_STYLE_PACK:-standard}" + echo "$pack" +} + +_ps1_contest_layout() { + _ps1_style_config + local layout="${PS1_CONTEST_LAYOUT:-day-time-user}" + echo "$layout" +} + # Time-based emoji with seasonal accents (Europe/Oslo) _ps1_pick_icon() { local list_name="$1" @@ -150,9 +166,17 @@ _ps1_symbol() { h=$((10#$hh)); m=$((10#$mm)) local season="${__PS1_SEASON:-winter}" + local pack="${__PS1_STYLE_PACK:-standard}" + local rot_season="${season}" local sunrise coffee work evening night local -a sunrise_list work_list + if [[ "$pack" == "contest" ]]; then + rot_season="winter" + sunrise_list=( "โšก๏ธ" "๐Ÿ›ฐ๏ธ" "๐Ÿงฌ" "๐Ÿง " ) + work_list=( "๐Ÿ› ๏ธ" "๐Ÿ’พ" "๐Ÿงช" "๐Ÿงฉ" ) + coffee="โ˜•"; evening="๐ŸŽ›๏ธ"; night="๐Ÿ•ถ๏ธ" + else case "$season" in spring) sunrise_list=( "๐ŸŒท" "๐ŸŒฑ" "๐Ÿฃ" "๐ŸŒค" ) @@ -175,9 +199,10 @@ _ps1_symbol() { coffee="โ˜•"; evening="๐ŸŒ†"; night="๐ŸŒ™" ;; esac + fi - sunrise="$(_ps1_pick_icon sunrise_list "$season")" - work="$(_ps1_pick_icon work_list "$season")" + sunrise="$(_ps1_pick_icon sunrise_list "$rot_season")" + work="$(_ps1_pick_icon work_list "$rot_season")" if (( h >= 5 && h <= 8 )); then echo "$sunrise" elif (( h >= 9 && h <= 10 )); then echo "$coffee" @@ -211,47 +236,58 @@ __PS1_STATUS=0 __PS1_USE_NF=0 __PS1_SEASON="winter" __PS1_STYLE="aurora" +__PS1_STYLE_PACK="standard" +__PS1_CONTEST_LAYOUT="day-time-user" _ps1_set_prompt() { local RST="\[\e[0m\]" # Seasonal palettes (Z1 is darker than Z2) local Z1_BG Z1_FG Z2_BG Z2_FG PATH_FG FRAME - case "$__PS1_SEASON" in - spring) - Z1_BG="\[\e[48;5;71m\]" - Z1_FG="\[\e[38;5;255m\]" - Z2_BG="\[\e[48;5;120m\]" - Z2_FG="\[\e[38;5;22m\]" - PATH_FG="\[\e[38;5;22m\]" - FRAME="\[\e[38;5;65m\]" - ;; - summer) - Z1_BG="\[\e[48;5;142m\]" - Z1_FG="\[\e[38;5;255m\]" - Z2_BG="\[\e[48;5;214m\]" - Z2_FG="\[\e[38;5;0m\]" - PATH_FG="\[\e[38;5;232m\]" - FRAME="\[\e[38;5;130m\]" - ;; - autumn) - Z1_BG="\[\e[48;5;95m\]" - Z1_FG="\[\e[38;5;255m\]" - Z2_BG="\[\e[48;5;173m\]" - Z2_FG="\[\e[38;5;255m\]" - PATH_FG="\[\e[38;5;223m\]" - FRAME="\[\e[38;5;95m\]" - ;; - *) - # winter (default) - Z1_BG="\[\e[48;5;61m\]" - Z1_FG="\[\e[38;5;255m\]" - Z2_BG="\[\e[48;5;37m\]" - Z2_FG="\[\e[38;5;255m\]" - PATH_FG="\[\e[38;5;194m\]" - FRAME="\[\e[38;5;60m\]" - ;; - esac + if [[ "$__PS1_STYLE_PACK" == "contest" ]]; then + Z1_BG="\[\e[48;5;24m\]" + Z1_FG="\[\e[38;5;255m\]" + Z2_BG="\[\e[48;5;31m\]" + Z2_FG="\[\e[38;5;255m\]" + PATH_FG="\[\e[38;5;51m\]" + FRAME="\[\e[38;5;23m\]" + else + case "$__PS1_SEASON" in + spring) + Z1_BG="\[\e[48;5;71m\]" + Z1_FG="\[\e[38;5;255m\]" + Z2_BG="\[\e[48;5;120m\]" + Z2_FG="\[\e[38;5;22m\]" + PATH_FG="\[\e[38;5;22m\]" + FRAME="\[\e[38;5;65m\]" + ;; + summer) + Z1_BG="\[\e[48;5;142m\]" + Z1_FG="\[\e[38;5;255m\]" + Z2_BG="\[\e[48;5;214m\]" + Z2_FG="\[\e[38;5;0m\]" + PATH_FG="\[\e[38;5;232m\]" + FRAME="\[\e[38;5;130m\]" + ;; + autumn) + Z1_BG="\[\e[48;5;95m\]" + Z1_FG="\[\e[38;5;255m\]" + Z2_BG="\[\e[48;5;173m\]" + Z2_FG="\[\e[38;5;255m\]" + PATH_FG="\[\e[38;5;223m\]" + FRAME="\[\e[38;5;95m\]" + ;; + *) + # winter (default) + Z1_BG="\[\e[48;5;61m\]" + Z1_FG="\[\e[38;5;255m\]" + Z2_BG="\[\e[48;5;37m\]" + Z2_FG="\[\e[38;5;255m\]" + PATH_FG="\[\e[38;5;194m\]" + FRAME="\[\e[38;5;60m\]" + ;; + esac + fi # Status colors local OK="\[\e[38;5;76m\]" @@ -276,6 +312,23 @@ _ps1_set_prompt() { local style="${__PS1_STYLE:-aurora}" local L1="\\d \\A \\u" local L_HOST="@\\h" + local PREFIX="" + local HOST_PART="${L_HOST}" + local PATH_PART="${__PS1_PATH}" + local PATH_SEP=" " + if [[ "$__PS1_STYLE_PACK" == "contest" ]]; then + local layout="${__PS1_CONTEST_LAYOUT:-day-time-user}" + case "$layout" in + user-time) L1="\\u \\A" ;; + time-user) L1="\\A \\u" ;; + day-time) L1="\\d \\A" ;; + *) L1="\\d \\A \\u" ;; + esac + HOST_PART="@\\h - ${__PS1_PATH}" + PATH_PART="" + PATH_SEP="" + PREFIX="\n" + fi case "$style" in neon) @@ -286,9 +339,9 @@ _ps1_set_prompt() { local N_PATH_FG="\[\e[38;5;16m\]" local N_FRAME="\[\e[38;5;199m\]" PS1="\ -${N_FRAME}โ•ญโ”€${RST}\ +${PREFIX}${N_FRAME}โ•ญโ”€${RST}\ ${N1_BG}${N1_FG}${left} ${BOLD}\\u${NOBOLD} \\d \\A ${RST}${N1_BG}${N2_BG}${N2_FG}${sep}${RST}\ -${N2_BG}${N2_FG} ${L_HOST} ${N_PATH_FG}${__PS1_PATH}${RST}${N2_BG}${N2_FG}${right}${RST}\ +${N2_BG}${N2_FG} ${HOST_PART}${PATH_SEP}${N_PATH_FG}${PATH_PART}${RST}${N2_BG}${N2_FG}${right}${RST}\ \n${N_FRAME}โ•ฐโ”€โ”€ ${RST}${prompt_sym} ${__PS1_SYM} " ;; forge) @@ -299,9 +352,9 @@ ${N2_BG}${N2_FG} ${L_HOST} ${N_PATH_FG}${__PS1_PATH}${RST}${N2_BG}${N2_FG}${righ local F_PATH_FG="\[\e[38;5;224m\]" local F_FRAME="\[\e[38;5;130m\]" PS1="\ -${F_FRAME}โ•ญโ”€${RST}\ +${PREFIX}${F_FRAME}โ•ญโ”€${RST}\ ${F1_BG}${F1_FG}${left} ${BOLD}${L1}${NOBOLD} ${RST}${F1_BG}${F2_BG}${F2_FG}${sep}${RST}\ -${F2_BG}${F2_FG} ${L_HOST} ${F_PATH_FG}${__PS1_PATH}${RST}${F2_BG}${F2_FG}${right}${RST}\ +${F2_BG}${F2_FG} ${HOST_PART}${PATH_SEP}${F_PATH_FG}${PATH_PART}${RST}${F2_BG}${F2_FG}${right}${RST}\ \n${F_FRAME}โ•ฐโ”€โ”€ ${RST}${prompt_sym} ${__PS1_SYM} " ;; circuit) @@ -309,23 +362,23 @@ ${F2_BG}${F2_FG} ${L_HOST} ${F_PATH_FG}${__PS1_PATH}${RST}${F2_BG}${F2_FG}${righ local C_DIM="\[\e[38;5;22m\]" local C_PATH="\[\e[38;5;120m\]" PS1="\ -${C_DIM}โ”โ”${RST}${C_FG}[${BOLD}\\u${NOBOLD} ${RST}${C_FG}\\A${RST}${C_DIM}]${RST}\ -${C_DIM}โ”${RST}${C_FG}${L_HOST}${RST} ${C_PATH}${__PS1_PATH}${RST}\ +${PREFIX}${C_DIM}โ”โ”${RST}${C_FG}[${BOLD}\\u${NOBOLD} ${RST}${C_FG}\\A${RST}${C_DIM}]${RST}\ +${C_DIM}โ”${RST}${C_FG}${HOST_PART}${RST}${PATH_SEP}${C_PATH}${PATH_PART}${RST}\ \n${C_DIM}โ”—โ”${RST}${prompt_sym} ${__PS1_SYM} " ;; mono) local M_FG="\[\e[38;5;250m\]" local M_DIM="\[\e[38;5;240m\]" PS1="\ -${M_FG}โŸฆ${L1}โŸง ${M_DIM}${L_HOST} ${M_FG}${__PS1_PATH}${RST}\ +${PREFIX}${M_FG}โŸฆ${L1}โŸง ${M_DIM}${HOST_PART}${PATH_SEP}${M_FG}${PATH_PART}${RST}\ \n${M_DIM}โ””โ”€${RST}${prompt_sym} ${__PS1_SYM} " ;; *) # aurora (default) PS1="\ -${FRAME}โ•ญโ”€${RST}\ +${PREFIX}${FRAME}โ•ญโ”€${RST}\ ${Z1_BG}${Z1_FG}${left} ${L1} ${RST}${Z1_BG}${Z2_BG}${Z2_FG}${sep}${RST}\ -${Z2_BG}${Z2_FG} ${L_HOST} ${PATH_FG}${__PS1_PATH}${RST}${Z2_BG}${Z2_FG}${right}${RST}\ +${Z2_BG}${Z2_FG} ${HOST_PART}${PATH_SEP}${PATH_FG}${PATH_PART}${RST}${Z2_BG}${Z2_FG}${right}${RST}\ \n${FRAME}โ•ฐโ”€โ”€ ${RST}${prompt_sym} ${__PS1_SYM} " ;; esac @@ -334,6 +387,8 @@ ${Z2_BG}${Z2_FG} ${L_HOST} ${PATH_FG}${__PS1_PATH}${RST}${Z2_BG}${Z2_FG}${right} _ps1_update() { __PS1_STATUS=$? __PS1_SEASON="$(_ps1_season)" + __PS1_STYLE_PACK="$(_ps1_style_pack)" + __PS1_CONTEST_LAYOUT="$(_ps1_contest_layout)" __PS1_STYLE="$(_ps1_style)" __PS1_SYM="$(_ps1_symbol)" __PS1_PATH="$(_ps1_path)"