Files
absolute-dotfiles/.tmux.conf
T
David Ibia d92041b6dd feat(tmux): ctrl+click a file path to open it by type
tmux-open-path takes the path under the mouse, strips :line:col, #L, @ and file:// decorations, and resolves it against the pane directory and then its git root. Markdown opens in Markdown Preview (added to Brewfile.apps), images, PDFs and directories in yazi, and everything else in nvim at the clicked line, both in a split beside the pane.
2026-10-10 22:12:36 +01:00

153 lines
5.1 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'
# Ctrl+click a file path in any pane (omo, shell, logs) to open it:
# markdown in Markdown Preview, images/pdf/dirs in yazi, the rest in nvim.
# yazi and nvim split beside the clicked pane. See ~/.local/bin/tmux-open-path.
bind -n C-MouseDown1Pane run-shell -b "~/.local/bin/tmux-open-path #{q:pane_id} #{q:pane_current_path} #{mouse_x} #{q:mouse_line}"
#
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'