From e354721927a3aa6b9b039599f666544a5c02b0b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robin-Charles=20Guih=C3=A9neuf?= Date: Thu, 10 Sep 2026 21:28:23 +0200 Subject: [PATCH] theme: Add color palettes --- .zshrc | 3 + vulporuza-palettes.zsh | 123 +++++++++++++++++++++++++++++++++++++++++ vulporuza.zsh-theme | 53 ++++++++++-------- 3 files changed, 157 insertions(+), 22 deletions(-) create mode 100644 vulporuza-palettes.zsh diff --git a/.zshrc b/.zshrc index 7d6ccfe..4fc1d10 100644 --- a/.zshrc +++ b/.zshrc @@ -10,6 +10,9 @@ export ZSH="$HOME/.oh-my-zsh" # See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes ZSH_THEME="vulporuza" +# Palettes: ~/.dotfiles/vulporuza-palettes.zsh +VULPORUZA_PALETTE=vuru + # Set list of themes to pick from when loading at random # Setting this variable when ZSH_THEME=random will cause zsh to load # a theme from this variable instead of looking in $ZSH/themes/ diff --git a/vulporuza-palettes.zsh b/vulporuza-palettes.zsh new file mode 100644 index 0000000..3030deb --- /dev/null +++ b/vulporuza-palettes.zsh @@ -0,0 +1,123 @@ +# vulporuza-palettes.zsh +# Sourced by vulporuza.zsh-theme. Requires Oh My Zsh spectrum ($FG) and colors. +# +# Select one with VULPORUZA_PALETTE in ~/.zshrc (before Oh My Zsh): +# vuru | fox | frost | tokyo | quiet + +typeset -ga _vulporuza_keys +_vulporuza_keys=( + dash path branch venv host dirty clean + staged conflicts changed untracked stashed + upstream state error +) + +typeset -gA _vulporuza_p_vuru +_vulporuza_p_vuru=( + dash "$FG[240]" + path "$FG[208]" + branch "%{$fg_bold[magenta]%}" + venv "$FG[075]" + host "$FG[245]" + dirty "$FG[075]" + clean "$FG[034]" + staged "%{$fg[red]%}" + conflicts "%{$fg[red]%}" + changed "%{$fg[blue]%}" + untracked "%{$fg[cyan]%}" + stashed "%{$fg_bold[blue]%}" + upstream "%{$fg[blue]%}" + state "%{$fg_bold[magenta]%}" + error "%{$fg[red]%}" +) + +typeset -gA _vulporuza_p_fox +_vulporuza_p_fox=( + dash "$FG[236]" + path "$FG[166]" + branch "$FG[180]" + venv "$FG[073]" + host "$FG[240]" + dirty "$FG[172]" + clean "$FG[107]" + staged "$FG[167]" + conflicts "$FG[167]" + changed "$FG[109]" + untracked "$FG[080]" + stashed "$FG[110]" + upstream "$FG[109]" + state "$FG[180]" + error "$FG[167]" +) + +typeset -gA _vulporuza_p_frost +_vulporuza_p_frost=( + dash "$FG[237]" + path "$FG[109]" + branch "$FG[110]" + venv "$FG[108]" + host "$FG[243]" + dirty "$FG[173]" + clean "$FG[114]" + staged "$FG[167]" + conflicts "$FG[167]" + changed "$FG[109]" + untracked "$FG[080]" + stashed "$FG[110]" + upstream "$FG[110]" + state "$FG[139]" + error "$FG[167]" +) + +typeset -gA _vulporuza_p_tokyo +_vulporuza_p_tokyo=( + dash "$FG[237]" + path "$FG[111]" + branch "$FG[141]" + venv "$FG[080]" + host "$FG[242]" + dirty "$FG[215]" + clean "$FG[114]" + staged "$FG[167]" + conflicts "$FG[167]" + changed "$FG[109]" + untracked "$FG[087]" + stashed "$FG[110]" + upstream "$FG[111]" + state "$FG[141]" + error "$FG[167]" +) + +typeset -gA _vulporuza_p_quiet +_vulporuza_p_quiet=( + dash "$FG[238]" + path "$FG[208]" + branch "$FG[250]" + venv "$FG[244]" + host "$FG[240]" + dirty "$FG[244]" + clean "$FG[034]" + staged "$FG[167]" + conflicts "$FG[167]" + changed "$FG[109]" + untracked "$FG[080]" + stashed "$FG[110]" + upstream "$FG[244]" + state "$FG[250]" + error "$FG[167]" +) + +_vulporuza_apply_palette() { + emulate -L zsh + local name=${VULPORUZA_PALETTE:-vuru} + if ! (( ${+parameters[_vulporuza_p_$name]} )); then + print -u2 "vulporuza: unknown VULPORUZA_PALETTE '${name}', using vuru" + name=vuru + VULPORUZA_PALETTE=vuru + fi + typeset -gA _vulporuza + _vulporuza=() + local key + for key in "${_vulporuza_keys[@]}"; do + eval "_vulporuza[\$key]=\${_vulporuza_p_${name}[\$key]}" + done +} diff --git a/vulporuza.zsh-theme b/vulporuza.zsh-theme index 0ba17aa..953b4fd 100644 --- a/vulporuza.zsh-theme +++ b/vulporuza.zsh-theme @@ -1,6 +1,17 @@ # vulporuza.zsh-theme +# +# Palette: set VULPORUZA_PALETTE in ~/.zshrc before Oh My Zsh. +# Definitions: vulporuza-palettes.zsh (same directory). -typeset my_gray="$FG[240]" +typeset _vulporuza_dir="${${(%):-%x}:A:h}" +if ! source "${_vulporuza_dir}/vulporuza-palettes.zsh"; then + print -u2 "vulporuza: missing ${_vulporuza_dir}/vulporuza-palettes.zsh" + unset _vulporuza_dir + return +fi +unset _vulporuza_dir + +_vulporuza_apply_palette # Optional widgets: zsh-git-prompt and virtualenv plugin may be missing. if (( $+functions[git_super_status] )); then @@ -16,48 +27,46 @@ else fi # Primary prompt -PS1='$my_gray${(r:$COLUMNS::-:)}%{$reset_color%} -╭ %T %{$FG[208]%}%~%{$reset_color%}'$_vulporuza_git' +PS1='${_vulporuza[dash]}${(r:$COLUMNS::-:)}%{$reset_color%} +╭ %T ${_vulporuza[path]}%~%{$reset_color%}'$_vulporuza_git' ╰'$_vulporuza_venv' %(!.#.») ' -PS2='%{$fg[red]%}\ %{$reset_color%}' +PS2='${_vulporuza[error]}\ %{$reset_color%}' -# Cleanup unset _vulporuza_git _vulporuza_venv # Right prompt -RPS1='%(?..%{$fg[red]%}%? ↵%{$reset_color%}) $FG[245]%n@%m%{$reset_color%}' +RPS1='%(?..${_vulporuza[error]}%? ↵%{$reset_color%}) ${_vulporuza[host]}%n@%m%{$reset_color%}' # Virtualenv (plugin virtualenv) -ZSH_THEME_VIRTUALENV_PREFIX=" %{$FG[075]%}(" +ZSH_THEME_VIRTUALENV_PREFIX=" ${_vulporuza[venv]}(" ZSH_THEME_VIRTUALENV_SUFFIX=")%{$reset_color%}" -# Git theme +# Git: shared wrapper ZSH_THEME_GIT_PROMPT_PREFIX=" %{$reset_color%}[" ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}]" if (( $+functions[git_super_status] )); then ZSH_THEME_GIT_PROMPT_HASH_PREFIX=":" ZSH_THEME_GIT_PROMPT_SEPARATOR="|" - ZSH_THEME_GIT_PROMPT_BRANCH="%{$fg_bold[magenta]%}" - ZSH_THEME_GIT_PROMPT_STAGED="%{$fg[red]%}%{●%1G%}" - ZSH_THEME_GIT_PROMPT_CONFLICTS="%{$fg[red]%}%{✖%1G%}" - ZSH_THEME_GIT_PROMPT_CHANGED="%{$fg[blue]%}%{✚%1G%}" + ZSH_THEME_GIT_PROMPT_BRANCH="${_vulporuza[branch]}" + ZSH_THEME_GIT_PROMPT_STAGED="${_vulporuza[staged]}%{●%1G%}" + ZSH_THEME_GIT_PROMPT_CONFLICTS="${_vulporuza[conflicts]}%{✖%1G%}" + ZSH_THEME_GIT_PROMPT_CHANGED="${_vulporuza[changed]}%{✚%1G%}" ZSH_THEME_GIT_PROMPT_BEHIND="%{↓%1G%}" ZSH_THEME_GIT_PROMPT_AHEAD="%{↑%1G%}" - ZSH_THEME_GIT_PROMPT_STASHED="%{$fg_bold[blue]%}%{⚑%1G%}" - ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg[cyan]%}%{…%1G%}" - ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg_bold[green]%}%{✔%1G%}" + ZSH_THEME_GIT_PROMPT_STASHED="${_vulporuza[stashed]}%{⚑%1G%}" + ZSH_THEME_GIT_PROMPT_UNTRACKED="${_vulporuza[untracked]}%{…%1G%}" + ZSH_THEME_GIT_PROMPT_CLEAN="${_vulporuza[clean]}%{✔%1G%}" ZSH_THEME_GIT_PROMPT_LOCAL=" L" - # The remote branch will be shown between these two - ZSH_THEME_GIT_PROMPT_UPSTREAM_FRONT=" {%{$fg[blue]%}" + ZSH_THEME_GIT_PROMPT_UPSTREAM_FRONT=" {${_vulporuza[upstream]}" ZSH_THEME_GIT_PROMPT_UPSTREAM_END="%{${reset_color}%}}" - ZSH_THEME_GIT_PROMPT_MERGING="%{$fg_bold[magenta]%}|MERGING%{${reset_color}%}" - ZSH_THEME_GIT_PROMPT_REBASE="%{$fg_bold[magenta]%}|REBASE%{${reset_color}%} " - ZSH_THEME_GIT_PROMPT_BISECT="%{$fg_bold[magenta]%}|BISECT%{${reset_color}%} " + ZSH_THEME_GIT_PROMPT_MERGING="${_vulporuza[state]}|MERGING%{${reset_color}%}" + ZSH_THEME_GIT_PROMPT_REBASE="${_vulporuza[state]}|REBASE%{${reset_color}%} " + ZSH_THEME_GIT_PROMPT_BISECT="${_vulporuza[state]}|BISECT%{${reset_color}%} " else - ZSH_THEME_GIT_PROMPT_CLEAN="%{$reset_color%}|%{$FG[034]%}✔" - ZSH_THEME_GIT_PROMPT_DIRTY="%{$reset_color%}|%{$FG[075]%}…" + ZSH_THEME_GIT_PROMPT_CLEAN="%{$reset_color%}|${_vulporuza[clean]}✔" + ZSH_THEME_GIT_PROMPT_DIRTY="%{$reset_color%}|${_vulporuza[dirty]}…" fi function theme_preexec {