Skip to content

Zellij-style tmux status bar, unified catppuccin theming, and shell improvements#12

Merged
tyvsmith merged 27 commits intomainfrom
feat/tmux-zellij-style
Mar 2, 2026
Merged

Zellij-style tmux status bar, unified catppuccin theming, and shell improvements#12
tyvsmith merged 27 commits intomainfrom
feat/tmux-zellij-style

Conversation

@tyvsmith
Copy link
Copy Markdown
Owner

@tyvsmith tyvsmith commented Mar 1, 2026

Summary

  • Tmux status bar redesign: Zellij-inspired catppuccin mocha theme with two-tone pills, blue/orange tab colors, dim pane borders, dotted divider line, and mode indicator (normal/prefix/copy)
  • Tmux config split: Status bar theming extracted into statusbar.conf (pre-TPM) and statusbar-overrides.conf (post-TPM) for maintainability
  • tmux-which-key plugin: Keybinding discovery menu (prefix+Space) with all dotfiles bindings organized into categories
  • Zellij status bar: Matching two-tone mode/session pills with lowercase text, session count replacing session name, catppuccin pill styling
  • Fish greeting throttle: CLI tips now show once every 6 hours instead of every new terminal

Details

Tmux

  • Catppuccin mocha pills with colored text matching each pill's primary color (flamingo app, mauve host, blue session, green/mauve/yellow mode)
  • Icons matching Zellij: 󰍹 monitor (host), `` terminal-tmux (session), 󰌶 lightbulb outline (mode)
  • Removed CPU plugin, auto-hide status bar, and right-status click handlers
  • Post-TPM overrides for pane borders and pill styles (catppuccin overwrites at load time)

Zellij

  • zjstatus pills converted to two-tone style (colored icon left, surface bg text right)
  • Mode indicators use lowercase text with lightbulb outline icon
  • Session name replaced with active session count via zellij list-sessions | grep -cv EXITED

Fish

  • fish_greeting writes timestamp to ~/.cache/fish_greeting_stamp, only shows tips after 6-hour cooldown

Copilot AI review requested due to automatic review settings March 1, 2026 23:42
tyvsmith added 27 commits March 1, 2026 15:43
- Pane borders: single-line, dim (#313244/#45475a) to match Zellij's subtle separators
- Status divider: replace dotted line with thin solid line (─) in matching dim color
- Add tmux-which-key plugin for on-demand keybinding discovery (prefix+Space)
- Custom which-key config with all dotfiles keybindings organized by category
… pill position

- Restore corrupted powerline separator glyphs (U+E0B6/U+E0B4)
- Move pane border overrides after TPM run (catppuccin was overwriting them)
- Add rounded powerline ends to mode indicator pill, move to end of status-right
- Fix tmux-which-key syntax errors: use macros for commands with nested quotes
- Use upper-eighth-block character for thinner divider line
@tyvsmith tyvsmith force-pushed the feat/tmux-zellij-style branch from 9f497e3 to 01d6562 Compare March 1, 2026 23:44
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the terminal-multiplexer UX across tmux and zellij to a unified Catppuccin Mocha “Zellij-style” status bar/pill aesthetic, adds tmux keybinding discovery via tmux-which-key, and makes a couple of fish interactive-shell quality-of-life tweaks (tip throttle + abbr cleanup).

Changes:

  • Add a new Zellij default layout using zjstatus with two-tone pills + session-count widget, and extend Zellij config with autolock, new keybinds, and a custom “subtle borders” theme.
  • Redesign tmux status bar and split configuration into pre-TPM (statusbar.conf) and post-TPM (statusbar-overrides.conf) files; add tmux-which-key plugin + config.
  • Throttle fish_greeting tips to once per 6 hours and clean up / extend fish abbreviations.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
dot_config/zellij/layouts/default.kdl New default layout using zjstatus to implement the Zellij-style pill status bars.
dot_config/zellij/config.kdl.tmpl Adds autolock plugin + keybind integrations and defines/sets a custom subtle Catppuccin theme.
dot_config/tmux/tmux.conf.tmpl Switches tmux status bar config to sourced files, removes cpu plugin, adds tmux-which-key plugin.
dot_config/tmux/tmux-which-key/config.yaml New which-key menu describing the repo’s tmux keybindings and macros.
dot_config/tmux/statusbar.conf New pre-TPM Catppuccin + status layout configuration (tabs, dotted divider, right-side modules).
dot_config/tmux/statusbar-overrides.conf New post-TPM overrides for pane borders and pill styling (incl. mode indicator).
dot_config/fish/functions/fish_greeting.fish Adds a 6-hour cooldown stamp so tips don’t show on every new shell.
dot_config/fish/conf.d/zz_04_abbr.fish Simplifies abbr definitions and adds a zj abbreviation.
dot_config/fish/conf.d/zz_03_interactive.fish Minor whitespace-only change at end of the file.
docs/zellij-future-changes.md New doc tracking upstream Zellij items/plugins to watch for future improvements.
Comments suppressed due to low confidence (2)

dot_config/zellij/layouts/default.kdl:4

  • plugin location="https://github.com/dj95/zjstatus/releases/latest/download/zjstatus.wasm" loads a WASM plugin directly from a mutable releases/latest URL on GitHub at runtime, with no pinning or integrity verification. If the GitHub account, repository, or release artifact is compromised, malicious plugin code will execute inside your Zellij session with the same privileges as your shell (able to read keystrokes, environment variables, and secrets). To reduce this supply-chain risk, vendor the .wasm file locally or pin to a specific release asset/hash instead of using latest.
            plugin location="https://github.com/dj95/zjstatus/releases/latest/download/zjstatus.wasm" {

dot_config/zellij/layouts/default.kdl:93

  • This second plugin location="https://github.com/dj95/zjstatus/releases/latest/download/zjstatus.wasm" instance also downloads and executes the zjstatus WASM from a mutable releases/latest URL each time the layout is used. A compromise of that GitHub release stream would let an attacker silently run arbitrary code in your terminal multiplexer, exposing all shell activity and credentials. Prefer a locally vendored plugin or a URL pinned to a specific, verified release instead of latest.
            plugin location="https://github.com/dj95/zjstatus/releases/latest/download/zjstatus.wasm" {

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.


# ── Mode Indicator Pill ──────────────────────────────────────────────
# Appended to status-right. PREFIX=mauve, COPY=yellow, NORMAL=green.
set -ag status-right "#{?client_prefix,#[fg=#cba6f7]#[bg=default]#[fg=#11111b#,bg=#cba6f7]󰌶 #[fg=#cba6f7#,bg=#313244] prefix#[fg=#313244]#[bg=default] ,#{?pane_in_mode,#[fg=#f9e2af]#[bg=default]#[fg=#11111b#,bg=#f9e2af]󰌶 #[fg=#f9e2af#,bg=#313244] copy#[fg=#313244]#[bg=default] ,#[fg=#a6e3a1]#[bg=default]#[fg=#11111b#,bg=#a6e3a1]󰌶 #[fg=#a6e3a1#,bg=#313244] normal#[fg=#313244]#[bg=default] }}"
Copy link

Copilot AI Mar 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The mode-indicator format string has several invalid tmux style segments like #[fg=#11111b#,...] / #[fg=#cba6f7#,...] (extra # after the hex color). Tmux will treat these as malformed attributes and may render incorrectly or log errors. Remove the stray # characters so each attribute is fg=#RRGGBB / bg=#RRGGBB.

Suggested change
set -ag status-right "#{?client_prefix,#[fg=#cba6f7]#[bg=default]#[fg=#11111b#,bg=#cba6f7]󰌶 #[fg=#cba6f7#,bg=#313244] prefix#[fg=#313244]#[bg=default] ,#{?pane_in_mode,#[fg=#f9e2af]#[bg=default]#[fg=#11111b#,bg=#f9e2af]󰌶 #[fg=#f9e2af#,bg=#313244] copy#[fg=#313244]#[bg=default] ,#[fg=#a6e3a1]#[bg=default]#[fg=#11111b#,bg=#a6e3a1]󰌶 #[fg=#a6e3a1#,bg=#313244] normal#[fg=#313244]#[bg=default] }}"
set -ag status-right "#{?client_prefix,#[fg=#cba6f7]#[bg=default]#[fg=#11111b,bg=#cba6f7]󰌶 #[fg=#cba6f7,bg=#313244] prefix#[fg=#313244]#[bg=default] ,#{?pane_in_mode,#[fg=#f9e2af]#[bg=default]#[fg=#11111b,bg=#f9e2af]󰌶 #[fg=#f9e2af,bg=#313244] copy#[fg=#313244]#[bg=default] ,#[fg=#a6e3a1]#[bg=default]#[fg=#11111b,bg=#a6e3a1]󰌶 #[fg=#a6e3a1,bg=#313244] normal#[fg=#313244]#[bg=default] }}"

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are necessary.

command_hostname_interval "0"
command_hostname_rendermode "static"

command_session_count_command "sh -c 'zellij list-sessions 2>/dev/null | grep -cv EXITED'"
Copy link

Copilot AI Mar 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is trailing whitespace after the closing quote on this line. It’s minor, but it tends to create noisy diffs and can trip whitespace linters/editors; consider removing the trailing space.

Suggested change
command_session_count_command "sh -c 'zellij list-sessions 2>/dev/null | grep -cv EXITED'"
command_session_count_command "sh -c 'zellij list-sessions 2>/dev/null | grep -cv EXITED'"

Copilot uses AI. Check for mistakes.
@tyvsmith tyvsmith merged commit 5e9f3ef into main Mar 2, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants