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

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