From e822e8138a5080588cb2111c0518acc047b9b712 Mon Sep 17 00:00:00 2001 From: Ty Smith Date: Sat, 28 Feb 2026 21:58:28 -0800 Subject: [PATCH 1/9] Improve zellij: zjstatus bar, autolock, smart frames, lazygit, zsm Replace default dual status bars with zjstatus single-line powerline bar matching tmux Catppuccin Mocha theme (mauve active tabs, transparent bg, dotted border, git branch, session name). Add plugins: zjframes (smart pane frame hiding), zellij-autolock (auto-lock in vim/neovim/helix), zsm (zoxide session switcher on Ctrl+o z). Add Ctrl+b g for lazygit floating pane (mirrors tmux Prefix g). Add 'zj' fish abbreviation for zellij. Remove ~250 lines of commented-out default options. --- dot_config/fish/conf.d/zz_04_abbr.fish | 38 ++-- dot_config/zellij/config.kdl.tmpl | 295 +++---------------------- dot_config/zellij/layouts/default.kdl | 144 ++++++++++++ 3 files changed, 196 insertions(+), 281 deletions(-) create mode 100644 dot_config/zellij/layouts/default.kdl diff --git a/dot_config/fish/conf.d/zz_04_abbr.fish b/dot_config/fish/conf.d/zz_04_abbr.fish index 18b0280..df1a7d3 100644 --- a/dot_config/fish/conf.d/zz_04_abbr.fish +++ b/dot_config/fish/conf.d/zz_04_abbr.fish @@ -7,7 +7,7 @@ if status is-interactive # --- Compatible syntax (flags mostly work the same) --- # Eza for ls - abbr --add ls 'eza' + abbr --add ls eza abbr --add ll 'eza -l --icons=auto --group-directories-first' abbr --add l. 'eza -d .*' abbr --add l1 'eza -1' @@ -15,59 +15,61 @@ if status is-interactive abbr --add lt 'eza --tree --level=2' # Bat for cat - abbr --add cat 'bat' + abbr --add cat bat # Trash for rm (safer delete) - abbr --add rm 'trash' + abbr --add rm trash # Difftastic for diff - abbr --add diff 'difft' + abbr --add diff difft # Duf for df (beautiful disk free) - abbr --add df 'duf' + abbr --add df duf # Dust for du (visual disk usage) - abbr --add du 'dust' + abbr --add du dust # Gping for ping (graph visualization) - abbr --add ping 'gping' + abbr --add ping gping # --- Different syntax (forces learning the new tool) --- # Ripgrep for grep - abbr --add grep 'rg' + abbr --add grep rg # fd for find - abbr --add find 'fd' + abbr --add find fd # sd for sed - abbr --add sed 'sd' + abbr --add sed sd # xh for curl - abbr --add curl 'xh' + abbr --add curl xh # --- Editor (force neovim) --- - abbr --add vim 'nvim' - abbr --add vi 'nvim' + abbr --add vim nvim + abbr --add vi nvim # --- Shorthand for modern tools --- # Chezmoi - abbr --add cz 'chezmoi' + abbr --add cz chezmoi # Lazygit - abbr --add lg 'lazygit' + abbr --add lg lazygit # Broot - abbr --add br 'broot' + abbr --add br broot # --- Container management (distrobox) --- - - abbr --add db 'distrobox' + abbr --add db distrobox abbr --add dbe 'distrobox enter' abbr --add dbl 'distrobox list' abbr --add dbs 'distrobox stop' abbr --add dbrm 'distrobox rm' abbr --add dbc 'distrobox create' + + # Zellij + abbr --add zj zellij end diff --git a/dot_config/zellij/config.kdl.tmpl b/dot_config/zellij/config.kdl.tmpl index eabfba9..6fab46b 100644 --- a/dot_config/zellij/config.kdl.tmpl +++ b/dot_config/zellij/config.kdl.tmpl @@ -140,6 +140,13 @@ keybinds clear-defaults=true { } SwitchToMode "normal" } + bind "z" { + LaunchOrFocusPlugin "https://github.com/liam-mackie/zsm/releases/latest/download/zsm.wasm" { + floating true + move_to_focused_tab true + } + SwitchToMode "normal" + } } shared_except "locked" { bind "Alt left" { MoveFocusOrTab "left"; } @@ -249,6 +256,13 @@ keybinds clear-defaults=true { bind "o" { FocusNextPane; } bind "p" { GoToPreviousTab; SwitchToMode "normal"; } bind "z" { ToggleFocusFullscreen; SwitchToMode "normal"; } + bind "g" { + Run "lazygit" { + floating true + close_on_exit true + } + SwitchToMode "normal" + } } } @@ -272,269 +286,24 @@ plugins { } // Plugins to load in the background when a new session starts -// eg. "file:/path/to/my-plugin.wasm" -// eg. "https://example.com/my-plugin.wasm" load_plugins { + // zjframes: auto-hide pane frames when single pane, show in scroll/search + "https://github.com/dj95/zjstatus/releases/latest/download/zjframes.wasm" { + hide_frame_for_single_pane "true" + hide_frame_except_for_search "true" + hide_frame_except_for_scroll "true" + hide_frame_except_for_fullscreen "true" + } + // zellij-autolock: auto-lock when in vim/neovim/helix so keybindings don't conflict + "https://github.com/fresh2dev/zellij-autolock/releases/latest/download/zellij-autolock.wasm" { + triggers "nvim|vim|vi|helix|hx|fzf|atuin" + watch_triggers "lazygit" + reaction "lock" + watch_interval "1.0" + print_to_log "true" + } } -web_client { - font "monospace" -} - -// Use a simplified UI without special fonts (arrow glyphs) -// Options: -// - true -// - false (Default) -// -// simplified_ui true - -// Choose the theme that is specified in the themes section. -// Default: default -// +// ── General Settings ──────────────────────────────────────────────── theme "catppuccin-mocha" - -// Choose the base input mode of zellij. -// Default: normal -// -// default_mode "locked" - -// Choose the path to the default shell that zellij will use for opening new panes -// Default: $SHELL -// -//default_shell $SHELL - -// Choose the path to override cwd that zellij will use for opening new panes -// -// default_cwd "/tmp" - -// The name of the default layout to load on startup -// Default: "default" -// -// default_layout "compact" - -// The folder in which Zellij will look for layouts -// (Requires restart) -// -// layout_dir "/tmp" - -// The folder in which Zellij will look for themes -// (Requires restart) -// -// theme_dir "/tmp" - -// Toggle enabling the mouse mode. -// On certain configurations, or terminals this could -// potentially interfere with copying text. -// Options: -// - true (default) -// - false -// -// mouse_mode false - -// Toggle having pane frames around the panes -// Options: -// - true (default, enabled) -// - false -// -// pane_frames false - -// When attaching to an existing session with other users, -// should the session be mirrored (true) -// or should each user have their own cursor (false) -// (Requires restart) -// Default: false -// -// mirror_session true - -// Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP -// eg. when terminal window with an active zellij session is closed -// (Requires restart) -// Options: -// - detach (Default) -// - quit -// -// on_force_close "quit" - -// Configure the scroll back buffer size -// This is the number of lines zellij stores for each pane in the scroll back -// buffer. Excess number of lines are discarded in a FIFO fashion. -// (Requires restart) -// Valid values: positive integers -// Default value: 10000 -// -// scroll_buffer_size 10000 - -// Provide a command to execute when copying text. The text will be piped to -// the stdin of the program to perform the copy. This can be used with -// terminal emulators which do not support the OSC 52 ANSI control sequence -// that will be used by default if this option is not set. -// Examples: -// -// copy_command "xclip -selection clipboard" // x11 -copy_command "{{ template "copy-cmd" . }}" // wayland -// copy_command "pbcopy" // osx -// -// copy_command "pbcopy" - -// Choose the destination for copied text -// Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. -// Does not apply when using copy_command. -// Options: -// - system (default) -// - primary -// -// copy_clipboard "primary" - -// Enable automatic copying (and clearing) of selection when releasing mouse -// Default: true -// -// copy_on_select true - -// Path to the default editor to use to edit pane scrollbuffer -// Default: $EDITOR or $VISUAL -// scrollback_editor "/usr/bin/vim" - -// A fixed name to always give the Zellij session. -// Consider also setting `attach_to_session true,` -// otherwise this will error if such a session exists. -// Default: -// -// session_name "My singleton session" - -// When `session_name` is provided, attaches to that session -// if it is already running or creates it otherwise. -// Default: false -// -// attach_to_session true - -// Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible -// Options: -// - true (default) -// - false -// -// auto_layout false - -// Whether sessions should be serialized to the cache folder (including their tabs/panes, cwds and running commands) so that they can later be resurrected -// Options: -// - true (default) -// - false -// -// session_serialization false - -// Whether pane viewports are serialized along with the session, default is false -// Options: -// - true -// - false (default) -// -// serialize_pane_viewport false - -// Scrollback lines to serialize along with the pane viewport when serializing sessions, 0 -// defaults to the scrollback size. If this number is higher than the scrollback size, it will -// also default to the scrollback size. This does nothing if `serialize_pane_viewport` is not true. -// -// scrollback_lines_to_serialize 10000 - -// Enable or disable the rendering of styled and colored underlines (undercurl). -// May need to be disabled for certain unsupported terminals -// (Requires restart) -// Default: true -// -// styled_underlines false - -// How often in seconds sessions are serialized -// -// serialization_interval 10000 - -// Enable or disable writing of session metadata to disk (if disabled, other sessions might not know -// metadata info on this session) -// (Requires restart) -// Default: false -// -// disable_session_metadata false - -// Enable or disable support for the enhanced Kitty Keyboard Protocol (the host terminal must also support it) -// (Requires restart) -// Default: true (if the host terminal supports it) -// -// support_kitty_keyboard_protocol false -// Whether to make sure a local web server is running when a new Zellij session starts. -// This web server will allow creating new sessions and attaching to existing ones that have -// opted in to being shared in the browser. -// When enabled, navigate to http://127.0.0.1:8082 -// (Requires restart) -// -// Note: a local web server can still be manually started from within a Zellij session or from the CLI. -// If this is not desired, one can use a version of Zellij compiled without -// `web_server_capability` -// -// Possible values: -// - true -// - false -// Default: false -// -// web_server false -// Whether to allow sessions started in the terminal to be shared through a local web server, assuming one is -// running (see the `web_server` option for more details). -// (Requires restart) -// -// Note: This is an administrative separation and not intended as a security measure. -// -// Possible values: -// - "on" (allow web sharing through the local web server if it -// is online) -// - "off" (do not allow web sharing unless sessions explicitly opt-in to it) -// - "disabled" (do not allow web sharing and do not permit sessions started in the terminal to opt-in to it) -// Default: "off" -// -// web_sharing "off" -// A path to a certificate file to be used when setting up the web client to serve the -// connection over HTTPs -// -// web_server_cert "/path/to/cert.pem" -// A path to a key file to be used when setting up the web client to serve the -// connection over HTTPs -// -// web_server_key "/path/to/key.pem" -/// Whether to enforce https connections to the web server when it is bound to localhost -/// (127.0.0.0/8) -/// -/// Note: https is ALWAYS enforced when bound to non-local interfaces -/// -/// Default: false -// -// enforce_https_for_localhost false - -// Whether to stack panes when resizing beyond a certain size -// Default: true -// -// stacked_resize false - -// Whether to show tips on startup -// Default: true -// -// show_startup_tips false - -// Whether to show release notes on first version run -// Default: true -// -// show_release_notes false - -// Whether to enable mouse hover effects and pane grouping functionality -// default is true -// advanced_mouse_actions false - -// The ip address the web server should listen on when it starts -// Default: "127.0.0.1" -// (Requires restart) -// web_server_ip "127.0.0.1" - -// The port the web server should listen on when it starts -// Default: 8082 -// (Requires restart) -// web_server_port 8082 - -// A command to run (will be wrapped with sh -c and provided the RESURRECT_COMMAND env variable) -// after Zellij attempts to discover a command inside a pane when resurrecting sessions, the STDOUT -// of this command will be used instead of the discovered RESURRECT_COMMAND -// can be useful for removing wrappers around commands -// Note: be sure to escape backslashes and similar characters properly -// post_command_discovery_hook "echo $RESURRECT_COMMAND | sed " +pane_frames false +copy_command "{{ template "copy-cmd" . }}" diff --git a/dot_config/zellij/layouts/default.kdl b/dot_config/zellij/layouts/default.kdl new file mode 100644 index 0000000..01bfa85 --- /dev/null +++ b/dot_config/zellij/layouts/default.kdl @@ -0,0 +1,144 @@ +// Default layout with zjstatus -- matches tmux Catppuccin Mocha powerline style +// Replaces both default tab-bar and status-bar with a single clean bar + +layout { + default_tab_template { + children + pane size=1 borderless=true { + plugin location="https://github.com/dj95/zjstatus/releases/latest/download/zjstatus.wasm" { + // ── Format ────────────────────────────────────────── + format_left "{mode}#[fg=#313244,bg=default]#[fg=#cdd6f4,bg=#313244,bold] {session}#[fg=#313244,bg=default,nobold] " + format_center "{tabs}" + format_right "{command_git_branch}{datetime}" + format_space "#[bg=default] " + + // ── Border ────────────────────────────────────────── + border_enabled "true" + border_char "·" + border_format "#[fg=#585b70]{char}" + border_position "top" + + // ── Frame handling ────────────────────────────────── + hide_frame_for_single_pane "true" + + // ── Mode indicators ───────────────────────────────── + // Small colored text -- minimal, unobtrusive + mode_normal "#[fg=#89b4fa,bold] NORMAL " + mode_locked "#[fg=#f38ba8,bold] LOCKED " + mode_pane "#[fg=#a6e3a1,bold] PANE " + mode_tab "#[fg=#f9e2af,bold] TAB " + mode_resize "#[fg=#f5c2e7,bold] RESIZE " + mode_move "#[fg=#94e2d5,bold] MOVE " + mode_scroll "#[fg=#fab387,bold] SCROLL " + mode_search "#[fg=#fab387,bold] SEARCH " + mode_session "#[fg=#cba6f7,bold] SESSION " + mode_enter_search "#[fg=#fab387,bold] SEARCH " + mode_rename_tab "#[fg=#f9e2af,bold] RENAME " + mode_rename_pane "#[fg=#a6e3a1,bold] RENAME " + mode_tmux "#[fg=#fab387,bold] TMUX " + + // ── Tab formatting ────────────────────────────────── + // Inactive tabs: overlay_2 powerline + tab_normal "#[fg=#585b70,bg=default]#[fg=#cdd6f4,bg=#585b70] {index} {name}{floating_indicator}#[fg=#585b70,bg=default] " + tab_normal_fullscreen "#[fg=#585b70,bg=default]#[fg=#cdd6f4,bg=#585b70] {index} {name}{fullscreen_indicator}#[fg=#585b70,bg=default] " + tab_normal_sync "#[fg=#585b70,bg=default]#[fg=#cdd6f4,bg=#585b70] {index} {name}{sync_indicator}#[fg=#585b70,bg=default] " + + // Active tab: mauve/purple powerline (matches tmux) + tab_active "#[fg=#cba6f7,bg=default]#[fg=#11111b,bg=#cba6f7,bold] {index} {name}{floating_indicator}#[fg=#cba6f7,bg=default,nobold] " + tab_active_fullscreen "#[fg=#cba6f7,bg=default]#[fg=#11111b,bg=#cba6f7,bold] {index} {name}{fullscreen_indicator}#[fg=#cba6f7,bg=default,nobold] " + tab_active_sync "#[fg=#cba6f7,bg=default]#[fg=#11111b,bg=#cba6f7,bold] {index} {name}{sync_indicator}#[fg=#cba6f7,bg=default,nobold] " + + tab_separator "" + + // Tab indicators + tab_floating_indicator " 󰉈" + tab_fullscreen_indicator " 󰊓" + tab_sync_indicator " 󰓦" + + // ── Git branch (command widget) ───────────────────── + command_git_branch_command "git rev-parse --abbrev-ref HEAD" + command_git_branch_format "#[fg=#94e2d5] {stdout} " + command_git_branch_interval "10" + command_git_branch_rendermode "static" + + // ── Datetime ──────────────────────────────────────── + datetime "#[fg=#585b70,bold]{format} " + datetime_format "%H:%M" + datetime_timezone "America/Chicago" + } + } + } + + // ── Swap layouts (required for Alt+[/] layout swapping) ───────── + swap_tiled_layout name="vertical" { + tab max_panes=5 { + pane split_direction="vertical" { + pane + pane { children; } + } + } + tab max_panes=8 { + pane split_direction="vertical" { + pane { children; } + pane { pane; pane; pane; pane; } + } + } + tab max_panes=12 { + pane split_direction="vertical" { + pane { children; } + pane { pane; pane; pane; pane; } + pane { pane; pane; pane; pane; } + } + } + } + + swap_tiled_layout name="horizontal" { + tab max_panes=5 { + pane + pane + } + } + + swap_tiled_layout name="stacked" { + tab min_panes=5 { + pane split_direction="vertical" { + pane + pane stacked=true { children; } + } + } + } + + swap_floating_layout name="staggered" { + floating_panes + } + + swap_floating_layout name="enlarged" { + floating_panes max_panes=10 { + pane { x "1%"; y 0; width "100%"; height "100%"; } + pane { x "6%"; y 1; width "100%"; height "100%"; } + pane { x "11%"; y 2; width "100%"; height "100%"; } + pane { x "16%"; y 3; width "100%"; height "100%"; } + pane { x "21%"; y 4; width "100%"; height "100%"; } + pane { x "26%"; y 5; width "100%"; height "100%"; } + pane { x "31%"; y 6; width "100%"; height "100%"; } + pane { x "36%"; y 7; width "100%"; height "100%"; } + pane { x "41%"; y 8; width "100%"; height "100%"; } + pane { x "46%"; y 9; width "100%"; height "100%"; } + } + } + + swap_floating_layout name="spread" { + floating_panes max_panes=1 { + pane { x "1%"; y "1%"; width "98%"; height "95%"; } + } + floating_panes max_panes=2 { + pane { x "1%"; y "1%"; width "45%"; height "95%"; } + pane { x "50%"; y "1%"; width "45%"; height "95%"; } + } + floating_panes max_panes=3 { + pane focus=true { x "1%"; y "1%"; width "30%"; height "95%"; } + pane { x "34%"; y "1%"; width "30%"; height "95%"; } + pane { x "67%"; y "1%"; width "30%"; height "95%"; } + } + } +} From c2eda46d29b3085ec0c2373c39b1e5a3c8d0abc5 Mon Sep 17 00:00:00 2001 From: Ty Smith Date: Sat, 28 Feb 2026 22:18:48 -0800 Subject: [PATCH 2/9] zellij modern --- dot_config/zellij/config.kdl.tmpl | 10 +---- dot_config/zellij/layouts/default.kdl | 53 +++++++++++++-------------- 2 files changed, 28 insertions(+), 35 deletions(-) diff --git a/dot_config/zellij/config.kdl.tmpl b/dot_config/zellij/config.kdl.tmpl index 6fab46b..3937783 100644 --- a/dot_config/zellij/config.kdl.tmpl +++ b/dot_config/zellij/config.kdl.tmpl @@ -287,13 +287,6 @@ plugins { // Plugins to load in the background when a new session starts load_plugins { - // zjframes: auto-hide pane frames when single pane, show in scroll/search - "https://github.com/dj95/zjstatus/releases/latest/download/zjframes.wasm" { - hide_frame_for_single_pane "true" - hide_frame_except_for_search "true" - hide_frame_except_for_scroll "true" - hide_frame_except_for_fullscreen "true" - } // zellij-autolock: auto-lock when in vim/neovim/helix so keybindings don't conflict "https://github.com/fresh2dev/zellij-autolock/releases/latest/download/zellij-autolock.wasm" { triggers "nvim|vim|vi|helix|hx|fzf|atuin" @@ -303,7 +296,8 @@ load_plugins { print_to_log "true" } } + // ── General Settings ──────────────────────────────────────────────── theme "catppuccin-mocha" -pane_frames false +// pane_frames must stay true (default) -- zjstatus handles hiding via hide_frame_for_single_pane copy_command "{{ template "copy-cmd" . }}" diff --git a/dot_config/zellij/layouts/default.kdl b/dot_config/zellij/layouts/default.kdl index 01bfa85..e169f20 100644 --- a/dot_config/zellij/layouts/default.kdl +++ b/dot_config/zellij/layouts/default.kdl @@ -4,49 +4,48 @@ layout { default_tab_template { children - pane size=1 borderless=true { + pane size=2 borderless=true { plugin location="https://github.com/dj95/zjstatus/releases/latest/download/zjstatus.wasm" { // ── Format ────────────────────────────────────────── - format_left "{mode}#[fg=#313244,bg=default]#[fg=#cdd6f4,bg=#313244,bold] {session}#[fg=#313244,bg=default,nobold] " + format_left "{mode}#[fg=#313244,bg=default]#[fg=#cdd6f4,bg=#313244,bold] {session}#[fg=#313244,bg=default,nobold] " format_center "{tabs}" format_right "{command_git_branch}{datetime}" format_space "#[bg=default] " // ── Border ────────────────────────────────────────── border_enabled "true" - border_char "·" - border_format "#[fg=#585b70]{char}" + border_char "─" + border_format "#[fg=#313244]{char}" border_position "top" // ── Frame handling ────────────────────────────────── hide_frame_for_single_pane "true" - // ── Mode indicators ───────────────────────────────── - // Small colored text -- minimal, unobtrusive - mode_normal "#[fg=#89b4fa,bold] NORMAL " - mode_locked "#[fg=#f38ba8,bold] LOCKED " - mode_pane "#[fg=#a6e3a1,bold] PANE " - mode_tab "#[fg=#f9e2af,bold] TAB " - mode_resize "#[fg=#f5c2e7,bold] RESIZE " - mode_move "#[fg=#94e2d5,bold] MOVE " - mode_scroll "#[fg=#fab387,bold] SCROLL " - mode_search "#[fg=#fab387,bold] SEARCH " - mode_session "#[fg=#cba6f7,bold] SESSION " - mode_enter_search "#[fg=#fab387,bold] SEARCH " - mode_rename_tab "#[fg=#f9e2af,bold] RENAME " - mode_rename_pane "#[fg=#a6e3a1,bold] RENAME " - mode_tmux "#[fg=#fab387,bold] TMUX " + // ── Mode indicators with keybinding hints ─────────── + mode_normal "#[fg=#89b4fa,bold]NORMAL #[fg=#585b70,nobold]^p pane ^t tab ^n resize ^s scroll ^o session ^b tmux " + mode_locked "#[fg=#f38ba8,bold]LOCKED #[fg=#585b70,nobold]^g unlock " + mode_pane "#[fg=#a6e3a1,bold]PANE #[fg=#585b70,nobold]n new d/r ↓→ s stack f full w float x close c rename " + mode_tab "#[fg=#f9e2af,bold]TAB #[fg=#585b70,nobold]n new r rename x close 1-9 goto h/l ←→ s sync " + mode_resize "#[fg=#f5c2e7,bold]RESIZE #[fg=#585b70,nobold]hjkl grow HJKL shrink +/- uniform " + mode_move "#[fg=#94e2d5,bold]MOVE #[fg=#585b70,nobold]hjkl move n/tab cycle " + mode_scroll "#[fg=#fab387,bold]SCROLL #[fg=#585b70,nobold]j/k ↑↓ d/u ½pg e edit s search " + mode_search "#[fg=#fab387,bold]SEARCH #[fg=#585b70,nobold]n/p next/prev c case w wrap o word " + mode_session "#[fg=#cba6f7,bold]SESSION #[fg=#585b70,nobold]w mgr z zoxide d detach a about c config " + mode_enter_search "#[fg=#fab387,bold]SEARCH #[fg=#585b70,nobold]type to search... " + mode_rename_tab "#[fg=#f9e2af,bold]RENAME TAB #[fg=#585b70,nobold]type new name... " + mode_rename_pane "#[fg=#a6e3a1,bold]RENAME PANE #[fg=#585b70,nobold]type new name... " + mode_tmux "#[fg=#fab387,bold]TMUX #[fg=#585b70,nobold]\" % split c tab g lazygit z full n/p tabs d detach " // ── Tab formatting ────────────────────────────────── - // Inactive tabs: overlay_2 powerline - tab_normal "#[fg=#585b70,bg=default]#[fg=#cdd6f4,bg=#585b70] {index} {name}{floating_indicator}#[fg=#585b70,bg=default] " - tab_normal_fullscreen "#[fg=#585b70,bg=default]#[fg=#cdd6f4,bg=#585b70] {index} {name}{fullscreen_indicator}#[fg=#585b70,bg=default] " - tab_normal_sync "#[fg=#585b70,bg=default]#[fg=#cdd6f4,bg=#585b70] {index} {name}{sync_indicator}#[fg=#585b70,bg=default] " + // Inactive tabs: surface_1 powerline + tab_normal "#[fg=#585b70,bg=default]#[fg=#cdd6f4,bg=#585b70] {index} {name}{floating_indicator}#[fg=#585b70,bg=default] " + tab_normal_fullscreen "#[fg=#585b70,bg=default]#[fg=#cdd6f4,bg=#585b70] {index} {name}{fullscreen_indicator}#[fg=#585b70,bg=default] " + tab_normal_sync "#[fg=#585b70,bg=default]#[fg=#cdd6f4,bg=#585b70] {index} {name}{sync_indicator}#[fg=#585b70,bg=default] " // Active tab: mauve/purple powerline (matches tmux) - tab_active "#[fg=#cba6f7,bg=default]#[fg=#11111b,bg=#cba6f7,bold] {index} {name}{floating_indicator}#[fg=#cba6f7,bg=default,nobold] " - tab_active_fullscreen "#[fg=#cba6f7,bg=default]#[fg=#11111b,bg=#cba6f7,bold] {index} {name}{fullscreen_indicator}#[fg=#cba6f7,bg=default,nobold] " - tab_active_sync "#[fg=#cba6f7,bg=default]#[fg=#11111b,bg=#cba6f7,bold] {index} {name}{sync_indicator}#[fg=#cba6f7,bg=default,nobold] " + tab_active "#[fg=#cba6f7,bg=default]#[fg=#11111b,bg=#cba6f7,bold] {index} {name}{floating_indicator}#[fg=#cba6f7,bg=default,nobold] " + tab_active_fullscreen "#[fg=#cba6f7,bg=default]#[fg=#11111b,bg=#cba6f7,bold] {index} {name}{fullscreen_indicator}#[fg=#cba6f7,bg=default,nobold] " + tab_active_sync "#[fg=#cba6f7,bg=default]#[fg=#11111b,bg=#cba6f7,bold] {index} {name}{sync_indicator}#[fg=#cba6f7,bg=default,nobold] " tab_separator "" @@ -57,7 +56,7 @@ layout { // ── Git branch (command widget) ───────────────────── command_git_branch_command "git rev-parse --abbrev-ref HEAD" - command_git_branch_format "#[fg=#94e2d5] {stdout} " + command_git_branch_format "#[fg=#94e2d5] {stdout} " command_git_branch_interval "10" command_git_branch_rendermode "static" From c5ac5c7f3b6482bbd781679911a31eae4bbf1403 Mon Sep 17 00:00:00 2001 From: Ty Smith Date: Sat, 28 Feb 2026 23:41:25 -0800 Subject: [PATCH 3/9] Redesign zjstatus: Catppuccin Mocha pills with keybinding hints bar Two-bar layout matching merikan/catppuccin zjstatus template: - Top bar: round pill session/mode/tabs with E0B6/E0B4 glyphs, two-tone tabs (colored index + surface1 name), git branch + datetime - Bottom bar: mode-specific keybinding hints (Ctrl + Alt shortcuts) - Solid surface0 bar background, no hide_frame_for_single_pane (was causing blink loop with dual zjstatus instances) --- dot_config/zellij/layouts/default.kdl | 196 ++++++++++++++++---------- 1 file changed, 123 insertions(+), 73 deletions(-) diff --git a/dot_config/zellij/layouts/default.kdl b/dot_config/zellij/layouts/default.kdl index e169f20..711e9f1 100644 --- a/dot_config/zellij/layouts/default.kdl +++ b/dot_config/zellij/layouts/default.kdl @@ -1,74 +1,141 @@ -// Default layout with zjstatus -- matches tmux Catppuccin Mocha powerline style -// Replaces both default tab-bar and status-bar with a single clean bar - layout { default_tab_template { - children - pane size=2 borderless=true { + pane size=1 borderless=true { plugin location="https://github.com/dj95/zjstatus/releases/latest/download/zjstatus.wasm" { - // ── Format ────────────────────────────────────────── - format_left "{mode}#[fg=#313244,bg=default]#[fg=#cdd6f4,bg=#313244,bold] {session}#[fg=#313244,bg=default,nobold] " - format_center "{tabs}" - format_right "{command_git_branch}{datetime}" - format_space "#[bg=default] " - - // ── Border ────────────────────────────────────────── - border_enabled "true" - border_char "─" - border_format "#[fg=#313244]{char}" - border_position "top" - - // ── Frame handling ────────────────────────────────── - hide_frame_for_single_pane "true" - - // ── Mode indicators with keybinding hints ─────────── - mode_normal "#[fg=#89b4fa,bold]NORMAL #[fg=#585b70,nobold]^p pane ^t tab ^n resize ^s scroll ^o session ^b tmux " - mode_locked "#[fg=#f38ba8,bold]LOCKED #[fg=#585b70,nobold]^g unlock " - mode_pane "#[fg=#a6e3a1,bold]PANE #[fg=#585b70,nobold]n new d/r ↓→ s stack f full w float x close c rename " - mode_tab "#[fg=#f9e2af,bold]TAB #[fg=#585b70,nobold]n new r rename x close 1-9 goto h/l ←→ s sync " - mode_resize "#[fg=#f5c2e7,bold]RESIZE #[fg=#585b70,nobold]hjkl grow HJKL shrink +/- uniform " - mode_move "#[fg=#94e2d5,bold]MOVE #[fg=#585b70,nobold]hjkl move n/tab cycle " - mode_scroll "#[fg=#fab387,bold]SCROLL #[fg=#585b70,nobold]j/k ↑↓ d/u ½pg e edit s search " - mode_search "#[fg=#fab387,bold]SEARCH #[fg=#585b70,nobold]n/p next/prev c case w wrap o word " - mode_session "#[fg=#cba6f7,bold]SESSION #[fg=#585b70,nobold]w mgr z zoxide d detach a about c config " - mode_enter_search "#[fg=#fab387,bold]SEARCH #[fg=#585b70,nobold]type to search... " - mode_rename_tab "#[fg=#f9e2af,bold]RENAME TAB #[fg=#585b70,nobold]type new name... " - mode_rename_pane "#[fg=#a6e3a1,bold]RENAME PANE #[fg=#585b70,nobold]type new name... " - mode_tmux "#[fg=#fab387,bold]TMUX #[fg=#585b70,nobold]\" % split c tab g lazygit z full n/p tabs d detach " - - // ── Tab formatting ────────────────────────────────── - // Inactive tabs: surface_1 powerline - tab_normal "#[fg=#585b70,bg=default]#[fg=#cdd6f4,bg=#585b70] {index} {name}{floating_indicator}#[fg=#585b70,bg=default] " - tab_normal_fullscreen "#[fg=#585b70,bg=default]#[fg=#cdd6f4,bg=#585b70] {index} {name}{fullscreen_indicator}#[fg=#585b70,bg=default] " - tab_normal_sync "#[fg=#585b70,bg=default]#[fg=#cdd6f4,bg=#585b70] {index} {name}{sync_indicator}#[fg=#585b70,bg=default] " - - // Active tab: mauve/purple powerline (matches tmux) - tab_active "#[fg=#cba6f7,bg=default]#[fg=#11111b,bg=#cba6f7,bold] {index} {name}{floating_indicator}#[fg=#cba6f7,bg=default,nobold] " - tab_active_fullscreen "#[fg=#cba6f7,bg=default]#[fg=#11111b,bg=#cba6f7,bold] {index} {name}{fullscreen_indicator}#[fg=#cba6f7,bg=default,nobold] " - tab_active_sync "#[fg=#cba6f7,bg=default]#[fg=#11111b,bg=#cba6f7,bold] {index} {name}{sync_indicator}#[fg=#cba6f7,bg=default,nobold] " - - tab_separator "" - - // Tab indicators - tab_floating_indicator " 󰉈" - tab_fullscreen_indicator " 󰊓" + color_rosewater "#f5e0dc" + color_flamingo "#f2cdcd" + color_pink "#f5c2e7" + color_mauve "#cba6f7" + color_red "#f38ba8" + color_maroon "#eba0ac" + color_peach "#fab387" + color_yellow "#f9e2af" + color_green "#a6e3a1" + color_teal "#94e2d5" + color_sky "#89dceb" + color_sapphire "#74c7ec" + color_blue "#89b4fa" + color_lavender "#b4befe" + color_text "#cdd6f4" + color_subtext1 "#bac2de" + color_subtext0 "#a6adc8" + color_overlay2 "#9399b2" + color_overlay1 "#7f849c" + color_overlay0 "#6c7086" + color_surface2 "#585b70" + color_surface1 "#45475a" + color_surface0 "#313244" + color_base "#1e1e2e" + color_mantle "#181825" + color_crust "#11111b" + + format_left "#[bg=#313244,fg=#74c7ec]#[bg=#74c7ec,fg=#11111b,bold] {session} #[bg=#313244] {mode}#[bg=#313244] {tabs}" + format_center "{notifications}" + format_right "#[bg=#313244,fg=#94e2d5]#[fg=#11111b,bg=#94e2d5] #[bg=#45475a,fg=#94e2d5,bold] {command_git_branch}#[bg=#313244,fg=#45475a]#[bg=#313244,fg=#eba0ac]#[bg=#eba0ac,fg=#11111b]󰅐 #[bg=#45475a,fg=#eba0ac,bold] {datetime}#[bg=#313244,fg=#45475a]" + format_space "#[bg=#313244]" + format_hide_on_overlength "true" + format_precedence "lrc" + + border_enabled "false" + + mode_normal "#[bg=#a6e3a1,fg=#11111b,bold] NORMAL#[bg=#313244,fg=#a6e3a1]" + mode_locked "#[bg=#f38ba8,fg=#11111b,bold] LOCKED#[bg=#313244,fg=#f38ba8]" + mode_pane "#[bg=#94e2d5,fg=#11111b,bold] PANE#[bg=#313244,fg=#94e2d5]" + mode_tab "#[bg=#94e2d5,fg=#11111b,bold] TAB#[bg=#313244,fg=#94e2d5]" + mode_resize "#[bg=#f9e2af,fg=#11111b,bold] RESIZE#[bg=#313244,fg=#f9e2af]" + mode_move "#[bg=#f9e2af,fg=#11111b,bold] MOVE#[bg=#313244,fg=#f9e2af]" + mode_scroll "#[bg=#f2cdcd,fg=#11111b,bold] SCROLL#[bg=#313244,fg=#f2cdcd]" + mode_search "#[bg=#f2cdcd,fg=#11111b,bold] SEARCH#[bg=#313244,fg=#f2cdcd]" + mode_enter_search "#[bg=#f2cdcd,fg=#11111b,bold] SEARCH#[bg=#313244,fg=#f2cdcd]" + mode_session "#[bg=#f5c2e7,fg=#11111b,bold] SESSION#[bg=#313244,fg=#f5c2e7]" + mode_tmux "#[bg=#cba6f7,fg=#11111b,bold] TMUX#[bg=#313244,fg=#cba6f7]" + mode_rename_tab "#[bg=#f9e2af,fg=#11111b,bold] RENAME#[bg=#313244,fg=#f9e2af]" + mode_rename_pane "#[bg=#f9e2af,fg=#11111b,bold] RENAME#[bg=#313244,fg=#f9e2af]" + + tab_normal "#[bg=#313244,fg=#89b4fa]#[bg=#89b4fa,fg=#11111b,bold]{index} #[bg=#45475a,fg=#89b4fa,bold] {name}{floating_indicator}#[bg=#313244,fg=#45475a]" + tab_normal_fullscreen "#[bg=#313244,fg=#89b4fa]#[bg=#89b4fa,fg=#11111b,bold]{index} #[bg=#45475a,fg=#89b4fa,bold] {name}{fullscreen_indicator}#[bg=#313244,fg=#45475a]" + tab_normal_sync "#[bg=#313244,fg=#89b4fa]#[bg=#89b4fa,fg=#11111b,bold]{index} #[bg=#45475a,fg=#89b4fa,bold] {name}{sync_indicator}#[bg=#313244,fg=#45475a]" + tab_active "#[bg=#313244,fg=#fab387]#[bg=#fab387,fg=#11111b,bold]{index} #[bg=#45475a,fg=#fab387,bold] {name}{floating_indicator}#[bg=#313244,fg=#45475a]" + tab_active_fullscreen "#[bg=#313244,fg=#fab387]#[bg=#fab387,fg=#11111b,bold]{index} #[bg=#45475a,fg=#fab387,bold] {name}{fullscreen_indicator}#[bg=#313244,fg=#45475a]" + tab_active_sync "#[bg=#313244,fg=#fab387]#[bg=#fab387,fg=#11111b,bold]{index} #[bg=#45475a,fg=#fab387,bold] {name}{sync_indicator}#[bg=#313244,fg=#45475a]" + + tab_separator "#[bg=#313244] " tab_sync_indicator " 󰓦" + tab_fullscreen_indicator " 󰊓" + tab_floating_indicator " 󰉈" + + notification_format_unread "#[bg=#313244,fg=#f9e2af]#[bg=#f9e2af,fg=#11111b] {message} #[bg=#313244,fg=#f9e2af]" + notification_format_no_notifications "" + notification_show_interval "10" - // ── Git branch (command widget) ───────────────────── command_git_branch_command "git rev-parse --abbrev-ref HEAD" - command_git_branch_format "#[fg=#94e2d5] {stdout} " + command_git_branch_format "{stdout}" command_git_branch_interval "10" command_git_branch_rendermode "static" - // ── Datetime ──────────────────────────────────────── - datetime "#[fg=#585b70,bold]{format} " + datetime "{format}" datetime_format "%H:%M" datetime_timezone "America/Chicago" } } + + children + + pane size=1 borderless=true { + plugin location="https://github.com/dj95/zjstatus/releases/latest/download/zjstatus.wasm" { + color_rosewater "#f5e0dc" + color_flamingo "#f2cdcd" + color_pink "#f5c2e7" + color_mauve "#cba6f7" + color_red "#f38ba8" + color_maroon "#eba0ac" + color_peach "#fab387" + color_yellow "#f9e2af" + color_green "#a6e3a1" + color_teal "#94e2d5" + color_sky "#89dceb" + color_sapphire "#74c7ec" + color_blue "#89b4fa" + color_lavender "#b4befe" + color_text "#cdd6f4" + color_subtext1 "#bac2de" + color_subtext0 "#a6adc8" + color_overlay2 "#9399b2" + color_overlay1 "#7f849c" + color_overlay0 "#6c7086" + color_surface2 "#585b70" + color_surface1 "#45475a" + color_surface0 "#313244" + color_base "#1e1e2e" + color_mantle "#181825" + color_crust "#11111b" + + format_left "{mode}" + format_center "" + format_right "" + format_space "#[bg=#313244]" + border_enabled "false" + + mode_normal "#[bg=#313244,fg=#6c7086] #[fg=#f38ba8]^g #[fg=#6c7086]lock #[fg=#94e2d5]^p #[fg=#6c7086]pane #[fg=#94e2d5]^t #[fg=#6c7086]tab #[fg=#f9e2af]^n #[fg=#6c7086]resize #[fg=#f2cdcd]^s #[fg=#6c7086]scroll #[fg=#f9e2af]^h #[fg=#6c7086]move #[fg=#f5c2e7]^o #[fg=#6c7086]session #[fg=#cba6f7]^b #[fg=#6c7086]tmux#[fg=#585b70] │ #[fg=#89b4fa]Alt #[fg=#6c7086]hjkl focus #[fg=#89b4fa]Alt+n #[fg=#6c7086]pane #[fg=#89b4fa]Alt+f #[fg=#6c7086]float #[fg=#89b4fa]Alt+[/] #[fg=#6c7086]layout" + mode_locked "#[bg=#313244,fg=#6c7086] #[fg=#a6e3a1]^g #[fg=#6c7086]unlock" + mode_pane "#[bg=#313244,fg=#6c7086] #[fg=#94e2d5]n #[fg=#6c7086]new #[fg=#94e2d5]d #[fg=#6c7086]↓ #[fg=#94e2d5]r #[fg=#6c7086]→ #[fg=#94e2d5]s #[fg=#6c7086]stack #[fg=#94e2d5]f #[fg=#6c7086]full #[fg=#94e2d5]w #[fg=#6c7086]float #[fg=#94e2d5]e #[fg=#6c7086]embed #[fg=#f38ba8]x #[fg=#6c7086]close #[fg=#94e2d5]c #[fg=#6c7086]rename #[fg=#94e2d5]hjkl #[fg=#6c7086]focus #[fg=#94e2d5]^p #[fg=#6c7086]exit" + mode_tab "#[bg=#313244,fg=#6c7086] #[fg=#94e2d5]n #[fg=#6c7086]new #[fg=#94e2d5]r #[fg=#6c7086]rename #[fg=#f38ba8]x #[fg=#6c7086]close #[fg=#94e2d5]s #[fg=#6c7086]sync #[fg=#94e2d5]1-9 #[fg=#6c7086]goto #[fg=#94e2d5]h/l #[fg=#6c7086]←/→ #[fg=#94e2d5][/] #[fg=#6c7086]break #[fg=#94e2d5]^t #[fg=#6c7086]exit" + mode_resize "#[bg=#313244,fg=#6c7086] #[fg=#f9e2af]hjkl #[fg=#6c7086]grow #[fg=#f9e2af]HJKL #[fg=#6c7086]shrink #[fg=#f9e2af]+/- #[fg=#6c7086]uniform #[fg=#f9e2af]^n #[fg=#6c7086]exit" + mode_move "#[bg=#313244,fg=#6c7086] #[fg=#f9e2af]hjkl #[fg=#6c7086]move #[fg=#f9e2af]n #[fg=#6c7086]cycle #[fg=#f9e2af]p #[fg=#6c7086]back #[fg=#f9e2af]^h #[fg=#6c7086]exit" + mode_scroll "#[bg=#313244,fg=#6c7086] #[fg=#f2cdcd]j/k #[fg=#6c7086]scroll #[fg=#f2cdcd]d/u #[fg=#6c7086]half-pg #[fg=#f2cdcd]^f/^b #[fg=#6c7086]page #[fg=#f2cdcd]e #[fg=#6c7086]edit #[fg=#f2cdcd]s #[fg=#6c7086]search #[fg=#f2cdcd]^s #[fg=#6c7086]exit" + mode_search "#[bg=#313244,fg=#6c7086] #[fg=#f2cdcd]n/p #[fg=#6c7086]next/prev #[fg=#f2cdcd]c #[fg=#6c7086]case #[fg=#f2cdcd]w #[fg=#6c7086]wrap #[fg=#f2cdcd]o #[fg=#6c7086]word #[fg=#f2cdcd]Esc #[fg=#6c7086]exit" + mode_enter_search "#[bg=#313244,fg=#6c7086] #[fg=#f2cdcd]type to search... #[fg=#f2cdcd]Enter #[fg=#6c7086]search #[fg=#f2cdcd]Esc #[fg=#6c7086]cancel" + mode_session "#[bg=#313244,fg=#6c7086] #[fg=#f5c2e7]w #[fg=#6c7086]mgr #[fg=#f5c2e7]z #[fg=#6c7086]zoxide #[fg=#f5c2e7]e #[fg=#6c7086]containers #[fg=#f5c2e7]d #[fg=#6c7086]detach #[fg=#f5c2e7]a #[fg=#6c7086]about #[fg=#f5c2e7]c #[fg=#6c7086]config #[fg=#f5c2e7]p #[fg=#6c7086]plugins #[fg=#f5c2e7]^o #[fg=#6c7086]exit" + mode_tmux "#[bg=#313244,fg=#6c7086] #[fg=#cba6f7]g #[fg=#6c7086]lazygit #[fg=#cba6f7]c #[fg=#6c7086]tab #[fg=#cba6f7]n/p #[fg=#6c7086]tabs #[fg=#cba6f7]v/h #[fg=#6c7086]split #[fg=#cba6f7]z #[fg=#6c7086]full #[fg=#cba6f7]d #[fg=#6c7086]detach #[fg=#cba6f7][ #[fg=#6c7086]scroll #[fg=#cba6f7]Esc #[fg=#6c7086]exit" + mode_rename_tab "#[bg=#313244,fg=#6c7086] #[fg=#f9e2af]type name... #[fg=#f9e2af]Enter #[fg=#6c7086]confirm #[fg=#f9e2af]Esc #[fg=#6c7086]undo" + mode_rename_pane "#[bg=#313244,fg=#6c7086] #[fg=#f9e2af]type name... #[fg=#f9e2af]Enter #[fg=#6c7086]confirm #[fg=#f9e2af]Esc #[fg=#6c7086]undo" + + tab_normal "" + tab_active "" + } + } } - // ── Swap layouts (required for Alt+[/] layout swapping) ───────── swap_tiled_layout name="vertical" { tab max_panes=5 { pane split_direction="vertical" { @@ -82,13 +149,6 @@ layout { pane { pane; pane; pane; pane; } } } - tab max_panes=12 { - pane split_direction="vertical" { - pane { children; } - pane { pane; pane; pane; pane; } - pane { pane; pane; pane; pane; } - } - } } swap_tiled_layout name="horizontal" { @@ -118,11 +178,6 @@ layout { pane { x "11%"; y 2; width "100%"; height "100%"; } pane { x "16%"; y 3; width "100%"; height "100%"; } pane { x "21%"; y 4; width "100%"; height "100%"; } - pane { x "26%"; y 5; width "100%"; height "100%"; } - pane { x "31%"; y 6; width "100%"; height "100%"; } - pane { x "36%"; y 7; width "100%"; height "100%"; } - pane { x "41%"; y 8; width "100%"; height "100%"; } - pane { x "46%"; y 9; width "100%"; height "100%"; } } } @@ -134,10 +189,5 @@ layout { pane { x "1%"; y "1%"; width "45%"; height "95%"; } pane { x "50%"; y "1%"; width "45%"; height "95%"; } } - floating_panes max_panes=3 { - pane focus=true { x "1%"; y "1%"; width "30%"; height "95%"; } - pane { x "34%"; y "1%"; width "30%"; height "95%"; } - pane { x "67%"; y "1%"; width "30%"; height "95%"; } - } } } From c116168bd350bdf806a53d14e46cf5c74344f759 Mon Sep 17 00:00:00 2001 From: Ty Smith Date: Sat, 28 Feb 2026 23:47:15 -0800 Subject: [PATCH 4/9] Fix pane borders and transparent status bar background - Set pane_frames false: no borders on single pane, simple separators between multiple panes (no full box borders) - Transparent bar background: format_space empty, bg=default for all bar elements so pills float on terminal background --- dot_config/zellij/config.kdl.tmpl | 2 +- dot_config/zellij/layouts/default.kdl | 80 +++++++++++++-------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/dot_config/zellij/config.kdl.tmpl b/dot_config/zellij/config.kdl.tmpl index 3937783..dc8547d 100644 --- a/dot_config/zellij/config.kdl.tmpl +++ b/dot_config/zellij/config.kdl.tmpl @@ -299,5 +299,5 @@ load_plugins { // ── General Settings ──────────────────────────────────────────────── theme "catppuccin-mocha" -// pane_frames must stay true (default) -- zjstatus handles hiding via hide_frame_for_single_pane +pane_frames false copy_command "{{ template "copy-cmd" . }}" diff --git a/dot_config/zellij/layouts/default.kdl b/dot_config/zellij/layouts/default.kdl index 711e9f1..322571f 100644 --- a/dot_config/zellij/layouts/default.kdl +++ b/dot_config/zellij/layouts/default.kdl @@ -29,42 +29,42 @@ layout { color_mantle "#181825" color_crust "#11111b" - format_left "#[bg=#313244,fg=#74c7ec]#[bg=#74c7ec,fg=#11111b,bold] {session} #[bg=#313244] {mode}#[bg=#313244] {tabs}" + format_left "#[bg=default,fg=#74c7ec]#[bg=#74c7ec,fg=#11111b,bold] {session} #[bg=default] {mode}#[bg=default] {tabs}" format_center "{notifications}" - format_right "#[bg=#313244,fg=#94e2d5]#[fg=#11111b,bg=#94e2d5] #[bg=#45475a,fg=#94e2d5,bold] {command_git_branch}#[bg=#313244,fg=#45475a]#[bg=#313244,fg=#eba0ac]#[bg=#eba0ac,fg=#11111b]󰅐 #[bg=#45475a,fg=#eba0ac,bold] {datetime}#[bg=#313244,fg=#45475a]" - format_space "#[bg=#313244]" + format_right "#[bg=default,fg=#94e2d5]#[fg=#11111b,bg=#94e2d5] #[bg=#45475a,fg=#94e2d5,bold] {command_git_branch}#[bg=default,fg=#45475a]#[bg=default,fg=#eba0ac]#[bg=#eba0ac,fg=#11111b]󰅐 #[bg=#45475a,fg=#eba0ac,bold] {datetime}#[bg=default,fg=#45475a]" + format_space "" format_hide_on_overlength "true" format_precedence "lrc" border_enabled "false" - mode_normal "#[bg=#a6e3a1,fg=#11111b,bold] NORMAL#[bg=#313244,fg=#a6e3a1]" - mode_locked "#[bg=#f38ba8,fg=#11111b,bold] LOCKED#[bg=#313244,fg=#f38ba8]" - mode_pane "#[bg=#94e2d5,fg=#11111b,bold] PANE#[bg=#313244,fg=#94e2d5]" - mode_tab "#[bg=#94e2d5,fg=#11111b,bold] TAB#[bg=#313244,fg=#94e2d5]" - mode_resize "#[bg=#f9e2af,fg=#11111b,bold] RESIZE#[bg=#313244,fg=#f9e2af]" - mode_move "#[bg=#f9e2af,fg=#11111b,bold] MOVE#[bg=#313244,fg=#f9e2af]" - mode_scroll "#[bg=#f2cdcd,fg=#11111b,bold] SCROLL#[bg=#313244,fg=#f2cdcd]" - mode_search "#[bg=#f2cdcd,fg=#11111b,bold] SEARCH#[bg=#313244,fg=#f2cdcd]" - mode_enter_search "#[bg=#f2cdcd,fg=#11111b,bold] SEARCH#[bg=#313244,fg=#f2cdcd]" - mode_session "#[bg=#f5c2e7,fg=#11111b,bold] SESSION#[bg=#313244,fg=#f5c2e7]" - mode_tmux "#[bg=#cba6f7,fg=#11111b,bold] TMUX#[bg=#313244,fg=#cba6f7]" - mode_rename_tab "#[bg=#f9e2af,fg=#11111b,bold] RENAME#[bg=#313244,fg=#f9e2af]" - mode_rename_pane "#[bg=#f9e2af,fg=#11111b,bold] RENAME#[bg=#313244,fg=#f9e2af]" - - tab_normal "#[bg=#313244,fg=#89b4fa]#[bg=#89b4fa,fg=#11111b,bold]{index} #[bg=#45475a,fg=#89b4fa,bold] {name}{floating_indicator}#[bg=#313244,fg=#45475a]" - tab_normal_fullscreen "#[bg=#313244,fg=#89b4fa]#[bg=#89b4fa,fg=#11111b,bold]{index} #[bg=#45475a,fg=#89b4fa,bold] {name}{fullscreen_indicator}#[bg=#313244,fg=#45475a]" - tab_normal_sync "#[bg=#313244,fg=#89b4fa]#[bg=#89b4fa,fg=#11111b,bold]{index} #[bg=#45475a,fg=#89b4fa,bold] {name}{sync_indicator}#[bg=#313244,fg=#45475a]" - tab_active "#[bg=#313244,fg=#fab387]#[bg=#fab387,fg=#11111b,bold]{index} #[bg=#45475a,fg=#fab387,bold] {name}{floating_indicator}#[bg=#313244,fg=#45475a]" - tab_active_fullscreen "#[bg=#313244,fg=#fab387]#[bg=#fab387,fg=#11111b,bold]{index} #[bg=#45475a,fg=#fab387,bold] {name}{fullscreen_indicator}#[bg=#313244,fg=#45475a]" - tab_active_sync "#[bg=#313244,fg=#fab387]#[bg=#fab387,fg=#11111b,bold]{index} #[bg=#45475a,fg=#fab387,bold] {name}{sync_indicator}#[bg=#313244,fg=#45475a]" - - tab_separator "#[bg=#313244] " + mode_normal "#[bg=#a6e3a1,fg=#11111b,bold] NORMAL#[bg=default,fg=#a6e3a1]" + mode_locked "#[bg=#f38ba8,fg=#11111b,bold] LOCKED#[bg=default,fg=#f38ba8]" + mode_pane "#[bg=#94e2d5,fg=#11111b,bold] PANE#[bg=default,fg=#94e2d5]" + mode_tab "#[bg=#94e2d5,fg=#11111b,bold] TAB#[bg=default,fg=#94e2d5]" + mode_resize "#[bg=#f9e2af,fg=#11111b,bold] RESIZE#[bg=default,fg=#f9e2af]" + mode_move "#[bg=#f9e2af,fg=#11111b,bold] MOVE#[bg=default,fg=#f9e2af]" + mode_scroll "#[bg=#f2cdcd,fg=#11111b,bold] SCROLL#[bg=default,fg=#f2cdcd]" + mode_search "#[bg=#f2cdcd,fg=#11111b,bold] SEARCH#[bg=default,fg=#f2cdcd]" + mode_enter_search "#[bg=#f2cdcd,fg=#11111b,bold] SEARCH#[bg=default,fg=#f2cdcd]" + mode_session "#[bg=#f5c2e7,fg=#11111b,bold] SESSION#[bg=default,fg=#f5c2e7]" + mode_tmux "#[bg=#cba6f7,fg=#11111b,bold] TMUX#[bg=default,fg=#cba6f7]" + mode_rename_tab "#[bg=#f9e2af,fg=#11111b,bold] RENAME#[bg=default,fg=#f9e2af]" + mode_rename_pane "#[bg=#f9e2af,fg=#11111b,bold] RENAME#[bg=default,fg=#f9e2af]" + + tab_normal "#[bg=default,fg=#89b4fa]#[bg=#89b4fa,fg=#11111b,bold]{index} #[bg=#45475a,fg=#89b4fa,bold] {name}{floating_indicator}#[bg=default,fg=#45475a]" + tab_normal_fullscreen "#[bg=default,fg=#89b4fa]#[bg=#89b4fa,fg=#11111b,bold]{index} #[bg=#45475a,fg=#89b4fa,bold] {name}{fullscreen_indicator}#[bg=default,fg=#45475a]" + tab_normal_sync "#[bg=default,fg=#89b4fa]#[bg=#89b4fa,fg=#11111b,bold]{index} #[bg=#45475a,fg=#89b4fa,bold] {name}{sync_indicator}#[bg=default,fg=#45475a]" + tab_active "#[bg=default,fg=#fab387]#[bg=#fab387,fg=#11111b,bold]{index} #[bg=#45475a,fg=#fab387,bold] {name}{floating_indicator}#[bg=default,fg=#45475a]" + tab_active_fullscreen "#[bg=default,fg=#fab387]#[bg=#fab387,fg=#11111b,bold]{index} #[bg=#45475a,fg=#fab387,bold] {name}{fullscreen_indicator}#[bg=default,fg=#45475a]" + tab_active_sync "#[bg=default,fg=#fab387]#[bg=#fab387,fg=#11111b,bold]{index} #[bg=#45475a,fg=#fab387,bold] {name}{sync_indicator}#[bg=default,fg=#45475a]" + + tab_separator " " tab_sync_indicator " 󰓦" tab_fullscreen_indicator " 󰊓" tab_floating_indicator " 󰉈" - notification_format_unread "#[bg=#313244,fg=#f9e2af]#[bg=#f9e2af,fg=#11111b] {message} #[bg=#313244,fg=#f9e2af]" + notification_format_unread "#[fg=#f9e2af]#[bg=#f9e2af,fg=#11111b] {message} #[bg=default,fg=#f9e2af]" notification_format_no_notifications "" notification_show_interval "10" @@ -113,22 +113,22 @@ layout { format_left "{mode}" format_center "" format_right "" - format_space "#[bg=#313244]" + format_space "" border_enabled "false" - mode_normal "#[bg=#313244,fg=#6c7086] #[fg=#f38ba8]^g #[fg=#6c7086]lock #[fg=#94e2d5]^p #[fg=#6c7086]pane #[fg=#94e2d5]^t #[fg=#6c7086]tab #[fg=#f9e2af]^n #[fg=#6c7086]resize #[fg=#f2cdcd]^s #[fg=#6c7086]scroll #[fg=#f9e2af]^h #[fg=#6c7086]move #[fg=#f5c2e7]^o #[fg=#6c7086]session #[fg=#cba6f7]^b #[fg=#6c7086]tmux#[fg=#585b70] │ #[fg=#89b4fa]Alt #[fg=#6c7086]hjkl focus #[fg=#89b4fa]Alt+n #[fg=#6c7086]pane #[fg=#89b4fa]Alt+f #[fg=#6c7086]float #[fg=#89b4fa]Alt+[/] #[fg=#6c7086]layout" - mode_locked "#[bg=#313244,fg=#6c7086] #[fg=#a6e3a1]^g #[fg=#6c7086]unlock" - mode_pane "#[bg=#313244,fg=#6c7086] #[fg=#94e2d5]n #[fg=#6c7086]new #[fg=#94e2d5]d #[fg=#6c7086]↓ #[fg=#94e2d5]r #[fg=#6c7086]→ #[fg=#94e2d5]s #[fg=#6c7086]stack #[fg=#94e2d5]f #[fg=#6c7086]full #[fg=#94e2d5]w #[fg=#6c7086]float #[fg=#94e2d5]e #[fg=#6c7086]embed #[fg=#f38ba8]x #[fg=#6c7086]close #[fg=#94e2d5]c #[fg=#6c7086]rename #[fg=#94e2d5]hjkl #[fg=#6c7086]focus #[fg=#94e2d5]^p #[fg=#6c7086]exit" - mode_tab "#[bg=#313244,fg=#6c7086] #[fg=#94e2d5]n #[fg=#6c7086]new #[fg=#94e2d5]r #[fg=#6c7086]rename #[fg=#f38ba8]x #[fg=#6c7086]close #[fg=#94e2d5]s #[fg=#6c7086]sync #[fg=#94e2d5]1-9 #[fg=#6c7086]goto #[fg=#94e2d5]h/l #[fg=#6c7086]←/→ #[fg=#94e2d5][/] #[fg=#6c7086]break #[fg=#94e2d5]^t #[fg=#6c7086]exit" - mode_resize "#[bg=#313244,fg=#6c7086] #[fg=#f9e2af]hjkl #[fg=#6c7086]grow #[fg=#f9e2af]HJKL #[fg=#6c7086]shrink #[fg=#f9e2af]+/- #[fg=#6c7086]uniform #[fg=#f9e2af]^n #[fg=#6c7086]exit" - mode_move "#[bg=#313244,fg=#6c7086] #[fg=#f9e2af]hjkl #[fg=#6c7086]move #[fg=#f9e2af]n #[fg=#6c7086]cycle #[fg=#f9e2af]p #[fg=#6c7086]back #[fg=#f9e2af]^h #[fg=#6c7086]exit" - mode_scroll "#[bg=#313244,fg=#6c7086] #[fg=#f2cdcd]j/k #[fg=#6c7086]scroll #[fg=#f2cdcd]d/u #[fg=#6c7086]half-pg #[fg=#f2cdcd]^f/^b #[fg=#6c7086]page #[fg=#f2cdcd]e #[fg=#6c7086]edit #[fg=#f2cdcd]s #[fg=#6c7086]search #[fg=#f2cdcd]^s #[fg=#6c7086]exit" - mode_search "#[bg=#313244,fg=#6c7086] #[fg=#f2cdcd]n/p #[fg=#6c7086]next/prev #[fg=#f2cdcd]c #[fg=#6c7086]case #[fg=#f2cdcd]w #[fg=#6c7086]wrap #[fg=#f2cdcd]o #[fg=#6c7086]word #[fg=#f2cdcd]Esc #[fg=#6c7086]exit" - mode_enter_search "#[bg=#313244,fg=#6c7086] #[fg=#f2cdcd]type to search... #[fg=#f2cdcd]Enter #[fg=#6c7086]search #[fg=#f2cdcd]Esc #[fg=#6c7086]cancel" - mode_session "#[bg=#313244,fg=#6c7086] #[fg=#f5c2e7]w #[fg=#6c7086]mgr #[fg=#f5c2e7]z #[fg=#6c7086]zoxide #[fg=#f5c2e7]e #[fg=#6c7086]containers #[fg=#f5c2e7]d #[fg=#6c7086]detach #[fg=#f5c2e7]a #[fg=#6c7086]about #[fg=#f5c2e7]c #[fg=#6c7086]config #[fg=#f5c2e7]p #[fg=#6c7086]plugins #[fg=#f5c2e7]^o #[fg=#6c7086]exit" - mode_tmux "#[bg=#313244,fg=#6c7086] #[fg=#cba6f7]g #[fg=#6c7086]lazygit #[fg=#cba6f7]c #[fg=#6c7086]tab #[fg=#cba6f7]n/p #[fg=#6c7086]tabs #[fg=#cba6f7]v/h #[fg=#6c7086]split #[fg=#cba6f7]z #[fg=#6c7086]full #[fg=#cba6f7]d #[fg=#6c7086]detach #[fg=#cba6f7][ #[fg=#6c7086]scroll #[fg=#cba6f7]Esc #[fg=#6c7086]exit" - mode_rename_tab "#[bg=#313244,fg=#6c7086] #[fg=#f9e2af]type name... #[fg=#f9e2af]Enter #[fg=#6c7086]confirm #[fg=#f9e2af]Esc #[fg=#6c7086]undo" - mode_rename_pane "#[bg=#313244,fg=#6c7086] #[fg=#f9e2af]type name... #[fg=#f9e2af]Enter #[fg=#6c7086]confirm #[fg=#f9e2af]Esc #[fg=#6c7086]undo" + mode_normal "#[fg=#6c7086] #[fg=#f38ba8]^g #[fg=#6c7086]lock #[fg=#94e2d5]^p #[fg=#6c7086]pane #[fg=#94e2d5]^t #[fg=#6c7086]tab #[fg=#f9e2af]^n #[fg=#6c7086]resize #[fg=#f2cdcd]^s #[fg=#6c7086]scroll #[fg=#f9e2af]^h #[fg=#6c7086]move #[fg=#f5c2e7]^o #[fg=#6c7086]session #[fg=#cba6f7]^b #[fg=#6c7086]tmux#[fg=#585b70] │ #[fg=#89b4fa]Alt #[fg=#6c7086]hjkl focus #[fg=#89b4fa]Alt+n #[fg=#6c7086]pane #[fg=#89b4fa]Alt+f #[fg=#6c7086]float #[fg=#89b4fa]Alt+[/] #[fg=#6c7086]layout" + mode_locked "#[fg=#6c7086] #[fg=#a6e3a1]^g #[fg=#6c7086]unlock" + mode_pane "#[fg=#6c7086] #[fg=#94e2d5]n #[fg=#6c7086]new #[fg=#94e2d5]d #[fg=#6c7086]↓ #[fg=#94e2d5]r #[fg=#6c7086]→ #[fg=#94e2d5]s #[fg=#6c7086]stack #[fg=#94e2d5]f #[fg=#6c7086]full #[fg=#94e2d5]w #[fg=#6c7086]float #[fg=#94e2d5]e #[fg=#6c7086]embed #[fg=#f38ba8]x #[fg=#6c7086]close #[fg=#94e2d5]c #[fg=#6c7086]rename #[fg=#94e2d5]hjkl #[fg=#6c7086]focus #[fg=#94e2d5]^p #[fg=#6c7086]exit" + mode_tab "#[fg=#6c7086] #[fg=#94e2d5]n #[fg=#6c7086]new #[fg=#94e2d5]r #[fg=#6c7086]rename #[fg=#f38ba8]x #[fg=#6c7086]close #[fg=#94e2d5]s #[fg=#6c7086]sync #[fg=#94e2d5]1-9 #[fg=#6c7086]goto #[fg=#94e2d5]h/l #[fg=#6c7086]←/→ #[fg=#94e2d5][/] #[fg=#6c7086]break #[fg=#94e2d5]^t #[fg=#6c7086]exit" + mode_resize "#[fg=#6c7086] #[fg=#f9e2af]hjkl #[fg=#6c7086]grow #[fg=#f9e2af]HJKL #[fg=#6c7086]shrink #[fg=#f9e2af]+/- #[fg=#6c7086]uniform #[fg=#f9e2af]^n #[fg=#6c7086]exit" + mode_move "#[fg=#6c7086] #[fg=#f9e2af]hjkl #[fg=#6c7086]move #[fg=#f9e2af]n #[fg=#6c7086]cycle #[fg=#f9e2af]p #[fg=#6c7086]back #[fg=#f9e2af]^h #[fg=#6c7086]exit" + mode_scroll "#[fg=#6c7086] #[fg=#f2cdcd]j/k #[fg=#6c7086]scroll #[fg=#f2cdcd]d/u #[fg=#6c7086]half-pg #[fg=#f2cdcd]^f/^b #[fg=#6c7086]page #[fg=#f2cdcd]e #[fg=#6c7086]edit #[fg=#f2cdcd]s #[fg=#6c7086]search #[fg=#f2cdcd]^s #[fg=#6c7086]exit" + mode_search "#[fg=#6c7086] #[fg=#f2cdcd]n/p #[fg=#6c7086]next/prev #[fg=#f2cdcd]c #[fg=#6c7086]case #[fg=#f2cdcd]w #[fg=#6c7086]wrap #[fg=#f2cdcd]o #[fg=#6c7086]word #[fg=#f2cdcd]Esc #[fg=#6c7086]exit" + mode_enter_search "#[fg=#6c7086] #[fg=#f2cdcd]type to search... #[fg=#f2cdcd]Enter #[fg=#6c7086]search #[fg=#f2cdcd]Esc #[fg=#6c7086]cancel" + mode_session "#[fg=#6c7086] #[fg=#f5c2e7]w #[fg=#6c7086]mgr #[fg=#f5c2e7]z #[fg=#6c7086]zoxide #[fg=#f5c2e7]e #[fg=#6c7086]containers #[fg=#f5c2e7]d #[fg=#6c7086]detach #[fg=#f5c2e7]a #[fg=#6c7086]about #[fg=#f5c2e7]c #[fg=#6c7086]config #[fg=#f5c2e7]p #[fg=#6c7086]plugins #[fg=#f5c2e7]^o #[fg=#6c7086]exit" + mode_tmux "#[fg=#6c7086] #[fg=#cba6f7]g #[fg=#6c7086]lazygit #[fg=#cba6f7]c #[fg=#6c7086]tab #[fg=#cba6f7]n/p #[fg=#6c7086]tabs #[fg=#cba6f7]v/h #[fg=#6c7086]split #[fg=#cba6f7]z #[fg=#6c7086]full #[fg=#cba6f7]d #[fg=#6c7086]detach #[fg=#cba6f7][ #[fg=#6c7086]scroll #[fg=#cba6f7]Esc #[fg=#6c7086]exit" + mode_rename_tab "#[fg=#6c7086] #[fg=#f9e2af]type name... #[fg=#f9e2af]Enter #[fg=#6c7086]confirm #[fg=#f9e2af]Esc #[fg=#6c7086]undo" + mode_rename_pane "#[fg=#6c7086] #[fg=#f9e2af]type name... #[fg=#f9e2af]Enter #[fg=#6c7086]confirm #[fg=#f9e2af]Esc #[fg=#6c7086]undo" tab_normal "" tab_active "" From abb1e7ccc364cacccaf3d8d8e86eb338f2eacf2f Mon Sep 17 00:00:00 2001 From: Ty Smith Date: Sun, 1 Mar 2026 00:02:44 -0800 Subject: [PATCH 5/9] Split keybinding hints bar and add dotted border under top bar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bottom bar: Ctrl shortcuts left-aligned (mode-aware), Alt shortcuts right-aligned (static). Top bar gets a dotted ┈ border in surface0 color as a subtle separator from content panes. --- dot_config/zellij/layouts/default.kdl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/dot_config/zellij/layouts/default.kdl b/dot_config/zellij/layouts/default.kdl index 322571f..ea7d506 100644 --- a/dot_config/zellij/layouts/default.kdl +++ b/dot_config/zellij/layouts/default.kdl @@ -1,6 +1,6 @@ layout { default_tab_template { - pane size=1 borderless=true { + pane size=2 borderless=true { plugin location="https://github.com/dj95/zjstatus/releases/latest/download/zjstatus.wasm" { color_rosewater "#f5e0dc" color_flamingo "#f2cdcd" @@ -36,7 +36,10 @@ layout { format_hide_on_overlength "true" format_precedence "lrc" - border_enabled "false" + border_enabled "true" + border_char "┈" + border_format "#[fg=#313244]{char}" + border_position "bottom" mode_normal "#[bg=#a6e3a1,fg=#11111b,bold] NORMAL#[bg=default,fg=#a6e3a1]" mode_locked "#[bg=#f38ba8,fg=#11111b,bold] LOCKED#[bg=default,fg=#f38ba8]" @@ -112,11 +115,11 @@ layout { format_left "{mode}" format_center "" - format_right "" + format_right "#[fg=#6c7086]#[fg=#89b4fa]Alt #[fg=#6c7086]hjkl focus #[fg=#89b4fa]Alt+n #[fg=#6c7086]pane #[fg=#89b4fa]Alt+f #[fg=#6c7086]float #[fg=#89b4fa]Alt+[/] #[fg=#6c7086]layout " format_space "" border_enabled "false" - mode_normal "#[fg=#6c7086] #[fg=#f38ba8]^g #[fg=#6c7086]lock #[fg=#94e2d5]^p #[fg=#6c7086]pane #[fg=#94e2d5]^t #[fg=#6c7086]tab #[fg=#f9e2af]^n #[fg=#6c7086]resize #[fg=#f2cdcd]^s #[fg=#6c7086]scroll #[fg=#f9e2af]^h #[fg=#6c7086]move #[fg=#f5c2e7]^o #[fg=#6c7086]session #[fg=#cba6f7]^b #[fg=#6c7086]tmux#[fg=#585b70] │ #[fg=#89b4fa]Alt #[fg=#6c7086]hjkl focus #[fg=#89b4fa]Alt+n #[fg=#6c7086]pane #[fg=#89b4fa]Alt+f #[fg=#6c7086]float #[fg=#89b4fa]Alt+[/] #[fg=#6c7086]layout" + mode_normal "#[fg=#6c7086] #[fg=#f38ba8]^g #[fg=#6c7086]lock #[fg=#94e2d5]^p #[fg=#6c7086]pane #[fg=#94e2d5]^t #[fg=#6c7086]tab #[fg=#f9e2af]^n #[fg=#6c7086]resize #[fg=#f2cdcd]^s #[fg=#6c7086]scroll #[fg=#f9e2af]^h #[fg=#6c7086]move #[fg=#f5c2e7]^o #[fg=#6c7086]session #[fg=#cba6f7]^b #[fg=#6c7086]tmux" mode_locked "#[fg=#6c7086] #[fg=#a6e3a1]^g #[fg=#6c7086]unlock" mode_pane "#[fg=#6c7086] #[fg=#94e2d5]n #[fg=#6c7086]new #[fg=#94e2d5]d #[fg=#6c7086]↓ #[fg=#94e2d5]r #[fg=#6c7086]→ #[fg=#94e2d5]s #[fg=#6c7086]stack #[fg=#94e2d5]f #[fg=#6c7086]full #[fg=#94e2d5]w #[fg=#6c7086]float #[fg=#94e2d5]e #[fg=#6c7086]embed #[fg=#f38ba8]x #[fg=#6c7086]close #[fg=#94e2d5]c #[fg=#6c7086]rename #[fg=#94e2d5]hjkl #[fg=#6c7086]focus #[fg=#94e2d5]^p #[fg=#6c7086]exit" mode_tab "#[fg=#6c7086] #[fg=#94e2d5]n #[fg=#6c7086]new #[fg=#94e2d5]r #[fg=#6c7086]rename #[fg=#f38ba8]x #[fg=#6c7086]close #[fg=#94e2d5]s #[fg=#6c7086]sync #[fg=#94e2d5]1-9 #[fg=#6c7086]goto #[fg=#94e2d5]h/l #[fg=#6c7086]←/→ #[fg=#94e2d5][/] #[fg=#6c7086]break #[fg=#94e2d5]^t #[fg=#6c7086]exit" From 93075266813ef6791d7013b29d68c72ab7860885 Mon Sep 17 00:00:00 2001 From: Ty Smith Date: Sun, 1 Mar 2026 12:48:51 -0800 Subject: [PATCH 6/9] Add custom catppuccin-mocha-subtle theme with dim pane borders New component-based theme overrides frame_unselected (surface0), frame_selected (surface2), and frame_highlight (surface1) for subtle pane separators without affecting ANSI terminal colors. --- dot_config/zellij/config.kdl.tmpl | 136 +++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/dot_config/zellij/config.kdl.tmpl b/dot_config/zellij/config.kdl.tmpl index dc8547d..3b1480a 100644 --- a/dot_config/zellij/config.kdl.tmpl +++ b/dot_config/zellij/config.kdl.tmpl @@ -297,7 +297,141 @@ load_plugins { } } +// ── Theme ─────────────────────────────────────────────────────────── +// Custom catppuccin-mocha with subtle pane borders (surface colors +// instead of bright green/orange) — uses the new component theme spec +// so ANSI colors in terminal apps are unaffected. +themes { + catppuccin-mocha-subtle { + text_unselected { + base 205 214 244 + background 24 24 37 + emphasis_0 250 179 135 + emphasis_1 137 220 235 + emphasis_2 166 227 161 + emphasis_3 245 194 231 + } + text_selected { + base 205 214 244 + background 88 91 112 + emphasis_0 250 179 135 + emphasis_1 137 220 235 + emphasis_2 166 227 161 + emphasis_3 245 194 231 + } + ribbon_selected { + base 24 24 37 + background 166 227 161 + emphasis_0 243 139 168 + emphasis_1 250 179 135 + emphasis_2 245 194 231 + emphasis_3 137 180 250 + } + ribbon_unselected { + base 24 24 37 + background 205 214 244 + emphasis_0 243 139 168 + emphasis_1 205 214 244 + emphasis_2 137 180 250 + emphasis_3 245 194 231 + } + table_title { + base 166 227 161 + background 0 + emphasis_0 250 179 135 + emphasis_1 137 220 235 + emphasis_2 166 227 161 + emphasis_3 245 194 231 + } + table_cell_selected { + base 205 214 244 + background 88 91 112 + emphasis_0 250 179 135 + emphasis_1 137 220 235 + emphasis_2 166 227 161 + emphasis_3 245 194 231 + } + table_cell_unselected { + base 205 214 244 + background 24 24 37 + emphasis_0 250 179 135 + emphasis_1 137 220 235 + emphasis_2 166 227 161 + emphasis_3 245 194 231 + } + list_selected { + base 205 214 244 + background 88 91 112 + emphasis_0 250 179 135 + emphasis_1 137 220 235 + emphasis_2 166 227 161 + emphasis_3 245 194 231 + } + list_unselected { + base 205 214 244 + background 24 24 37 + emphasis_0 250 179 135 + emphasis_1 137 220 235 + emphasis_2 166 227 161 + emphasis_3 245 194 231 + } + // ── Pane borders: subtle surface colors ── + frame_unselected { + base 49 50 68 + background 0 + emphasis_0 49 50 68 + emphasis_1 49 50 68 + emphasis_2 49 50 68 + emphasis_3 0 + } + frame_selected { + base 88 91 112 + background 0 + emphasis_0 88 91 112 + emphasis_1 88 91 112 + emphasis_2 88 91 112 + emphasis_3 0 + } + frame_highlight { + base 69 71 90 + background 0 + emphasis_0 69 71 90 + emphasis_1 69 71 90 + emphasis_2 69 71 90 + emphasis_3 69 71 90 + } + exit_code_success { + base 166 227 161 + background 0 + emphasis_0 137 220 235 + emphasis_1 24 24 37 + emphasis_2 245 194 231 + emphasis_3 137 180 250 + } + exit_code_error { + base 243 139 168 + background 0 + emphasis_0 249 226 175 + emphasis_1 0 + emphasis_2 0 + emphasis_3 0 + } + multiplayer_user_colors { + player_1 245 194 231 + player_2 137 180 250 + player_3 0 + player_4 249 226 175 + player_5 137 220 235 + player_6 0 + player_7 243 139 168 + player_8 0 + player_9 0 + player_10 0 + } + } +} + // ── General Settings ──────────────────────────────────────────────── -theme "catppuccin-mocha" +theme "catppuccin-mocha-subtle" pane_frames false copy_command "{{ template "copy-cmd" . }}" From 55ae448e81461cce7f63d896d22f95a92213015e Mon Sep 17 00:00:00 2001 From: Ty Smith Date: Sun, 1 Mar 2026 13:40:30 -0800 Subject: [PATCH 7/9] Add right-side status pills, subtle theme, autolock toggle, layout polish - Custom catppuccin-mocha-subtle theme with dim pane borders (frame_unselected, frame_selected, frame_highlight using surface0/1/2) - Right-side pills: swap layout, hostname, CPU load, datetime, session, mode - Tabs moved to left side with full width - Autolock plugin: Ctrl+g toggles both lock mode and auto-detection - Bottom hints bar gets dotted border separator above it - Removed git branch widget (zjstatus can't follow focused pane cwd) - Removed fish zjstatus git hook (caused pane freeze) - Session pill uses merikan reference icon, hard right edge flowing to mode --- dot_config/fish/conf.d/zz_03_interactive.fish | 2 ++ dot_config/zellij/config.kdl.tmpl | 25 +++++++++------- dot_config/zellij/layouts/default.kdl | 29 +++++++++++++------ 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/dot_config/fish/conf.d/zz_03_interactive.fish b/dot_config/fish/conf.d/zz_03_interactive.fish index 075ec3f..64a76e0 100644 --- a/dot_config/fish/conf.d/zz_03_interactive.fish +++ b/dot_config/fish/conf.d/zz_03_interactive.fish @@ -21,4 +21,6 @@ if status is-interactive # Set simple hostname for prompt display set -gx HOST (string split -f1 '.' $hostname) + + end \ No newline at end of file diff --git a/dot_config/zellij/config.kdl.tmpl b/dot_config/zellij/config.kdl.tmpl index 3b1480a..a1ba0d9 100644 --- a/dot_config/zellij/config.kdl.tmpl +++ b/dot_config/zellij/config.kdl.tmpl @@ -1,6 +1,9 @@ keybinds clear-defaults=true { locked { - bind "Ctrl g" { SwitchToMode "normal"; } + bind "Ctrl g" { + MessagePlugin "autolock" { payload "toggle"; }; + SwitchToMode "normal"; + } } pane { bind "left" { MoveFocus "left"; } @@ -159,7 +162,10 @@ keybinds clear-defaults=true { bind "Alt [" { PreviousSwapLayout; } bind "Alt ]" { NextSwapLayout; } bind "Alt f" { ToggleFloatingPanes; } - bind "Ctrl g" { SwitchToMode "locked"; } + bind "Ctrl g" { + MessagePlugin "autolock" { payload "toggle"; }; + SwitchToMode "locked"; + } bind "Alt h" { MoveFocusOrTab "left"; } bind "Alt i" { MoveTab "left"; } bind "Alt j" { MoveFocus "down"; } @@ -283,18 +289,17 @@ plugins { welcome-screen location="zellij:session-manager" { welcome_screen true } + autolock location="https://github.com/fresh2dev/zellij-autolock/releases/latest/download/zellij-autolock.wasm" { + is_enabled true + triggers "nvim|vim|vi|helix|hx|fzf|atuin" + reaction_seconds "0.3" + print_to_log true + } } // Plugins to load in the background when a new session starts load_plugins { - // zellij-autolock: auto-lock when in vim/neovim/helix so keybindings don't conflict - "https://github.com/fresh2dev/zellij-autolock/releases/latest/download/zellij-autolock.wasm" { - triggers "nvim|vim|vi|helix|hx|fzf|atuin" - watch_triggers "lazygit" - reaction "lock" - watch_interval "1.0" - print_to_log "true" - } + autolock } // ── Theme ─────────────────────────────────────────────────────────── diff --git a/dot_config/zellij/layouts/default.kdl b/dot_config/zellij/layouts/default.kdl index ea7d506..ca75cff 100644 --- a/dot_config/zellij/layouts/default.kdl +++ b/dot_config/zellij/layouts/default.kdl @@ -29,12 +29,12 @@ layout { color_mantle "#181825" color_crust "#11111b" - format_left "#[bg=default,fg=#74c7ec]#[bg=#74c7ec,fg=#11111b,bold] {session} #[bg=default] {mode}#[bg=default] {tabs}" + format_left "{tabs}" format_center "{notifications}" - format_right "#[bg=default,fg=#94e2d5]#[fg=#11111b,bg=#94e2d5] #[bg=#45475a,fg=#94e2d5,bold] {command_git_branch}#[bg=default,fg=#45475a]#[bg=default,fg=#eba0ac]#[bg=#eba0ac,fg=#11111b]󰅐 #[bg=#45475a,fg=#eba0ac,bold] {datetime}#[bg=default,fg=#45475a]" + format_right "#[bg=default,fg=#b4befe]#[bg=#b4befe,fg=#11111b]⮁ #[bg=#45475a,fg=#b4befe,bold] {swap_layout}#[bg=default,fg=#45475a] #[bg=default,fg=#cba6f7]#[bg=#cba6f7,fg=#11111b] #[bg=#45475a,fg=#cba6f7,bold] {command_hostname}#[bg=default,fg=#45475a] #[bg=default,fg=#fab387]#[bg=#fab387,fg=#11111b] #[bg=#45475a,fg=#fab387,bold] {command_cpu}#[bg=default,fg=#45475a] #[bg=default,fg=#eba0ac]#[bg=#eba0ac,fg=#11111b]󰅐 #[bg=#45475a,fg=#eba0ac,bold] {datetime}#[bg=default,fg=#45475a] #[bg=default,fg=#74c7ec]#[bg=#74c7ec,fg=#11111b,bold] {session} #[bg=default] {mode}" format_space "" format_hide_on_overlength "true" - format_precedence "lrc" + format_precedence "rlc" border_enabled "true" border_char "┈" @@ -71,10 +71,18 @@ layout { notification_format_no_notifications "" notification_show_interval "10" - command_git_branch_command "git rev-parse --abbrev-ref HEAD" - command_git_branch_format "{stdout}" - command_git_branch_interval "10" - command_git_branch_rendermode "static" + swap_layout_format "{name}" + swap_layout_hide_if_empty "true" + + command_hostname_command "hostname -s" + command_hostname_format "{stdout}" + command_hostname_interval "0" + command_hostname_rendermode "static" + + command_cpu_command "bash -c \"cut -d' ' -f1 /proc/loadavg\"" + command_cpu_format "{stdout}" + command_cpu_interval "5" + command_cpu_rendermode "static" datetime "{format}" datetime_format "%H:%M" @@ -84,7 +92,7 @@ layout { children - pane size=1 borderless=true { + pane size=2 borderless=true { plugin location="https://github.com/dj95/zjstatus/releases/latest/download/zjstatus.wasm" { color_rosewater "#f5e0dc" color_flamingo "#f2cdcd" @@ -117,7 +125,10 @@ layout { format_center "" format_right "#[fg=#6c7086]#[fg=#89b4fa]Alt #[fg=#6c7086]hjkl focus #[fg=#89b4fa]Alt+n #[fg=#6c7086]pane #[fg=#89b4fa]Alt+f #[fg=#6c7086]float #[fg=#89b4fa]Alt+[/] #[fg=#6c7086]layout " format_space "" - border_enabled "false" + border_enabled "true" + border_char "┈" + border_format "#[fg=#313244]{char}" + border_position "top" mode_normal "#[fg=#6c7086] #[fg=#f38ba8]^g #[fg=#6c7086]lock #[fg=#94e2d5]^p #[fg=#6c7086]pane #[fg=#94e2d5]^t #[fg=#6c7086]tab #[fg=#f9e2af]^n #[fg=#6c7086]resize #[fg=#f2cdcd]^s #[fg=#6c7086]scroll #[fg=#f9e2af]^h #[fg=#6c7086]move #[fg=#f5c2e7]^o #[fg=#6c7086]session #[fg=#cba6f7]^b #[fg=#6c7086]tmux" mode_locked "#[fg=#6c7086] #[fg=#a6e3a1]^g #[fg=#6c7086]unlock" From c4d6e5217b22768397f5b4570e1d6030c5758592 Mon Sep 17 00:00:00 2001 From: Ty Smith Date: Sun, 1 Mar 2026 13:50:34 -0800 Subject: [PATCH 8/9] Add zellij future changes watchlist doc Track upstream features and plugins to revisit: auto tab rename (blocked on CwdChanged event), clickable session widget, autolock status indicator, mouse bindings, image protocol passthrough. --- docs/zellij-future-changes.md | 44 +++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 docs/zellij-future-changes.md diff --git a/docs/zellij-future-changes.md b/docs/zellij-future-changes.md new file mode 100644 index 0000000..2db64c2 --- /dev/null +++ b/docs/zellij-future-changes.md @@ -0,0 +1,44 @@ +# Zellij: Future Changes to Watch + +Tracking upstream features and plugins that would improve the zellij setup once available. + +## Auto Tab Rename (blocked on zellij release) + +**Plugin:** [vmaerten/zellij-tab-rename](https://github.com/vmaerten/zellij-tab-rename) + +Automatically renames tabs based on CWD, running process, or git root. Closest thing to tmux's `automatic-rename` behavior. Supports `source "process"` mode which shows `nvim`, `cargo`, etc. and falls back to directory name for shells. + +**Blocked on:** `CwdChanged` event from [zellij PR #4546](https://github.com/zellij-org/zellij/pull/4546) — not yet in a release. Current zellij 0.43.1 does not support it. + +**When available:** Add to `load_plugins` in `config.kdl.tmpl` with `source "process"` and `git_root "true"`. + +## Clickable Session Name (zjstatus feature request) + +zjstatus's `{session}` widget has no click behavior. Clicking it to open the session manager (`zellij:session-manager`) would match the UX of `{tabs}` (click to switch) and `{swap_layout}` (click to cycle). + +**Status:** Not implemented. Would need a feature request on [dj95/zjstatus](https://github.com/dj95/zjstatus/issues). + +## Autolock Status Indicator + +The `zellij-autolock` plugin's enabled/disabled state is invisible to other plugins. `MessagePlugin` from keybindings sends `CustomMessage` events, but zjstatus pipes expect `PipeMessage` events — they're different event types in zellij's architecture. + +**What would fix it:** +- zellij adding a silent `Run` action for keybindings (no pane opened) +- zellij unifying `CustomMessage` and `PipeMessage` so `MessagePlugin` can reach zjstatus pipes +- autolock exposing its state via a file or pipe + +## Mouse Button Bindings + +Zellij's keybinding system only supports keyboard inputs. No mouse button bindings (middle-click to close tab, right-click context menu). Mouse events are either passthrough to terminal apps or internal UI only. + +**Status:** No known proposal. Would need a zellij core feature request. + +## Image Support in Multiplexers (yazi/superfile) + +Terminal image protocols (Kitty graphics, sixel) don't pass through zellij correctly. Tools like yazi and superfile that rely on inline image rendering show broken or no images inside zellij panes. + +**Status:** Known zellij limitation. Partial sixel support exists but Kitty graphics protocol passthrough is incomplete. Track [zellij-org/zellij#2790](https://github.com/zellij-org/zellij/issues/2790) and related issues. + +## Independent Pane Border Colors + +Pane border colors are tied to the theme's component system (`frame_selected`, `frame_unselected`, `frame_highlight`). The current custom theme (`catppuccin-mocha-subtle`) uses surface0/1/2 for subtle borders. If zellij adds dedicated border color settings independent of the component theme, the workaround theme could be simplified. From 3d43213b22d34bbfbc340ab46b271f9c21185a5c Mon Sep 17 00:00:00 2001 From: Ty Smith Date: Sun, 1 Mar 2026 13:52:00 -0800 Subject: [PATCH 9/9] Remove CPU load and datetime pills from status bar Simplify right side to: swap layout, hostname, session, mode. --- dot_config/zellij/layouts/default.kdl | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/dot_config/zellij/layouts/default.kdl b/dot_config/zellij/layouts/default.kdl index ca75cff..3538442 100644 --- a/dot_config/zellij/layouts/default.kdl +++ b/dot_config/zellij/layouts/default.kdl @@ -31,7 +31,7 @@ layout { format_left "{tabs}" format_center "{notifications}" - format_right "#[bg=default,fg=#b4befe]#[bg=#b4befe,fg=#11111b]⮁ #[bg=#45475a,fg=#b4befe,bold] {swap_layout}#[bg=default,fg=#45475a] #[bg=default,fg=#cba6f7]#[bg=#cba6f7,fg=#11111b] #[bg=#45475a,fg=#cba6f7,bold] {command_hostname}#[bg=default,fg=#45475a] #[bg=default,fg=#fab387]#[bg=#fab387,fg=#11111b] #[bg=#45475a,fg=#fab387,bold] {command_cpu}#[bg=default,fg=#45475a] #[bg=default,fg=#eba0ac]#[bg=#eba0ac,fg=#11111b]󰅐 #[bg=#45475a,fg=#eba0ac,bold] {datetime}#[bg=default,fg=#45475a] #[bg=default,fg=#74c7ec]#[bg=#74c7ec,fg=#11111b,bold] {session} #[bg=default] {mode}" + format_right "#[bg=default,fg=#b4befe]#[bg=#b4befe,fg=#11111b]⮁ #[bg=#45475a,fg=#b4befe,bold] {swap_layout}#[bg=default,fg=#45475a] #[bg=default,fg=#cba6f7]#[bg=#cba6f7,fg=#11111b] #[bg=#45475a,fg=#cba6f7,bold] {command_hostname}#[bg=default,fg=#45475a] #[bg=default,fg=#74c7ec]#[bg=#74c7ec,fg=#11111b,bold] {session} #[bg=default] {mode}" format_space "" format_hide_on_overlength "true" format_precedence "rlc" @@ -79,14 +79,6 @@ layout { command_hostname_interval "0" command_hostname_rendermode "static" - command_cpu_command "bash -c \"cut -d' ' -f1 /proc/loadavg\"" - command_cpu_format "{stdout}" - command_cpu_interval "5" - command_cpu_rendermode "static" - - datetime "{format}" - datetime_format "%H:%M" - datetime_timezone "America/Chicago" } }