fix(tmux): macOS clipboard, C-a passthrough, vim detection

- y/p use pbcopy/pbpaste (xsel is X11, absent on macOS); xsel kept as the Linux variant in a comment
- bind C-a send-prefix: C-a C-a sends a literal C-a to the shell
- is_vim reads #{pane_current_command}; the @tmux_vim_<pane> variable was never set, so C-h/j/k/l never reached vim
This commit is contained in:
bchanot
2026-10-06 12:41:18 +02:00
parent 7adcef4f94
commit d639f22e08
+11 -14
View File
@@ -43,12 +43,11 @@ set -g set-titles-string '#S :: #W :: #F#P #{pane_current_command}'
# Variables: {{{ # Variables: {{{
# --------- # ---------
is_vim='tmux show -v "@tmux_vim_#{pane_id}" | grep yes' # check if is vim is_vim='echo "#{pane_current_command}" | grep -iqE "(^|\/)g?(view|n?vim?)(diff)?$"'
# is_vim Note: {{{ # is_vim Note: {{{
# vim is actually changing values of a variable to make it visible by tmux. # The pane's foreground command, as tmux sees it. The older variant read a
# Without this, tmux would have to grep the current pane to see what is # "@tmux_vim_<pane>" variable that a vim plugin had to set; nothing sets it
# running. ex: # here, so C-h/j/k/l never reached vim.
# echo "#{pane_current_command}" | grep -iqE "(^|\/)g?(view|n?vim?)(diff)?$"
# }}} # }}}
resurrect_root_dir="$XDG_CACHE_HOME/tmux/resurect" resurrect_root_dir="$XDG_CACHE_HOME/tmux/resurect"
@@ -114,6 +113,7 @@ unbind-key -T copy-mode-vi MouseDragEnd1Pane # (mouse setting) {{{
# }}} # }}}
set -g prefix C-a # bind screen like prefix set -g prefix C-a # bind screen like prefix
bind C-a send-prefix # C-a C-a = literal C-a (shell home)
# specific commands # specific commands
bind-key C-o command-prompt "new-session -s %1 -c ~" bind-key C-o command-prompt "new-session -s %1 -c ~"
@@ -136,16 +136,13 @@ bind -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R"
bind Escape copy-mode # bind vi-like 'normal' mode bind Escape copy-mode # bind vi-like 'normal' mode
bind -Tcopy-mode-vi 'v' send -X begin-selection # bind vi-like visual mode bind -Tcopy-mode-vi 'v' send -X begin-selection # bind vi-like visual mode
bind -Tcopy-mode-vi 'y' send -X copy-pipe-and-cancel "xsel -b -i" # xsel copy bind -Tcopy-mode-vi 'y' send -X copy-pipe-and-cancel "pbcopy" # macOS copy
bind p run "xsel -b -o | tmux load-buffer - ; tmux paste-buffer" # xsel paste bind p run "pbpaste | tmux load-buffer - ; tmux paste-buffer" # macOS paste
# bind vi-like copy/paste through 'normal' mode, (Note) {{{ # bind vi-like copy/paste through 'normal' mode, (Note) {{{
# It is encouraged to use xsel instead of xclip, because xclip does not close # Linux (X11) variant, xsel rather than xclip: xclip does not close STDOUT
# STDOUT after it has read from tmux's buffer. As such, tmux doesn't know # after reading tmux's buffer, so tmux waits for it and hangs.
# that the copy task has completed, and continues to wait for xclip's # bind -Tcopy-mode-vi 'y' send -X copy-pipe-and-cancel "xsel -b -i"
# termination, thereby rendering tmux unresponsive. # bind p run "xsel -b -o | tmux load-buffer - ; tmux paste-buffer"
# Here an example of copy paste with pbcopy/pbpaste (macos)
# bind -Tcopy-mode-vi 'y' send -X copy-pipe-and-cancel "pbcopy"
# bind p run "pbpaste | tmux load-buffer - ; tmux paste-buffer"
# }}} # }}}
bind-key -Tcopy-mode-vi Escape send -X cancel # cancel v mode bind-key -Tcopy-mode-vi Escape send -X cancel # cancel v mode
bind-key -Tcopy-mode-vi ^v send -X rectangle-toggle # cancel v mode bind-key -Tcopy-mode-vi ^v send -X rectangle-toggle # cancel v mode