aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Soarez <igor@soarez.org>2026-10-05 11:27:00 +0300
committerIgor Soarez <igor@soarez.org>2026-10-05 11:27:00 +0300
commit48cd6744f077a3d59e61bbdcdb1e0bff8da7a540 (patch)
treecc886117b31da7c02f99bd6392d32fbf79cf1cd7
parent986e760687a2d34051934d410bec71fa2efc349b (diff)
tmuxrdr: tmux-aligned herdr config
tmux's bindings on herdr's built-in actions, and the tmux-mode plugin's actions and popups for the rest, each entry commented with the tmux line it mirrors: tmux 3.7c's defaults with this machine's tmux.conf and ~/.tmux.conf.local on top. herdr defaults that collided with tmux keys moved; herdr's own kept where tmux leaves the key unbound.
-rw-r--r--tmuxrdr/config/config.toml446
1 files changed, 446 insertions, 0 deletions
diff --git a/tmuxrdr/config/config.toml b/tmuxrdr/config/config.toml
new file mode 100644
index 00000000..6202cda0
--- /dev/null
+++ b/tmuxrdr/config/config.toml
@@ -0,0 +1,446 @@
+# tmuxrdr's herdr config: herdr aligned with tmux -- this machine's
+# dot/config/tmux.conf plus ~/.tmux.conf.local over tmux 3.7c's defaults.
+# Every entry quotes the tmux line it mirrors; defaults are left explicit
+# where they already agree. ~/.config/herdr/config.toml is a link to this file
+# (tmuxrdr/scripts/install), so herdr reads it -- and its settings screen
+# writes it, in place -- here, under git. Apply edits to a running server with
+# prefix+r (or herdr server reload-config).
+
+# First-run onboarding already done.
+onboarding = false
+
+[theme]
+# tmux's colours come from ~/.local/share/tmux/color.conf, which bin/theme
+# generates from the host terminal's palette. herdr's "terminal" theme follows
+# the host terminal's ANSI palette directly -- same source, no generated file.
+name = "terminal"
+auto_switch = false
+
+[terminal]
+# tmux runs its panes' shells as login shells (default-command empty). herdr
+# "auto" is login shells on macOS -- the same; --login runs ~/.zprofile, which
+# restores PATH order after macOS rebuilds it.
+shell_mode = "auto"
+# tmux.conf: bind-key c new-window -c "#{pane_current_path}" -- and % and "
+# likewise. New windows and splits start where the pane is. herdr "follow"
+# inherits the source pane/workspace cwd.
+new_cwd = "follow"
+
+[keys]
+# tmux.conf: set-option -g prefix C-b -- herdr's default prefix, left explicit.
+prefix = "ctrl+b"
+
+# tmux's default: prefix+d detaches. herdr's default is prefix+q; take tmux's.
+detach = "prefix+d"
+
+# tmux.conf: bind r source-file ~/.tmux.conf \; display-message "Config
+# reloaded..." -- prefix+r reloads. herdr's default is prefix+shift+r; take
+# tmux's.
+reload_config = "prefix+r"
+
+# prefix+r above was herdr's resize mode; moved here. tmux has no resize mode
+# at all -- it resizes directly on prefix+C-arrows / prefix+M-arrows, below.
+resize_mode = "prefix+ctrl+r"
+
+# tmux's default: prefix+M-arrow resizes the pane by 5 cells (resize-pane -L 5,
+# ...). herdr resizes by a fraction of the area, not cells; its native step is
+# 0.05 -- about 5 cells of a 100-column pane. prefix+C-arrow, tmux's 1-cell
+# resize, is a custom command with a 0.01 step at the end of [keys]. tmux
+# repeats both (-r) without re-pressing the prefix; herdr's prefix is one-shot.
+resize_pane_left = "prefix+alt+left"
+resize_pane_down = "prefix+alt+down"
+resize_pane_up = "prefix+alt+up"
+resize_pane_right = "prefix+alt+right"
+
+# tmux.conf: bind h select-pane -L (and j/k/l -D/-U/-R); tmux's default:
+# prefix+arrow does the same (select-pane -L, ...).
+focus_pane_left = ["prefix+h", "prefix+left"]
+focus_pane_down = ["prefix+j", "prefix+down"]
+focus_pane_up = ["prefix+k", "prefix+up"]
+focus_pane_right = ["prefix+l", "prefix+right"]
+
+# tmux.conf: bind-key c new-window -c ... -- herdr's default already.
+new_tab = "prefix+c"
+
+# tmux's default: prefix+n / prefix+p next/previous window -- herdr's defaults.
+next_tab = "prefix+n"
+previous_tab = "prefix+p"
+
+# tmux.conf: set-option -g base-index 1 -- windows number from 1, so prefix+1
+# is the first window. herdr's prefix+1..9 counts tabs by their place in the
+# tab bar, from 1, and an unnamed tab shows that place -- tmux with
+# renumber-windows on, where this tmux leaves gaps after a close (tmuxrdr/ROADMAP.md).
+# prefix+0 is the plugin's select-window-0 below: nothing at index 0 under
+# base-index 1, in tmux and here.
+switch_tab = "prefix+1..9"
+
+# tmux's default: prefix+, renames the window. herdr's default is
+# prefix+shift+t; take tmux's comma.
+rename_tab = "prefix+comma"
+
+# tmux's sessions are herdr's workspaces, its windows herdr's tabs.
+# tmux's default: prefix+$ renames the session; herdr's prefix+shift+w kept.
+rename_workspace = ["prefix+$", "prefix+shift+w"]
+# tmux's default: prefix+( / prefix+) previous / next session.
+previous_workspace = "prefix+("
+next_workspace = "prefix+)"
+
+# tmux's default: prefix+s chooses a session (choose-tree -Zs) -- herdr's
+# workspace picker, moved here from prefix+w.
+workspace_picker = "prefix+s"
+# tmux's default: prefix+w chooses a window (choose-tree -Zw) and prefix+f finds
+# one by name; herdr's navigator lists every tab and pane, with / to search.
+# prefix+q (display-panes) shows numbers to jump by in tmux -- the navigator is
+# the nearest herdr has (tmuxrdr/ROADMAP.md). herdr's own prefix+g kept.
+goto = ["prefix+w", "prefix+f", "prefix+q", "prefix+g"]
+# tmux's default: prefix+C (customize-mode) -- herdr's settings, moved from
+# prefix+s.
+settings = "prefix+C"
+# tmux's default: prefix+? lists the keys, prefix+/ describes one; herdr's help
+# lists them and filters with /.
+help = ["prefix+?", "prefix+/"]
+
+# tmux's default: prefix+o selects the next pane; herdr's prefix+tab kept.
+cycle_pane_next = ["prefix+o", "prefix+tab"]
+# herdr's "jump to the notification" was on prefix+o; tmux has nothing on a.
+open_notification_target = "prefix+a"
+
+# tmux's default: prefix+M-n / prefix+M-p go to the next / previous window
+# with an alert. herdr's alerts are agents waiting or done, and these walk the
+# agent list -- close, not the same.
+next_agent = "prefix+alt+n"
+previous_agent = "prefix+alt+p"
+
+# herdr's directional swaps sat on prefix+shift+h/j/k/l, and tmux's prefix+L
+# (switch-client -l, the plugin's last-session below) needs shift+l. tmux binds
+# no directional swap; its prefix+{ / prefix+} swap by pane order, below.
+swap_pane_left = "prefix+alt+h"
+swap_pane_down = "prefix+alt+j"
+swap_pane_up = "prefix+alt+k"
+swap_pane_right = "prefix+alt+l"
+
+# tmux's default copy-mode binding ([), vi keys inside it (mode-keys vi): v
+# begins a selection, y copies to the clipboard -- herdr's copy mode is
+# vi-style by default with the same keys.
+copy_mode = "prefix+["
+
+# tmux.conf: bind V send-keys C-c C-u 'tmux capture-pane -Jp -S- | vim -'
+# Enter -- the whole scrollback in the editor. herdr's equivalent opens the
+# pane scrollback in $EDITOR; same key as tmux's V.
+edit_scrollback = "prefix+shift+v"
+
+# tmux.conf rebinds % (side by side) and " (stacked), both with
+# -c "#{pane_current_path}". tmux's own keys: herdr's parser takes named
+# punctuation far past the docs' example list (src/config/keybinds.rs:
+# "percent" -> '%', "double_quote" -> '"', "quote" -> '\'') and bare
+# characters too, and its matcher maps both input encodings onto them --
+# legacy terminals deliver the literal char, kitty-protocol ones deliver
+# shift+5 / shift+' with the shifted codepoint (shifted_char_matches_expected).
+# herdr's v kept alongside (tmux leaves prefix+v unbound); its minus is not,
+# being tmux's prefix+- (delete-buffer). tmux 3.7's prefix+* (new-pane) splits
+# the current pane stacked, as " does.
+split_vertical = ["prefix+%", "prefix+v"]
+split_horizontal = ["prefix+\"", "prefix+*"]
+
+# tmux's default: prefix+; jumps back to the previously focused pane
+# (select-pane -l). Semicolon is a named key too; herdr's last_pane is unset
+# by default, so tmux's takes it.
+last_pane = "prefix+;"
+
+# tmux's default: prefix+z zooms the pane -- herdr's default already.
+zoom = "prefix+z"
+
+# tmux's default: prefix+x kills the pane after asking (confirm-before). herdr
+# closes without asking, so its binding is cleared and prefix+x is the plugin's
+# (y/n) popup below. herdr's own closes stay in the pane's right-click menu.
+close_pane = ""
+
+# tmux's default: prefix+C-arrow resizes the pane by 1 cell (resize-pane -L,
+# ...). herdr's CLI resizes by a fraction of the area; 0.01 is about one cell
+# of a 100-column pane, keeping tmux's 1:5 ratio against prefix+M-arrow above.
+# tmux.conf's bind-key C-b send-prefix needs nothing: in herdr, pressing the
+# prefix twice sends a literal prefix (src/client/shell/input.rs).
+[[keys.command]]
+key = "prefix+ctrl+left"
+type = "shell"
+command = '"$HERDR_BIN_PATH" pane resize --direction left --amount 0.01 --pane "$HERDR_ACTIVE_PANE_ID"'
+description = "resize pane left 1 cell (tmux C-Left)"
+
+[[keys.command]]
+key = "prefix+ctrl+down"
+type = "shell"
+command = '"$HERDR_BIN_PATH" pane resize --direction down --amount 0.01 --pane "$HERDR_ACTIVE_PANE_ID"'
+description = "resize pane down 1 cell (tmux C-Down)"
+
+[[keys.command]]
+key = "prefix+ctrl+up"
+type = "shell"
+command = '"$HERDR_BIN_PATH" pane resize --direction up --amount 0.01 --pane "$HERDR_ACTIVE_PANE_ID"'
+description = "resize pane up 1 cell (tmux C-Up)"
+
+[[keys.command]]
+key = "prefix+ctrl+right"
+type = "shell"
+command = '"$HERDR_BIN_PATH" pane resize --direction right --amount 0.01 --pane "$HERDR_ACTIVE_PANE_ID"'
+description = "resize pane right 1 cell (tmux C-Right)"
+
+# The rest of tmux's default prefix table, from tmuxrdr's tmux-mode plugin
+# (tmuxrdr/plugin), which tmuxrdr/scripts/install links as
+# ~/.local/share/tmuxrdr/plugin -- the stable path the popups below run from --
+# and registers with `herdr plugin link`. Each
+# script there says what of tmux it reproduces and how. Popups stand in for
+# tmux's status-line prompts; toasts for its status-line messages.
+
+[[keys.command]]
+key = "prefix+!"
+type = "plugin_action"
+command = "tmuxrdr.tmux-mode.break-pane"
+description = "break-pane (tmux !)"
+
+[[keys.command]]
+key = "prefix+0"
+type = "plugin_action"
+command = "tmuxrdr.tmux-mode.select-window-0"
+description = "select-window -t :=0 (tmux 0)"
+
+[[keys.command]]
+key = "prefix+'"
+type = "popup"
+command = 'sh "$HOME/.local/share/tmuxrdr/plugin/bin/select-window"'
+width = 30
+height = 3
+description = "select-window by index (tmux ')"
+
+[[keys.command]]
+key = "prefix+."
+type = "popup"
+command = 'sh "$HOME/.local/share/tmuxrdr/plugin/bin/move-window"'
+width = 30
+height = 3
+description = "move-window to an index (tmux .)"
+
+[[keys.command]]
+key = "prefix+{"
+type = "plugin_action"
+command = "tmuxrdr.tmux-mode.swap-prev"
+description = "swap-pane -U (tmux {)"
+
+[[keys.command]]
+key = "prefix+}"
+type = "plugin_action"
+command = "tmuxrdr.tmux-mode.swap-next"
+description = "swap-pane -D (tmux })"
+
+[[keys.command]]
+key = "prefix+ctrl+o"
+type = "plugin_action"
+command = "tmuxrdr.tmux-mode.rotate-up"
+description = "rotate-window (tmux C-o)"
+
+[[keys.command]]
+key = "prefix+alt+o"
+type = "plugin_action"
+command = "tmuxrdr.tmux-mode.rotate-down"
+description = "rotate-window -D (tmux M-o)"
+
+[[keys.command]]
+key = "prefix+m"
+type = "plugin_action"
+command = "tmuxrdr.tmux-mode.mark"
+description = "select-pane -m, toggle mark (tmux m)"
+
+[[keys.command]]
+key = "prefix+M"
+type = "plugin_action"
+command = "tmuxrdr.tmux-mode.clear-mark"
+description = "select-pane -M, clear mark (tmux M)"
+
+# tmux's prefix+l (last-window) is this tmux.conf's select-pane -R, so it has
+# no key in either; tmuxrdr.tmux-mode.last-window and the : prompt still have it.
+[[keys.command]]
+key = "prefix+L"
+type = "plugin_action"
+command = "tmuxrdr.tmux-mode.last-session"
+description = "switch-client -l (tmux L)"
+
+[[keys.command]]
+key = "prefix+]"
+type = "plugin_action"
+command = "tmuxrdr.tmux-mode.paste-buffer"
+description = "paste-buffer -p (tmux ])"
+
+[[keys.command]]
+key = "prefix+i"
+type = "plugin_action"
+command = "tmuxrdr.tmux-mode.display-message"
+description = "display-message (tmux i)"
+
+[[keys.command]]
+key = "prefix+E"
+type = "plugin_action"
+command = "tmuxrdr.tmux-mode.spread-layout"
+description = "select-layout -E (tmux E)"
+
+[[keys.command]]
+key = "prefix+x"
+type = "popup"
+command = 'sh "$HOME/.local/share/tmuxrdr/plugin/bin/confirm-kill" pane'
+width = 30
+height = 3
+description = "kill-pane, after y/n (tmux x)"
+
+[[keys.command]]
+key = "prefix+&"
+type = "popup"
+command = 'sh "$HOME/.local/share/tmuxrdr/plugin/bin/confirm-kill" window'
+width = 40
+height = 3
+description = "kill-window, after y/n (tmux &)"
+
+[[keys.command]]
+key = "prefix+:"
+type = "popup"
+command = 'sh "$HOME/.local/share/tmuxrdr/plugin/bin/command-prompt"'
+width = "70%"
+height = 12
+description = "command-prompt (tmux :)"
+
+[[keys.command]]
+key = "prefix+t"
+type = "popup"
+command = 'sh "$HOME/.local/share/tmuxrdr/plugin/bin/clock-mode"'
+width = "60%"
+height = 11
+description = "clock-mode (tmux t)"
+
+[[keys.command]]
+key = "prefix+~"
+type = "popup"
+command = 'sh "$HOME/.local/share/tmuxrdr/plugin/bin/show-messages"'
+width = "90%"
+height = "90%"
+description = "show-messages (tmux ~)"
+
+[ui]
+# tmux.conf: set-option -g mouse on -- herdr's default, left explicit.
+mouse_capture = true
+
+# tmux.conf unbinds copy-mode-vi MouseDragEnd1Pane ("stay in copy mode on drag
+# end"): a dragged selection stays on screen until y copies it. herdr's
+# copy_on_select false keeps the selection until Ctrl+C or a host-forwarded
+# Cmd+C copies and clears -- the closest match.
+copy_on_select = false
+
+# tmux.conf: WheelUp/DownPane -N 3 scroll -- "3 lines at a time instead of
+# default 5". herdr's default is already 3, left explicit.
+mouse_scroll_lines = 3
+
+# # tmux's status line sits at the bottom of the screen; herdr draws its tab bar
+# # at the top by default. Bottom, like tmux.
+# tab_bar_position = "bottom"
+
+# tmux.conf: set-option -g status-right '#h %a %d-%b %H:%M', replaced by
+# ~/.tmux.conf.local with '%d-%b %H:%M' -- day-month and time at the right edge
+# of the status line. herdr's tab_bar_right is the same right-hand slot.
+# { type = "hostname" } first, if ever the hostname is wanted back.
+tab_bar_right = [
+ { type = "datetime", format = "%d-%b %H:%M" },
+]
+
+# tmux always shows its status line; herdr's default already does the same.
+hide_tab_bar_when_single_tab = false
+
+# tmux's new-window never asks for a name; herdr asks by default.
+prompt_new_tab_name = false
+
+# tmux.conf: automatic-rename on, automatic-rename-format
+# '#{b:pane_current_path}', status-interval 5 -- windows name themselves after
+# their pane's directory. herdr names no tab (an unnamed one shows its place
+# in the tab bar). tmux-mode's bin/automatic-rename does it, a manual rename
+# switching it off for that tab as in tmux, run every 5 s as a tab_bar_right
+# command entry that prints nothing. Off while tab_bar_right is commented out
+# above; to have it, give tab_bar_right this entry:
+# { type = "command", command = "sh ~/.local/share/tmuxrdr/plugin/bin/automatic-rename", interval_seconds = 5, timeout_seconds = 4 }
+
+# tmux draws pane borders only when a window is split; a lone pane has none.
+# herdr's "auto" is the same.
+pane_borders = "auto"
+
+# tmux panes share thin divider lines: no gaps, no frame around the pane
+# area. herdr's config reference names this exact combination "tmux-style
+# internal splitters without an outside frame".
+pane_gaps = false
+pane_outer_borders = false
+
+# tmux has no scrollbars beside its panes.
+pane_scrollbars = false
+
+# tmux never writes the outer terminal's title (set-titles off by default,
+# left off) -- and the terminals pin their own titles anyway
+# (dynamic_title = false / title =). Empty leaves the outer title alone.
+# window_title = ""
+
+# tmux.conf: set-window-option -g monitor-activity on -- other windows'
+# activity shows as marks in the status line. herdr's equivalent is the live
+# agent state in the sidebar and tab bar; "symbols" distinguishes
+# blocked/working/done by shape as well as colour.
+status_indicators = "symbols"
+
+[ui.toast]
+# tmux.conf: set-option -g visual-activity on -- a status-line message the
+# moment another window turns active. herdr's in-app toast for background
+# agents finishing or needing input is the closest match; 0 sends it
+# immediately, like tmux, rather than after the default 1s debounce.
+delivery = "herdr"
+# delay_seconds = 0
+
+[ui.sound]
+# No tmux counterpart -- tmux is silent. Kept from this machine's existing
+# config rather than from tmux; delete this block for strict tmux behaviour.
+enabled = true
+
+# [advanced]
+# # tmux.conf: set-option -g history-limit 100000. tmux counts lines, herdr
+# # bytes: 100000 lines of a ~250-byte average line ≈ 25 MB. herdr's default is
+# # 10 MB ("matches Ghostty's default scrollback-limit behaviour"); this is the
+# # tmux-sized version.
+# scrollback_limit_bytes = 25000000
+
+# [server]
+# # A tmux session with no client attached is 80x24 until a client reattaches
+# # and everything reflows. herdr's headless fallback is 120x40 by default;
+# # tmux's.
+# headless_cols = 80
+# headless_rows = 24
+
+# [experimental]
+# # tmux scrollback dies with the server. herdr can persist pane screen history
+# # across restarts; off, like tmux.
+# pane_history = false
+
+# --- tmux.conf lines with no herdr 0.9.3 equivalent -----------------------
+# set -g focus-events on -- no switch; herdr forwards what it can itself.
+# set -g exit-unattached off / destroy-unattached off -- inherent: the server
+# and every pane keep running with no client attached; nothing to configure.
+# set -g escape-time 0 -- no input-delay switch.
+# set-window-option -g aggressive-resize on -- no switch; herdr already sizes
+# each tab to the client that most recently focused or interacted with it
+# (the per-session smallest client is not herdr's model), which is the same
+# intent.
+# bind ` setw synchronize-panes -- no broadcast/synchronize-panes equivalent;
+# tmuxrdr/ROADMAP.md in the tmuxrdr repo has it with the other fork-only gaps.
+# ctrl+d on the last pane: tmux exits its client and, under exec tmux, the
+# terminal window closes. herdr closes the pane, its tab and its workspace,
+# then opens a fresh workspace when the session has none -- the client and
+# the server both stay up, the window stays open (verified on 0.9.3). No
+# config key changes that; `herdr server stop` is the only full teardown.
+# set -g status-interval 5 -- no equivalent; the datetime above is live and
+# command entries take their own interval_seconds.
+# set -g allow-rename off -- no switch; apps cannot rename herdr tabs anyway.
+# set -g status-keys emacs -- herdr's own text fields are emacs-style by
+# default (ctrl+a/e etc.).
+# default-terminal / terminal-features / terminal-overrides / allow-passthrough
+# / extended-keys -- herdr owns the emulation and negotiates with the outer
+# terminal itself; there is nothing to configure from inside.
+# set -wg mode-style ... -- no copy-mode selection colour key; the "terminal"
+# theme above follows the host palette instead.