Files
absolute-dotfiles/.tmux.conf
T
David Ibia 6fb7007ea9 feat(omo): coloured tab markers and clickable Ghostty banners
omo-notify now drives three signals from omo's UserPromptSubmit, Stop
and Notification hooks:

- A sound through afplay, so Focus modes cannot mute it
- A Ghostty notification (OSC 777) written to the session's tmux client
  terminal, so clicking it opens the tab it came from. This replaces the
  osascript banner, which opened Script Editor's file picker on click
- omo-status markers in front of the tab title: red error, amber
  waiting for input, green finished, blue working. A tab shows its most
  urgent agent; focusing it clears red, amber and green and selects the
  pane that sent the banner

tmux puts @omo_status in the title and runs omo-status on client focus.
2026-10-06 23:02:55 +01:00

148 lines
4.8 KiB
Bash

set -g mouse on
bind r source-file ~/.tmux.conf
set-option -a terminal-features 'xterm*:RGB'
# Extended keys so TUIs (omo, nvim) receive Shift+Enter and other modified keys
set -g extended-keys on
set -g extended-keys-format csi-u
set-option -a terminal-features 'xterm*:extkeys'
set-option -sg escape-time 10
set-option -g focus-events on
set-window-option -g mode-keys vi
set-option -g renumber-windows on
# Allow passthrough
set -gq allow-passthrough on
set -g visual-activity off
set -ga update-environment TERM
set -ga update-environment TERM_PROGRAM
# Key Bindings
# Auto Source tmux.conf
unbind r
bind r source-file ~/.tmux.conf \; display "Reloaded!"
# Set binding for searching with / and ?
bind-key / copy-mode \; send-key ?
# Setting up vi binds for tmux copy mode
bind-key -T copy-mode-vi "v" send-keys -X begin-selection
bind-key -T copy-mode-vi "y" send-keys -X copy-selection
unbind -T copy-mode-vi MouseDragEnd1Pane
# Setting up vertical split with |
unbind %
bind | split-window -h -c '#{pane_current_path}'
# Set base index to 1
set -g base-index 1
setw -g pane-base-index 1
# Set kill pane to Shift + Option + X
bind -n M-X kill-pane
# Setting up horizontal split with -
unbind '"'
bind - split-window -v -c '#{pane_current_path}'
unbind 'C'
bind C attach-session -c "#{pane_current_path}"
# Setting up window movement with leader key + Left/Right arrow
bind Left swap-window -t -1\; select-window -t -1
bind Right swap-window -t +1\; select-window -t +1
# Setting up pane resize with hjkl
bind -r j resize-pane -D 5
bind -r k resize-pane -U 5
bind -r l resize-pane -R 5
bind -r h resize-pane -L 5
# Setting up pane minimize/maximize with m
bind -r m resize-pane -Z
# Push tmux window/session info to the terminal title
set -g set-titles on
# omo-status puts a coloured marker (@omo_status) in front of the session name;
# focusing the tab clears the attention markers.
set -g set-titles-string "#{?@omo_status,#{@omo_status} ,}#{session_name}"
set-hook -g client-focus-in 'run-shell -b "~/.local/bin/omo-status focus #{q:hook_client}"'
# Set plugin manager path before loading plugins
set-environment -g TMUX_PLUGIN_MANAGER_PATH "$HOME/.tmux/plugins"
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'MunifTanjim/tmux-mode-indicator'
set -g @plugin 'omerxx/catppuccin-tmux'
set -g @plugin 'omerxx/tmux-sessionx'
set -g @plugin 'omerxx/tmux-floax'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @resurrect-dir "~/.tmux/resurrect"
set -g @resurrect-capture-pane-contents 'on'
set -g @sessionx-bind 's'
set -g @sessionx-window-mode 'on'
set -g @sessionx-tree-mode 'off'
set -g status-position top
set -g @catppuccin_window_left_separator ""
set -g @catppuccin_window_right_separator " "
set -g @catppuccin_window_middle_separator " █"
set -g @catppuccin_window_number_position "right"
set -g @catppuccin_window_default_fill "number"
set -g @catppuccin_window_default_text "#W"
set -g @catppuccin_window_current_fill "number"
set -g @catppuccin_window_current_text "#W#{?window_zoomed_flag,(),}"
set -g @catppuccin_status_modules_right "directory"
set -g @catppuccin_status_modules_left "session"
set -g @catppuccin_status_left_separator " "
set -g @catppuccin_status_right_separator " "
set -g @catppuccin_status_right_separator_inverse "no"
set -g @catppuccin_status_fill "icon"
set -g @catppuccin_status_connect_separator "no"
set -g @catppuccin_directory_text "#{b:pane_current_path}"
# set -g @catppuccin_date_time_text "%H:%M"
# for neovim
set -g @resurrect-strategy-nvim 'session'
set -g @continuum-restore 'on'
# Is VIM?
# TMUX Navigation
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|l?n?vim?x?|fzf|pipenv)(diff)?$'"
bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L'
bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D'
bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U'
bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R'
tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
bind-key -T copy-mode-vi 'C-h' select-pane -L
bind-key -T copy-mode-vi 'C-j' select-pane -D
bind-key -T copy-mode-vi 'C-k' select-pane -U
bind-key -T copy-mode-vi 'C-l' select-pane -R
bind-key -T copy-mode-vi 'C-\' select-pane -l
# Clipboard (OSC 52)
# Required for nested tmux (local tmux -> ssh/mosh -> remote tmux): the inner
# tmux sends its copies up as OSC 52, and tmux only accepts OSC 52 coming
# from a pane when set-clipboard is "on". The default "external" drops it.
set -g set-clipboard on
set -as terminal-features ',*:clipboard'
#
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'