diff options
| author | Igor Soarez <igor@soarez.org> | 2026-10-05 11:27:00 +0300 |
|---|---|---|
| committer | Igor Soarez <igor@soarez.org> | 2026-10-05 11:27:00 +0300 |
| commit | 48cd6744f077a3d59e61bbdcdb1e0bff8da7a540 (patch) | |
| tree | cc886117b31da7c02f99bd6392d32fbf79cf1cd7 /tmuxrdr | |
| parent | 986e760687a2d34051934d410bec71fa2efc349b (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.
Diffstat (limited to 'tmuxrdr')
| -rw-r--r-- | tmuxrdr/config/config.toml | 446 |
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. |
