Add selectable PS1 styles

- Implement 5 bold styles and style config

- Prompt for style selection in installers
This commit is contained in:
2026-01-24 10:04:14 +00:00
parent da123e9574
commit a737cf90dd
3 changed files with 138 additions and 4 deletions

View File

@@ -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

View File

@@ -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"

View File

@@ -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