-
Notifications
You must be signed in to change notification settings - Fork 0
/
.tmux.conf
221 lines (164 loc) · 8.45 KB
/
.tmux.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
################################################################################
# Terminal Options
################################################################################
# Use 256-color mode in tmux
set-option -g default-terminal "screen-256color"
# Add the RGB capability for xterm-256color
set-option -as terminal-features ",xterm-256color:RGB"
# Increase history limit to 50,000 lines
set-option -g history-limit 50000
# Improve (reduce) vim mode switching delay (http://superuser.com/a/252717/65504)
set-option -sg escape-time 5
# Send focus events to Neovim
set-option -g focus-events on
# Titles, mouse, and status
set-option -g set-titles on
set-option -g mouse on
set-option -g status-position top
################################################################################
# Window & Pane Indices
################################################################################
# Base tab index at 1
set-option -g base-index 1
set-window-option -g pane-base-index 1
# Renumber windows after closing one
set-option -g renumber-windows on
################################################################################
# Cursor Shape
################################################################################
# Attempt to configure cursor shape overrides
set-option -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q'
################################################################################
# Prefix Key
################################################################################
# Set prefix to Ctrl+Space
set-option -g prefix C-space
################################################################################
# Bindings
################################################################################
# Prefer vi style key table
set-option -wg mode-keys vi
# But emacs style for status line input. Because I expect Esc function line "Cancel" on status line.
set-option -wg status-keys emacs
unbind r
bind r source-file ~/.tmux.conf \; display-message "Configuration reloaded"
# Prefix + ? = show a floating fzf to search bindings
bind ? display-popup -E "tmux list-keys -N | fzf"
# Begin selection in copy-mode-vi with 'v'
bind -T copy-mode-vi v send-keys -X begin-selection
# Copy selection with Ctrl-C (while in copy-mode-vi)
unbind-key -T copy-mode-vi MouseDragEnd1Pane
bind-key -T copy-mode-vi 'C-c' send -X copy-selection
# Clear terminal and tmux scrollback buffer with Ctrl+L
bind -n C-l send-keys C-l \; run 'sleep 0.1' \; clear-history
################################################################################
# Pane Management
################################################################################
# Alt+f = toggle pane zoom
bind -n M-f resize-pane -Z
# Alt+Shift + H/J/K/L = resize pane by 5 columns/rows
bind -n M-H resize-pane -L 5
bind -n M-J resize-pane -D 5
bind -n M-K resize-pane -U 5
bind -n M-L resize-pane -R 5
# Alt+Shift+x = kill current pane
bind -n M-X kill-pane
# Alt+d = detach client
bind -n M-d detach-client
# Prefix + s/v = split horizontally/vertically into same directory
bind s split-window -h -c "#{pane_current_path}"
bind v split-window -v -c "#{pane_current_path}"
################################################################################
# Window Navigation
################################################################################
# Navigate through windows with Alt + left/right
bind -n M-right next-window
bind -n M-left previous-window
# Jump to window N with Alt + N
bind -n M-1 select-window -t 1
bind -n M-2 select-window -t 2
bind -n M-3 select-window -t 3
bind -n M-4 select-window -t 4
bind -n M-5 select-window -t 5
bind -n M-6 select-window -t 6
bind -n M-7 select-window -t 7
bind -n M-8 select-window -t 8
bind -n M-9 select-window -t 9
bind -n M-0 select-window -t 10
# Move window to the next/previous index with Alt + Shift + right/left
bind -n M-S-right swap-window -t +1 -d
bind -n M-S-left swap-window -t -1 -d
# Create a new window (prompt for name)
bind-key c command-prompt -p "Name of new window: " "new-window -n '%%'"
################################################################################
# Session Management
################################################################################
# Prefix + w = display a selectable list of sessions in a popup (using fzf)
bind -N "List sessions" w display-popup -E "tmux list-sessions | sed -E 's/:.*$//' | fzf --reverse | xargs tmux switch-client -t"
# Alt+g = floating scratch terminal in a popup
bind -N "Floating scratch terminal" -n M-g display-popup -E "tmux new-session -A -s scratch"
################################################################################
# Vim-Tmux-Navigator Integration
# (Smart pane switching with awareness of Vim splits)
# https://github.com/christoomey/vim-tmux-navigator
################################################################################
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|l?n?vim?x?|fzf)(diff)?$'"
bind-key -n 'M-h' if-shell "$is_vim" { send-keys M-h } { if-shell -F '#{pane_at_left}' {} { select-pane -L } }
bind-key -n 'M-j' if-shell "$is_vim" { send-keys M-j } { if-shell -F '#{pane_at_bottom}' {} { select-pane -D } }
bind-key -n 'M-k' if-shell "$is_vim" { send-keys M-k } { if-shell -F '#{pane_at_top}' {} { select-pane -U } }
bind-key -n 'M-l' if-shell "$is_vim" { send-keys M-l } { if-shell -F '#{pane_at_right}' {} { select-pane -R } }
bind-key -T copy-mode-vi 'M-h' select-pane -L
bind-key -T copy-mode-vi 'M-j' select-pane -D
bind-key -T copy-mode-vi 'M-k' select-pane -U
bind-key -T copy-mode-vi 'M-l' select-pane -R
################################################################################
# Plugins
################################################################################
set-option -g @plugin 'tmux-plugins/tpm'
set-option -g @plugin 'tmux-plugins/tmux-resurrect'
set-option -g @plugin 'tmux-plugins/tmux-continuum'
# Continuum plugin options
set-option -g @continuum-save-interval '15'
set-option -g @continuum-restore 'on'
################################################################################
# Status Bar Style
################################################################################
# Overall status bar style
set-option -g status-style bg=color235,fg=color136,default
# Status bar: left and right content
set-option -g status-left ' #[fg=green]#S '
set-option -g status-right '#[fg=green,bg=default,bright]#T '
# Normal window status format
set-window-option -g window-status-format "#[bg=#1a1b26]#[fg=#a1aab8] #W#{s/1/¹/;s/2/²/;s/3/³/;s/4/⁴/;s/5/⁵/;s/6/⁶/;s/7/⁷/;s/8/⁸/;s/9/⁹/;s/0/⁰/:window_index} "
# Current window status format
set-window-option -g window-status-current-format "#[bg=#82aaff]#[fg=#092236] #W#{s/1/¹/;s/2/²/;s/3/³/;s/4/⁴/;s/5/⁵/;s/6/⁶/;s/7/⁷/;s/8/⁸/;s/9/⁹/;s/0/⁰/:window_index}#{?window_zoomed_flag,,} "
# Separator between windows
set-window-option -g window-status-separator "#[bg=#1a1b26]#[fg=#a1aab8]|"
# Style for displayed messages
set-option -g message-style fg=yellow
################################################################################
# Pane Borders
################################################################################
# Pane border colors
set-option -g pane-border-style fg='#444444'
set-option -g pane-active-border-style fg='#79E6F3'
################################################################################
# Mouse Handling Scripts
################################################################################
# Example script for handling mouse clicks (custom script at ~/bin/tmux-run-click.sh)
bind-key -n M-MouseDown1Pane run-shell "MOUSE_LINE=#{q:mouse_line} ~/bin/tmux-run-click.sh #{pane_id} #{mouse_x}"
################################################################################
# Custom Command Aliases
################################################################################
# new-shared-session
set-option -g command-alias[0] new-shared-session="run-shell \"alacritty -e tmux new-session -t '#{session_id}'\""
################################################################################
# OSC 8 Hyperlinks
# https://github.com/Alhadis/OSC8-Adoption
################################################################################
set-option -ga terminal-features ",*:hyperlinks"
################################################################################
# TPM Initialization
################################################################################
run '~/.tmux/plugins/tpm/tpm'