feat: add catppuccin nim-style fallback prompt and overhaul right prompt #47

Merged
rootiest merged 9 commits from feat/catppuccin-fallback-prompt into main 2026-06-12 04:57:37 +00:00
6 changed files with 231 additions and 22 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ abbreviation system for keyboard-driven workflows.
This config layers on top of the CachyOS base Fish configuration and adds: This config layers on top of the CachyOS base Fish configuration and adds:
- **Catppuccin Mocha** theming throughout (prompt, FZF, syntax highlighting) - **Catppuccin Mocha** theming throughout (prompt, FZF, syntax highlighting)
- **Starship** prompt with VI key bindings - **Starship** prompt with VI key bindings; Catppuccin Mocha nim-style fallback prompt when Starship is absent or C3 overrides are disabled
- **Fisher** plugin manager bootstrapped automatically; manages `sponge` (failed-command history filter); FZF bindings, Catppuccin theme, done, autopair, and puffer-fish are bundled directly with the config as customized versions - **Fisher** plugin manager bootstrapped automatically; manages `sponge` (failed-command history filter); FZF bindings, Catppuccin theme, done, autopair, and puffer-fish are bundled directly with the config as customized versions
- **Smart CLI wrappers** that prefer modern tools (`eza`, `bat`, `btop`, `dust`, `prettyping`) with graceful fallbacks - **Smart CLI wrappers** that prefer modern tools (`eza`, `bat`, `btop`, `dust`, `prettyping`) with graceful fallbacks
- **Auto Python venv** activation on directory change (direnv-aware) - **Auto Python venv** activation on directory change (direnv-aware)
+9
View File
@@ -191,6 +191,15 @@ logging-sentinel=#### C5 — Logging and Capture
c6=#### C6 — Greeting and First-Run UI c6=#### C6 — Greeting and First-Run UI
greeting=#### C6 — Greeting and First-Run UI greeting=#### C6 — Greeting and First-Run UI
# ── Prompt and Theme ──────────────────────────────────────────
prompt-theme=## Prompt and Theme
starship=### Starship
fallback-prompt=### Catppuccin Fallback Prompt
catppuccin-prompt=### Catppuccin Fallback Prompt
nim-prompt=### Catppuccin Fallback Prompt
fzf-theme=### FZF
catppuccin-theme=### Catppuccin Mocha Syntax Highlighting
# ── Section 8: Fisher Plugins ───────────────────────────────── # ── Section 8: Fisher Plugins ─────────────────────────────────
plugins=# 8. FISHER PLUGINS plugins=# 8. FISHER PLUGINS
fisher=# 8. FISHER PLUGINS fisher=# 8. FISHER PLUGINS
+32 -2
View File
@@ -1362,7 +1362,7 @@ fish-deps manages these tools. Run `fish-deps` to check status, or
Rust-based tools and to build fish from source. All paths Rust-based tools and to build fish from source. All paths
are gated on type -q cargo and degrade gracefully. are gated on type -q cargo and degrade gracefully.
starship Cross-shell prompt; loaded via type -q starship guard. starship Cross-shell prompt; loaded via type -q starship guard.
Without it fish falls back to its built-in default prompt. Without it the Catppuccin nim-style fallback prompt activates.
uv Python package and project manager (Astral); used by the uv Python package and project manager (Astral); used by the
fish-from-source build path in fish-deps. All consumers fish-from-source build path in fish-deps. All consumers
degrade gracefully without it. degrade gracefully without it.
@@ -1593,7 +1593,7 @@ all of them.
Starship prompt fish_prompt replaced by Starship + OSC 133 markers Starship prompt fish_prompt replaced by Starship + OSC 133 markers
Catppuccin colors 30+ fish_color_* variables set to Mocha palette Catppuccin colors 30+ fish_color_* variables set to Mocha palette
FZF_DEFAULT_OPTS FZF themed to Catppuccin Mocha colors FZF_DEFAULT_OPTS FZF themed to Catppuccin Mocha colors
Right prompt fish_right_prompt: Docker context + timestamp Right prompt fish_right_prompt: exit code (on failure) + dim timestamp; always rendered; Docker context added when starship+C3 active
The bang-bang system spans key_bindings.fish, abbr.fish, puffer.fish, and The bang-bang system spans key_bindings.fish, abbr.fish, puffer.fish, and
six expand_bang_*.fish functions. All are gated together — disabling C3 six expand_bang_*.fish functions. All are gated together — disabling C3
@@ -1694,6 +1694,36 @@ markers on the prompt line itself. This allows ov to use them as sticky
section headers when browsing scrollback logs. Without Starship, fish's section headers when browsing scrollback logs. Without Starship, fish's
built-in prompt handles these markers automatically. built-in prompt handles these markers automatically.
### Catppuccin Fallback Prompt
When Starship is absent or C3 overrides are disabled, a built-in nim-style
two-line prompt activates from functions/fish_prompt.fish. No external
dependencies — fish builtins only.
Layout:
┬─[user@host:~/path] (main)
╰─>$
Elements:
user Yellow (Catppuccin Yellow); red if root
@host Blue (local) or Teal (SSH)
~/path prompt_pwd abbreviation (Catppuccin Text)
(main) Current git branch in Catppuccin Pink; omitted outside repos
─[V:name] Active Python venv basename; omitted when none
─[N/I/R/V] Vi-mode indicator when vi bindings are active
┬─ / ╰─> Connector lines: Catppuccin Green on success, Red on failure
The right prompt (fish_right_prompt.fish) always renders, regardless of C3
state. On failure it shows a red ✘ and the exit code; on success it shows
only the dim timestamp. When starship is installed and C3 is enabled, the
active Docker context is also shown (if non-default):
✘ 1 󰡨 myctx Fri Jun 12 00:51:21 2026 ← failed, starship+C3 active
✘ 1 Fri Jun 12 00:51:21 2026 ← failed, fallback prompt
Fri Jun 12 00:51:21 2026 ← success (no ✘)
### FZF ### FZF
FZF is themed to Catppuccin Mocha via FZF_DEFAULT_OPTS set in FZF is themed to Catppuccin Mocha via FZF_DEFAULT_OPTS set in
+18
View File
@@ -0,0 +1,18 @@
# Copyright (C) 2026 Rootiest
# SPDX-License-Identifier: AGPL-3.0-or-later
#
# SYNOPSIS
# fish_mode_prompt
#
# DESCRIPTION
# Empty override. Suppresses fish's built-in vi-mode prefix ([N]/[I]/etc.)
# that would prepend to the prompt line and break the two-line nim layout.
# Vi-mode display is handled inside fish_prompt itself.
#
# RETURNS
# 0 Always (function body is empty)
#
# EXAMPLE
# # Rendered automatically by fish; not called directly.
function fish_mode_prompt
end
+143
View File
@@ -0,0 +1,143 @@
# Copyright (C) 2026 Rootiest
# SPDX-License-Identifier: AGPL-3.0-or-later
#
# SYNOPSIS
# fish_prompt
#
# DESCRIPTION
# Catppuccin Mocha fallback prompt (nim-style, two-line). Active whenever
# the starship prompt is not available — either starship is not installed or
# C3 overrides are disabled. Has no external dependencies; uses only fish-provided functions
# (set_color, fish_git_prompt, prompt_pwd, prompt_hostname).
#
# RETURNS
# 0 Always; outputs the prompt to stdout
#
# EXAMPLE
# # Rendered automatically by fish; not called directly.
function fish_prompt
set -l last_status $status
# Catppuccin Mocha hex palette
set -l c_green '#a6e3a1'
set -l c_red '#f38ba8'
set -l c_yellow '#f9e2af'
set -l c_text '#cdd6f4'
set -l c_blue '#89b4fa'
set -l c_teal '#94e2d5'
set -l c_pink '#f5c2e7'
set -l c_dim '#6c7086'
set -l c_mauve '#cba6f7'
# Line/connector color tracks last exit status; brackets stay bold green
set -l retc $c_green
test $last_status -ne 0; and set retc $c_red
# Enable upstream arrows in git prompt (↑/↓)
set -q __fish_git_prompt_showupstream
or set -g __fish_git_prompt_showupstream auto
# ─── First line ───────────────────────────────────────────────────────────
set_color $retc
echo -n '┬─'
set_color --bold $c_green
echo -n '['
# Username: red if root, yellow otherwise
if functions -q fish_is_root_user; and fish_is_root_user
set_color --bold $c_red
else
set_color --bold $c_yellow
end
echo -n $USER
set_color --bold $c_text
echo -n '@'
# Hostname: teal if SSH, blue if local
if test -n "$SSH_CLIENT"
set_color --bold $c_teal
else
set_color --bold $c_blue
end
echo -n (prompt_hostname)
set_color --bold $c_text
echo -n ':'
set_color $c_text
echo -n (prompt_pwd)
set_color --bold $c_green
echo -n ']'
set_color normal
# Vi-mode segment ─[N/I/R/V]
if test "$fish_key_bindings" = fish_vi_key_bindings
or test "$fish_key_bindings" = fish_hybrid_key_bindings
set -l mode_str
switch $fish_bind_mode
case default
set mode_str (set_color --bold $c_red)'N'(set_color normal)
case insert
set mode_str (set_color --bold $c_green)'I'(set_color normal)
case replace_one replace
set mode_str (set_color --bold $c_teal)'R'(set_color normal)
case visual
set mode_str (set_color --bold $c_mauve)'V'(set_color normal)
case operator
set mode_str (set_color --bold $c_teal)'O'(set_color normal)
case '*'
set mode_str (set_color --bold $c_dim)'?'(set_color normal)
end
set_color $retc
echo -n '─'
set_color --bold $c_green
echo -n '['
echo -n $mode_str
set_color --bold $c_green
echo -n ']'
set_color normal
end
# Virtual environment segment ─[V:name]
set -q VIRTUAL_ENV_DISABLE_PROMPT
or set -g VIRTUAL_ENV_DISABLE_PROMPT true
if set -q VIRTUAL_ENV
set_color $retc
echo -n '─'
set_color --bold $c_green
echo -n '['
set_color normal
set_color $retc
echo -n 'V:'(path basename "$VIRTUAL_ENV")
set_color --bold $c_green
echo -n ']'
set_color normal
end
# Git branch in Catppuccin Pink, wrapped in parens: (main)
set -l git_info (fish_git_prompt '%s')
if test -n "$git_info"
echo -n ' '
set_color $c_pink
echo -n "($git_info)"
set_color normal
end
echo # newline
# Background jobs (one per line, dim)
for job in (jobs -c)
set_color $retc
echo -n '│ '
set_color $c_dim
echo $job
end
set_color normal
# ─── Second line ──────────────────────────────────────────────────────────
set_color $retc
echo -n '╰─>'
set_color --bold $c_red
echo -n '$ '
set_color normal
end
+28 -19
View File
@@ -1,34 +1,43 @@
# Copyright (C) 2026 Rootiest # Copyright (C) 2026 Rootiest
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
#
# SYNOPSIS # SYNOPSIS
# fish_right_prompt # fish_right_prompt
# #
# DESCRIPTION # DESCRIPTION
# Renders the right-side prompt showing the active Docker context (in blue, # Renders the right-side prompt. Always shows a dim timestamp. When the last
# when non-default) and the current timestamp. # command failed, prefixes it with a red ✘ and the exit code. When starship
# is installed and C3 overrides are enabled, also shows the active Docker
# context (if non-default) — that block is paired with the starship prompt
# which already guards on both conditions.
#
# RETURNS
# 0 Always
# #
# EXAMPLE # EXAMPLE
# # Rendered automatically by Fish shell; not called directly. # # Rendered automatically by fish; not called directly.
function fish_right_prompt --description 'Execute fish_right_prompt' function fish_right_prompt
# Opinionated guard (C3): no right prompt when overrides are disabled. set -l last_status $status
__fish_config_op_enabled __fish_config_op_overrides; or return
# 1. Docker Context in Blue # Failed command: red ✘ + exit code; hidden when 0
set -l docker_ctx (docker context show 2>/dev/null) if test $last_status -ne 0
if test -n "$docker_ctx"; and test "$docker_ctx" != default set_color '#f38ba8'
set_color blue echo -n "$last_status "
echo -n "󰡨 $docker_ctx "
set_color normal set_color normal
end end
# 2. Timestamp Logic with Fallback # Docker context — only relevant alongside the starship prompt
set_color brblack if type -q starship; and __fish_config_op_enabled __fish_config_op_overrides
if type -q __bobthefish_timestamp set -l docker_ctx (docker context show 2>/dev/null)
__bobthefish_timestamp if test -n "$docker_ctx"; and test "$docker_ctx" != default
else set_color blue
# Manual fallback format: Wed Feb 11 15:04:28 2026 echo -n "󰡨 $docker_ctx "
date "+%a %b %d %H:%M:%S %Y" set_color normal
end
end end
# Timestamp — Catppuccin Overlay0 (dim)
set_color '#6c7086'
date "+%a %b %d %H:%M:%S %Y"
set_color normal set_color normal
end end