From a737cf90dd2c45b4cade579cace468c3563869a5 Mon Sep 17 00:00:00 2001 From: steffen Date: Sat, 24 Jan 2026 10:04:14 +0000 Subject: [PATCH] Add selectable PS1 styles - Implement 5 bold styles and style config - Prompt for style selection in installers --- dotfiles/install/install-linux-global.sh | 27 ++++++++ dotfiles/install/install-macos-user.sh | 27 ++++++++ dotfiles/ps1/ps1.sh | 88 ++++++++++++++++++++++-- 3 files changed, 138 insertions(+), 4 deletions(-) diff --git a/dotfiles/install/install-linux-global.sh b/dotfiles/install/install-linux-global.sh index b4cb126..94f9aa8 100644 --- a/dotfiles/install/install-linux-global.sh +++ b/dotfiles/install/install-linux-global.sh @@ -25,6 +25,7 @@ install_ps1=1 install_banner=1 season_mode="dynamic" season_choice="" +style_choice="aurora" if [[ -t 0 ]]; then echo "Install options:" echo " 1) PS1 only" @@ -69,6 +70,28 @@ if [[ -t 0 ]]; then season_mode="dynamic" ;; esac + + echo + echo "Style presets:" + echo " 1) Aurora - Powerline blocks, seasonal palette, two-line" + echo " Preview: [date time user] > [@host /path]" + echo " 2) Neon - Magenta/cyan cyber blocks, high contrast" + echo " Preview: [user time] > [@host /path]" + echo " 3) Forge - Warm copper blocks, heavy frame" + echo " Preview: [date time user] > [@host /path]" + echo " 4) Circuit - Green scanline, minimal rails" + echo " Preview: [user time] - @host /path" + echo " 5) Mono - Clean monochrome, fast read" + echo " Preview: [date time user] @host /path" + read -r -p "Choose style [1]: " style_pick + case "${style_pick}" in + 2) style_choice="neon" ;; + 3) style_choice="forge" ;; + 4) style_choice="circuit" ;; + 5) style_choice="mono" ;; + ""|1) style_choice="aurora" ;; + *) echo "Invalid choice, using aurora."; style_choice="aurora" ;; + esac fi fi @@ -137,9 +160,13 @@ if [[ "$install_ps1" -eq 1 ]]; then fi } > /etc/ps1-season chmod 0644 /etc/ps1-season + + printf 'PS1_STYLE=%s\n' "$style_choice" > /etc/ps1-style + chmod 0644 /etc/ps1-style else rm -f "$DST_PS1" rm -f /etc/ps1-season + rm -f /etc/ps1-style fi if [[ "$install_banner" -eq 1 ]]; then diff --git a/dotfiles/install/install-macos-user.sh b/dotfiles/install/install-macos-user.sh index 8730a0e..57b2f9a 100644 --- a/dotfiles/install/install-macos-user.sh +++ b/dotfiles/install/install-macos-user.sh @@ -8,12 +8,14 @@ SRC_PS1="$REPO_ROOT/ps1/ps1.sh" DST_DIR="$HOME/.config/ps1" DST_PS1="$DST_DIR/ps1.sh" SEASON_FILE="$DST_DIR/season" +STYLE_FILE="$DST_DIR/style" MARKER_START="# >>> user ps1 (managed) >>>" MARKER_END="# <<< user ps1 (managed) <<<" season_mode="dynamic" season_choice="" +style_choice="aurora" if [[ -t 0 ]]; then echo "Season mode:" echo " 1) Dynamic (auto by date)" @@ -44,6 +46,28 @@ if [[ -t 0 ]]; then season_mode="dynamic" ;; esac + + echo + echo "Style presets:" + echo " 1) Aurora - Powerline blocks, seasonal palette, two-line" + echo " Preview: [date time user] > [@host /path]" + echo " 2) Neon - Magenta/cyan cyber blocks, high contrast" + echo " Preview: [user time] > [@host /path]" + echo " 3) Forge - Warm copper blocks, heavy frame" + echo " Preview: [date time user] > [@host /path]" + echo " 4) Circuit - Green scanline, minimal rails" + echo " Preview: [user time] - @host /path" + echo " 5) Mono - Clean monochrome, fast read" + echo " Preview: [date time user] @host /path" + read -r -p "Choose style [1]: " style_pick + case "${style_pick}" in + 2) style_choice="neon" ;; + 3) style_choice="forge" ;; + 4) style_choice="circuit" ;; + 5) style_choice="mono" ;; + ""|1) style_choice="aurora" ;; + *) echo "Invalid choice, using aurora."; style_choice="aurora" ;; + esac fi mkdir -p "$DST_DIR" @@ -58,6 +82,9 @@ chmod 0644 "$DST_PS1" } > "$SEASON_FILE" chmod 0644 "$SEASON_FILE" +printf 'PS1_STYLE=%s\n' "$style_choice" > "$STYLE_FILE" +chmod 0644 "$STYLE_FILE" + add_source_block() { local file="$1" [[ -f "$file" ]] || touch "$file" diff --git a/dotfiles/ps1/ps1.sh b/dotfiles/ps1/ps1.sh index 88a2b97..ff0cc85 100644 --- a/dotfiles/ps1/ps1.sh +++ b/dotfiles/ps1/ps1.sh @@ -89,6 +89,34 @@ _ps1_season() { fi } +# Style selection (aurora/neon/forge/circuit/mono) +# PS1_STYLE=aurora|neon|forge|circuit|mono +# Also reads config from /etc/ps1-style or ~/.config/ps1/style +_ps1_style_config() { + local cfg="" + if [[ -r /etc/ps1-style ]]; then + cfg="/etc/ps1-style" + elif [[ -r "$HOME/.config/ps1/style" ]]; then + cfg="$HOME/.config/ps1/style" + fi + + if [[ -n "$cfg" ]]; then + while IFS='=' read -r k v; do + k="${k//[[:space:]]/}" + v="${v//[[:space:]]/}" + case "$k" in + PS1_STYLE) export PS1_STYLE="$v" ;; + esac + done < "$cfg" + fi +} + +_ps1_style() { + _ps1_style_config + local style="${PS1_STYLE:-aurora}" + echo "$style" +} + # Time-based emoji with seasonal accents (Europe/Oslo) _ps1_pick_icon() { local list_name="$1" @@ -182,6 +210,7 @@ __PS1_PATH="" __PS1_STATUS=0 __PS1_USE_NF=0 __PS1_SEASON="winter" +__PS1_STYLE="aurora" _ps1_set_prompt() { local RST="\[\e[0m\]" @@ -244,17 +273,68 @@ _ps1_set_prompt() { prompt_sym="${BAD}${BOLD}➜${NOBOLD}${RST}" fi - # Keep order: date time user | host path, newline, then prompt - PS1="\ + local style="${__PS1_STYLE:-aurora}" + local L1="\\d \\A \\u" + local L_HOST="@\\h" + + case "$style" in + neon) + local N1_BG="\[\e[48;5;201m\]" + local N1_FG="\[\e[38;5;255m\]" + local N2_BG="\[\e[48;5;45m\]" + local N2_FG="\[\e[38;5;16m\]" + local N_PATH_FG="\[\e[38;5;16m\]" + local N_FRAME="\[\e[38;5;199m\]" + PS1="\ +${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}\ +\n${N_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM} " + ;; + forge) + local F1_BG="\[\e[48;5;94m\]" + local F1_FG="\[\e[38;5;230m\]" + local F2_BG="\[\e[48;5;166m\]" + local F2_FG="\[\e[38;5;231m\]" + local F_PATH_FG="\[\e[38;5;224m\]" + local F_FRAME="\[\e[38;5;130m\]" + PS1="\ +${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}\ +\n${F_FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM} " + ;; + circuit) + local C_FG="\[\e[38;5;46m\]" + 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}\ +\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}\ +\n${M_DIM}└─${RST}${prompt_sym} ${__PS1_SYM} " + ;; + *) + # aurora (default) + PS1="\ ${FRAME}╭─${RST}\ -${Z1_BG}${Z1_FG}${left} \\d \\A \\u ${RST}${Z1_BG}${Z2_BG}${Z2_FG}${sep}${RST}\ -${Z2_BG}${Z2_FG} @\\h ${PATH_FG}${__PS1_PATH}${RST}${Z2_BG}${Z2_FG}${right}${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}\ \n${FRAME}╰── ${RST}${prompt_sym} ${__PS1_SYM} " + ;; + esac } _ps1_update() { __PS1_STATUS=$? __PS1_SEASON="$(_ps1_season)" + __PS1_STYLE="$(_ps1_style)" __PS1_SYM="$(_ps1_symbol)" __PS1_PATH="$(_ps1_path)" if _ps1_has_nf; then __PS1_USE_NF=1; else __PS1_USE_NF=0; fi