Last active
July 22, 2026 16:55
-
-
Save victor-falcon/40838b25b721be48a7b828b676fd8c41 to your computer and use it in GitHub Desktop.
My herdr + ghostty terminal config
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # ── Theme ───────────────────────────────────────────────────────────── | |
| theme = dark:"zenwritten_dark",light:"zenwritten_light" | |
| background-opacity = 0.9 | |
| background-blur = 24 | |
| # ── Font ────────────────────────────────────────────────────────────── | |
| font-family = "Cascadia Code" | |
| font-feature = ss01, ss02, ss03, ss19, ss20, calt, ss01 | |
| adjust-cell-height = 75% | |
| font-size = 14 | |
| # ── Cursor ──────────────────────────────────────────────────────────── | |
| cursor-style = block | |
| cursor-style-blink = true | |
| cursor-invert-fg-bg = false | |
| cursor-opacity = .9 | |
| # ── Window ──────────────────────────────────────────────────────────── | |
| macos-titlebar-style = hidden | |
| macos-option-as-alt = false | |
| macos-auto-secure-input = false | |
| confirm-close-surface = true | |
| window-decoration = auto | |
| window-padding-x = 2 | |
| window-padding-y = 0 | |
| window-padding-balance = true | |
| # ── Mouse ───────────────────────────────────────────────────────────── | |
| mouse-hide-while-typing = true | |
| # ── Shell integration ───────────────────────────────────────────────── | |
| shell-integration = detect | |
| # ── General ─────────────────────────────────────────────────────────── | |
| auto-update = download | |
| auto-update-channel = stable | |
| # ── Keybindings ─────────────────────────────────────────────────────── | |
| # Ghostty-native splits/tabs defaults in use (post-zellij): | |
| # cmd+d split right · cmd+shift+d split down · cmd+t new tab | |
| # cmd+w close pane · cmd+alt+w close tab · cmd+1..9 goto tab | |
| # cmd+shift+enter zoom split · cmd+ctrl+arrows resize · cmd+ctrl+= equalize | |
| # Option key: with macos-option-as-alt=false, Option composes accents and no | |
| # longer emits Alt sequences. Unbind Option+arrows so they pass through to the | |
| # shell for word nav, and forward alt+backspace -> backward-kill-word (ESC+DEL). | |
| keybind = alt+left=unbind | |
| keybind = alt+right=unbind | |
| keybind = alt+backspace=text:\x1b\x7f | |
| # Rename the current tab. | |
| keybind = cmd+r=prompt_tab_title | |
| # Switch herdr tabs with cmd+alt+←/→ (zellij muscle memory). Emits the | |
| # Kitty-keyboard CSI-u sequence for ctrl+shift+h / ctrl+shift+l, which herdr | |
| # maps to previous_tab / next_tab. Same text:->herdr trick as cmd+a below. | |
| keybind = cmd+alt+left=text:\x1b[104;6u | |
| keybind = cmd+alt+right=text:\x1b[108;6u | |
| # Maximize (zoom) the focused split — zellij muscle memory. | |
| keybind = cmd+shift+f=toggle_split_zoom | |
| # Move focus between splits — Ctrl+hjkl/arrows, with the `performable:` flag. | |
| # performable = Ghostty consumes the key ONLY if there's actually a Ghostty split | |
| # to move to. At an edge — or inside herdr, where Ghostty sees a single surface — | |
| # the key falls through to the running program, so herdr's vim-herdr-navigation | |
| # plugin (or nvim directly) handles the hop. One binding, works in all three. | |
| keybind = performable:ctrl+h=goto_split:left | |
| keybind = performable:ctrl+j=goto_split:down | |
| keybind = performable:ctrl+k=goto_split:up | |
| keybind = performable:ctrl+l=goto_split:right | |
| keybind = performable:ctrl+left=goto_split:left | |
| keybind = performable:ctrl+down=goto_split:down | |
| keybind = performable:ctrl+up=goto_split:up | |
| keybind = performable:ctrl+right=goto_split:right | |
| # Fixed 150% zoom (14 base × 1.5 = 21pt). | |
| keybind = cmd+ctrl+0=set_font_size:21 | |
| # cmd+a emits the ctrl+b byte (\x02) = herdr's prefix (its default). Keeps the | |
| # prefix on cmd+a without clashing with cmd+← (which sends \x01 = ctrl+a). | |
| keybind = cmd+a=text:\x02 | |
| # Clear screen. clear_screen doesn't work under herdr (the TUI repaints over it), | |
| # so send the `clear` command to the focused pane's shell. On cmd+k because | |
| # ctrl+shift+l is taken by herdr's switch-tab. | |
| keybind = cmd+k=text:clear\r | |
| # shift+enter -> ESC+Enter: newline without submitting in TUIs/REPLs. | |
| keybind = shift+enter=text:\x1b\r |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # ── General ────────────────────────────────────────────────────────── | |
| onboarding = false | |
| # ── Appearance ─────────────────────────────────────────────────────── | |
| # >>> herdr-theme-sync managed >>> | |
| # Rewritten by bin/herdr-theme-sync on macOS light/dark change. Edit palettes there. | |
| [theme] | |
| name = "catppuccin-latte" | |
| [theme.custom] | |
| panel_bg = "none" | |
| surface0 = "#e2e2e2" | |
| surface1 = "#d7d7d7" | |
| surface_dim = "#e8e8e8" | |
| overlay0 = "#6b6b6b" | |
| overlay1 = "#565656" | |
| text = "#353535" | |
| subtext0 = "#474747" | |
| red = "#a8334c" | |
| green = "#4f6c31" | |
| yellow = "#944927" | |
| blue = "#286486" | |
| mauve = "#88507d" | |
| teal = "#3b8992" | |
| peach = "#944927" | |
| accent = "#4f6c31" | |
| # <<< herdr-theme-sync managed <<< | |
| # ── Interface ───────────────────────────────────────────────────────── | |
| [ui] | |
| prompt_new_tab_name = false | |
| agent_panel_sort = "priority" | |
| show_agent_labels_on_pane_borders = true | |
| pane_gaps = false | |
| copy_on_select = true | |
| # Sidebar: which columns each row shows for agents and for spaces. | |
| [ui.sidebar.agents] | |
| row_gap = 0 | |
| rows = [ | |
| ["state_icon", "workspace"], | |
| ["terminal_title_stripped"], | |
| ] | |
| [ui.sidebar.spaces] | |
| row_gap = 0 | |
| rows = [ | |
| ["state_icon", "workspace", "branch", "git_status"], | |
| ] | |
| # Toast notifications (off) and clipboard-copy toasts. | |
| [ui.toast] | |
| delivery = "off" | |
| [ui.toast.clipboard] | |
| enabled = false | |
| position = "top-right" | |
| [ui.sound] | |
| enabled = false | |
| # ── Keybindings ─────────────────────────────────────────────────────── | |
| [keys] | |
| prefix = "ctrl+b" | |
| previous_workspace = "ctrl+shift+k" | |
| next_workspace = "ctrl+shift+j" | |
| previous_tab = "ctrl+shift+h" | |
| next_tab = "ctrl+shift+l" | |
| # prefix+e enters copy mode; prefix+Shift+e edits scrollback in $EDITOR. | |
| copy_mode = "prefix+e" | |
| edit_scrollback = "prefix+shift+e" | |
| previous_agent = "ctrl+shift+," | |
| next_agent = "ctrl+shift+." | |
| # prefix+1..9 jumps to a tab. Workspaces/agents go direct (no prefix) below. | |
| switch_tab = "prefix+1..9" | |
| # prefix+n creates a new worktree (default prefix+shift+g is unintuitive). | |
| new_worktree = "prefix+n" | |
| # prefix+d removes the current worktree (opens a confirmation). | |
| remove_worktree = "prefix+d" | |
| # prefix+shift+d closes the current workspace. | |
| close_workspace = "prefix+shift+d" | |
| # Direct jumps without the prefix: ctrl+1..9 -> workspace, ctrl+shift+1..9 -> agent. | |
| # Agents moved off alt: with macos-option-as-alt=false the Option key no longer | |
| # reaches herdr as Alt, so alt+1..9 was dead. ctrl+shift is unaffected. | |
| [keys.indexed] | |
| workspaces = "ctrl" | |
| agents = "ctrl+shift" | |
| # Command bindings — floating popups (each closes when its program exits). | |
| # prefix+ctrl+g opens lazygit. | |
| [[keys.command]] | |
| key = "prefix+ctrl+g" | |
| type = "popup" | |
| command = "lazygit" | |
| width = "90%" | |
| height = "85%" | |
| description = "lazygit popup" | |
| # prefix+shift+c opens a floating scratch shell. | |
| [[keys.command]] | |
| key = "prefix+shift+c" | |
| type = "popup" | |
| command = "zsh" | |
| width = "90%" | |
| height = "85%" | |
| description = "floating shell popup" | |
| # prefix+ctrl+r opens pet snippets in a popup. `pp` is a zsh alias | |
| # (pet exec --color), so run it through interactive zsh to resolve it. | |
| # ponytail: alias-only, breaks if you rename `pp`; hardcode `pet exec --color` if that matters. | |
| [[keys.command]] | |
| key = "prefix+ctrl+r" | |
| type = "popup" | |
| command = "pet exec --color" | |
| width = "90%" | |
| height = "85%" | |
| description = "pet snippets popup" | |
| # Command bindings — new tab. | |
| # prefix+ctrl+v opens nvim in a fresh focused tab. | |
| [[keys.command]] | |
| key = "prefix+ctrl+v" | |
| type = "shell" | |
| command = "herdr pane run \"$(herdr tab create --focus --label nvim | jq -r .result.root_pane.pane_id)\" nvim" | |
| description = "nvim in new tab" | |
| # Command bindings — seamless Ctrl+hjkl navigation between herdr panes and nvim splits. | |
| # Backed by the vim-herdr-navigation plugin (herdr plugin install | |
| # paulbkim-dev/vim-herdr-navigation). navigate.sh forwards the key to nvim when | |
| # the focused pane runs vim/nvim; otherwise it moves herdr pane focus. | |
| [[keys.command]] | |
| key = "ctrl+h" | |
| type = "plugin_action" | |
| command = "vim-herdr-navigation.left" | |
| description = "navigate left (vim/herdr)" | |
| [[keys.command]] | |
| key = "ctrl+j" | |
| type = "plugin_action" | |
| command = "vim-herdr-navigation.down" | |
| description = "navigate down (vim/herdr)" | |
| [[keys.command]] | |
| key = "ctrl+k" | |
| type = "plugin_action" | |
| command = "vim-herdr-navigation.up" | |
| description = "navigate up (vim/herdr)" | |
| [[keys.command]] | |
| key = "ctrl+l" | |
| type = "plugin_action" | |
| command = "vim-herdr-navigation.right" | |
| description = "navigate right (vim/herdr)" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment