158 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| # Address vim mode switching delay & garbage text on start
 | |
| set -s escape-time 1
 | |
| 
 | |
| # Set global hooks to perform actions when events occur
 | |
| set-hook -g session-created 'run ~/.config/tmux/hooks/session-create.sh'
 | |
| 
 | |
| # Set the tmux version to check for command support
 | |
| run 'tmux setenv -g TMUX_VERSION $(tmux -V | cut -c 6-8)'
 | |
| 
 | |
| # Use vim keybindings in copy mode
 | |
| set -g mode-keys vi
 | |
| 
 | |
| # Change prefix to C-Space
 | |
| unbind C-b
 | |
| set -g prefix C-Space
 | |
| bind Space send-prefix
 | |
| 
 | |
| # Increase scrollback buffer size
 | |
| set -g history-limit 1000000
 | |
| 
 | |
| # Set tmux messages display time to 4 seconds
 | |
| set -g display-time 4000
 | |
| 
 | |
| # Refresh 'status-left' and 'status-right' more often
 | |
| set -g status-interval 2
 | |
| 
 | |
| # Upgrade $TERM
 | |
| set -g default-terminal "tmux-256color"
 | |
| 
 | |
| # Enable true-color
 | |
| if '[[ "$TMUX_VERSION" < "3.2" ]]' \
 | |
|   'set-option -as terminal-features ",xterm*:Tc"' \
 | |
|   'set-option -as terminal-features ",xterm*:RGB"'
 | |
| 
 | |
| # Focus events enabled for terminals that support them
 | |
| set -g focus-events on
 | |
| 
 | |
| # Aggressively resize the chosen window to smallest/largest session
 | |
| setw -g aggressive-resize on
 | |
| 
 | |
| # Start window & pane index at 1
 | |
| set -g pane-base-index 1
 | |
| 
 | |
| # Enable mouse support
 | |
| set-option -g mouse on
 | |
| # Prevent mouse click up events exiting copy mode
 | |
| unbind -T copy-mode-vi MouseDragEnd1Pane
 | |
| 
 | |
| # Enable changing cursor shape per pane, vim or zsh should emit escape
 | |
| # sequences to change cursor shape.
 | |
| # iTerm2 only requires this before tmux 2.9
 | |
| if '[ -n $ITERM_PROFILE ] && [[ "$TMUX_VERSION" < "2.9" ]]' \
 | |
|   'set -ga terminal-overrides "*:Ss=\E]1337;CursorShape=%p1%d\7"'
 | |
| # VTE compatible terminals.
 | |
| if '[ ! -n $ITERM_PROFILE ]' \
 | |
|   'set -ga terminal-overrides "*:Ss=\E[%p1%d q:Se=\E[2 q"'
 | |
| 
 | |
| # Enable strikethrough on VTE compatible terminals.
 | |
| set -ga terminal-overrides 'xterm*:smxx=\E[9m'
 | |
| 
 | |
| # Set only on macOS where it's required
 | |
| if -b '[ "`uname`" = "Darwin" ]' \
 | |
|   'set -g default-command "reattach-to-user-namespace -l $SHELL"'
 | |
| 
 | |
| # Open a popup with running the default shell
 | |
| bind T display-popup -S fg=#54546D -b rounded -d '#{pane_current_path}' -E $SHELL
 | |
| # Open a popup with session creator/switcher
 | |
| bind S display-popup -B -w 60 -h 10 -E '~/.config/tmux/session.sh'
 | |
| # Open a popup with project selector
 | |
| bind P display-popup -B -w 60 -h 10 -E '~/.config/tmux/project.sh'
 | |
| # Open a popup to pick an interpreter then launch it
 | |
| bind I display-popup -S fg=#54546D -b rounded -d '#{pane_current_path}' -E '$SHELL -i ~/.config/tmux/interpreter.sh'
 | |
| 
 | |
| # Restore old next/previous window bindings
 | |
| bind C-n next-window
 | |
| bind C-p previous-window
 | |
| 
 | |
| # Kill current window
 | |
| bind W kill-window
 | |
| 
 | |
| # Make new splits open in current directory
 | |
| bind '"' split-window -c '#{pane_current_path}'
 | |
| bind '%' split-window -h -c '#{pane_current_path}'
 | |
| 
 | |
| # Change word separators to better match Vim.
 | |
| set -g word-separators "<>(){}[]/'\";@*+,.-_=!£$%^&:#~?`¬|\\ "
 | |
| 
 | |
| # Integrate pane selection with vim
 | |
| in_vim='tmux show-window-options | grep -q "@vim#{pane_id}"'
 | |
| bind -n C-h if $in_vim 'send-keys C-h' 'select-pane -L'
 | |
| bind -n C-j if $in_vim 'send-keys C-j' 'select-pane -D'
 | |
| bind -n C-k if $in_vim 'send-keys C-k' 'select-pane -U'
 | |
| bind -n C-l if $in_vim 'send-keys C-l' 'select-pane -R'
 | |
| 
 | |
| # Integrate urlscan or fallback to urlview
 | |
| if -b 'which urlscan' \
 | |
|   'bind u capture-pane \; split-window "tmux show-buffer | urlscan"' \
 | |
|   'bind u capture-pane \; split-window "tmux show-buffer | urlview -"'
 | |
| 
 | |
| # Unbind copy mode defaults so pane selection works
 | |
| unbind -T copy-mode-vi C-h
 | |
| unbind -T copy-mode-vi C-j
 | |
| # Enter copy mode with C-U
 | |
| bind C-u copy-mode -u
 | |
| # Begin selection in copy mode with v not Space
 | |
| bind -T copy-mode-vi v send -X begin-selection
 | |
| bind -T copy-mode-vi V send -X select-line
 | |
| bind -n C-v if-shell -F '#{pane_in_mode}' \
 | |
|   'send -X rectangle-toggle' \
 | |
|   'send-keys C-v'
 | |
| # Exit copy mode with i/a
 | |
| bind -T copy-mode-vi 'i'   send -X cancel
 | |
| bind -T copy-mode-vi 'a'   send -X cancel
 | |
| # Search without entering copy-mode first
 | |
| bind '/' 'copy-mode;send-keys /'
 | |
| bind '?' 'copy-mode;send-keys ?'
 | |
| 
 | |
| # Enable mouse scrolling up in alternate buffers.
 | |
| # If #{mouse_any_flag} is 1 the pane is running with mouse support, e.g. vim.
 | |
| # If #{alternate_on} is 1 the terminal is in alternate buffer mode, e.g. less.
 | |
| # If #{pane_in_mode} is 1 the pane is in copy-mode.
 | |
| bind -n WheelUpPane \
 | |
|   if -Ft= "#{mouse_any_flag}" \
 | |
|     "send-keys -M" \
 | |
|     "if -Ft= \"#{alternate_on}\" \
 | |
|       \"send-keys -t= Up ; \
 | |
|         send-keys -t= Up ; \
 | |
|         send-keys -t= Up ; \" \
 | |
|       \"select-pane -t= ; \
 | |
|         if -Ft= '#{pane_in_mode}' \
 | |
|           'send-keys -M' \
 | |
|           'copy-mode -e ; send-keys -M' \" "
 | |
| # Emulate mouse scrolling down in alternate buffers.
 | |
| bind -n WheelDownPane \
 | |
|   if -Ft= "#{mouse_any_flag}" \
 | |
|     "send-keys -M" \
 | |
|     "if -Ft= \"#{alternate_on}\" \
 | |
|       \"send-keys -t= Down ; \
 | |
|         send-keys -t= Down ; \
 | |
|         send-keys -t= Down ; \" \
 | |
|       \"select-pane -t= ; \
 | |
|         send-keys -M\" "
 | |
| 
 | |
| # Enable setting clipboard with OSC-52 when in an SSH session
 | |
| if -b '[ "$SSH_TTY" != "" ]' \
 | |
|   'set-option -g set-clipboard on'
 | |
| 
 | |
| # Yank to the system clipboard in copy mode.
 | |
| # TODO: reattach-to-user-namespace not necessary with tmux > 2.6
 | |
| if -b '[ "`uname`" = "Darwin" ]' \
 | |
|   'bind -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy"'
 | |
| # When not in WSL2 use xsel, when in WSL use win32yank.exe to avoid UI lockups.
 | |
| if -b '[ "$WSLENV" = "" ]' \
 | |
|   'bind -T copy-mode-vi y send-keys -X copy-pipe "xsel -i --clipboard"' \
 | |
|   'bind -T copy-mode-vi y send-keys -X copy-pipe "win32yank.exe -i -crlf"'
 | |
| 
 | |
| source-file ~/.config/tmux/theme.tmux
 |