-
Notifications
You must be signed in to change notification settings - Fork 0
/
tmux.conf
354 lines (284 loc) · 12.1 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
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
# ==========================
# === General settings ===
# ==========================
# Default terminal is screen because of this, from tmux man pages:
# "For tmux to work correctly, this must be set to ‘screen’, ‘tmux’ or a derivative of them."
set -sg default-terminal "screen-256color"
# Setting to enable true color support in tmux. All modern terminals support it.
set -ga terminal-overrides ",*256col*:Tc"
# Setting scroll back buffer
set -g history-limit 20000
# Setting limit for paste buffers. It's where copied text is stored.
set -sg buffer-limit 10
# Determines how long tmux will wait, before releasing Esc key, after it's pressed.
# Default is 500 milliseconds, and in some programs you can notice delay when pressing Ecs.
# In vim, for example. Setting it to 0 will remove delay. I never noticed any problem with it.
# But according to this https:/tmux/tmux/issues/907#issuecomment-299404405
# some may arise. If you know of any real scenario, when escape time 0
# causes problems, please let me know.
set -sg escape-time 0
# How long messages will be shown in status line in ms
set -g display-time 1500
# Disable rename of windows by programs via terminal escape sequence.
set -wg allow-rename off
# Set parent terminal title to reflect current window in tmux session
set -g set-titles on
set -g set-titles-string "#W"
# Start index of window/pane with 1
set -g base-index 1
set -wg pane-base-index 1
set -g renumber-windows on
set -g word-separators " /\\()\"'-,:;<>~!@#$%^&*|+=[]{}~?\u2502"
# ==========================
# === Key bindings ===
# ==========================
# Change prefix key to C-a, easier to type, same to "screen"
set -g prefix C-a
# Unbind default key bindings, we're going to override
unbind "\$" # rename-session
unbind , # rename-window
unbind % # split-window -h
unbind '"' # split-window
unbind \} # swap-pane -D
unbind \{ # swap-pane -U
unbind \[ # paste-buffer
unbind \]
unbind "'" # select-window
unbind n # next-window
unbind p # previous-window
unbind l # last-window
unbind M-n # next window with alert
unbind M-p # next window with alert
unbind o # focus thru panes
unbind & # kill-window
unbind "#" # list-buffer
unbind = # choose-buffer
unbind z # zoom-pane
unbind M-Up # resize 5 rows up
unbind M-Down # resize 5 rows down
unbind M-Right # resize 5 rows right
unbind M-Left # resize 5 rows left
unbind -T copy-mode-vi C-d # send-keys -X halfpage-down
unbind -T copy-mode-vi C-e # send-keys -X scroll-down
unbind -T copy-mode-vi C-h # send-keys -X cursor-left
unbind -T copy-mode-vi C-u # send-keys -X halfpage-up
unbind -T copy-mode-vi C-y # send-keys -X scroll-up
unbind -T copy-mode-vi v # send-keys -X rectangle-toggle
unbind -T copy-mode-vi A # send-keys -X append-selection-and-cancel
unbind -T copy-mode-vi BSpace # send-keys -X cursor-left
unbind L # switch-client -l
unbind t # clock-mode
# Enabling mouse support
set -sg mouse on
# Press `M` to toggle mouse support
bind M set -wg mouse
# Reload tmux configuration
bind '$' source-file ~/.tmux.conf \; display "Config reloaded"
# Create new session
bind n new-session
#Crate new windows with current path
bind c new-window -c "#{pane_current_path}"
# Rename session, window, pane
bind R command-prompt -I "#{session_name}" "rename-session '%%'"
# Split panes
bind \\ split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
# Select pane and windows
bind -r h previous-window
bind -r l next-window
bind -r k select-pane -t :.-
bind -r j select-pane -t :.+
bind -r Tab last-window
bind -r C-o swap-pane -D
bind -r H swap-window -d -t :-
bind -r L swap-window -d -t :+
# Change window title position in status line by mouse drag.
# Credits goes to https:/tmux/tmux/issues/656#issuecomment-569834040
bind -n MouseDrag1Status swap-window -d -t=
# Zoom pane
bind z resize-pane -Z
# Kill pane/window/session shortcuts
bind x kill-pane
bind X kill-window
bind C-x confirm-before -p "kill other windows? (y/n)" "kill-window -a"
bind Q confirm-before -p "kill-session #S? (y/n)" kill-session
# Detach from session
bind d detach
bind D if -F '#{session_many_attached}' \
'confirm-before -p "Detach other clients? (y/n)" "detach -a"' \
'display "Session has only 1 client attached"'
# Search
bind / command-prompt -p "(search down)" "copy-mode\; send -X search-forward \"%%%\""
bind ? command-prompt -p "(search up)" "copy-mode\; send -X search-backward \"%%%\""
# ===================
# === tmuxNOC ===
# ===================
bind -n M-q run "~/tmuxNOC/scripts/tmux_noc.py noc_menu --split_direction new"
bind C-l run -b "~/tmuxNOC/scripts/tmux_noc.py toggle_log"
bind -n M-1 run -b "~/tmuxNOC/scripts/tmux_noc.py login --login_number 1"
bind -n M-2 run -b "~/tmuxNOC/scripts/tmux_noc.py login --login_number 2"
bind -n M-3 run -b "~/tmuxNOC/scripts/tmux_noc.py login --login_number 3"
bind r command-prompt -p "(rename-window)" -I "#{window_name}" "rename-window '%1'\; set -w @window_title '%1'"
bind t command-prompt -p "(rename-pane)" -I "#{@pane_name}" "set -p @pane_name '%%'\;\
run '~/tmuxNOC/scripts/tmux_noc.py rename_window'"
set-hook -g pane-exited 'run "~/tmuxNOC/scripts/tmux_noc.py rename_windows"'
set-hook -g after-kill-pane 'run "~/tmuxNOC/scripts/tmux_noc.py rename_window"'
set-hook -g after-split-window 'run "~/tmuxNOC/scripts/tmux_noc.py rename_window"'
# ==================================================
# === Window monitoring for activity and silence ===
# ==================================================
set -wg monitor-activity on
set -wg monitor-bell on
set -g activity-action other
set -g bell-action other
set -g silence-action other
# Press `m` to toggle terminal silence monitor
bind m if -F "#{monitor-silence}" {
set -w monitor-silence 0
set -w monitor-activity on
set -w monitor-bell on
display-message "Monitor window silence [OFF]"
} {
command-prompt -p "Monitor silence: interval (s)" "set -w monitor-silence %%\;\
set -w monitor-activity off\;\
set -w monitor-bell off"
}
# ================================================
# === Copy mode, scroll and clipboard ===
# ================================================
# Prefer vi style key table
set -wg mode-keys vi
# But emacs style for status line input. Because I expect Esc function line "Cancel" on status line.
# Thanks to https:/tmux/tmux/issues/2426#issuecomment-711068362
set -wg status-keys emacs
# Paste
bind p paste-buffer
bind C-p choose-buffer
# trigger copy mode by
bind Space copy-mode
bind -n M-k copy-mode
# Scroll
bind -T copy-mode-vi M-k send-keys -X scroll-up
bind -T copy-mode-vi M-j send-keys -X scroll-down
bind -T copy-mode-vi C-k send-keys -X halfpage-up
bind -T copy-mode-vi C-j send-keys -X halfpage-down
bind -T copy-mode-vi v send-keys -X begin-selection
yank="~/tmuxNOC/scripts/yank.sh"
paste="~/tmuxNOC/scripts/paste.sh"
# Copy selected text
bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "$yank"
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "$yank"
bind -T copy-mode-vi Y send-keys -X copy-line \; run "tmux save-buffer - | $yank"
bind -T copy-mode-vi D send-keys -X copy-end-of-line \; run "tmux save-buffer - | $yank"
bind -T copy-mode-vi DoubleClick1Pane send-keys -X select-word \;\
send-keys -X copy-pipe-no-clear "$yank"
bind -T copy-mode-vi TripleClick1Pane send-keys -X select-line \;\
send-keys -X copy-pipe-no-clear "$yank"
bind -n DoubleClick1Pane select-pane \; copy-mode -M \; send-keys -X select-word \;\
send-keys -X copy-pipe-no-clear "$yank"
# Copy selection on drag end event, but do not cancel copy mode and do not clear selection
# clear select on subsequence mouse click
bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-no-clear "$yank"
bind -T copy-mode-vi MouseDown1Pane select-pane \; send-keys -X clear-selection
# Paste with right mouse click
bind -T copy-mode-vi MouseDown3Pane select-pane \; send-keys -X cancel \;\
run "$paste tmux" \; paste-buffer
bind -n MouseDown3Pane select-pane \; run "$paste tmux" \; paste-buffer
# =====================================
# === Renew environment ===
# =====================================
set -g update-environment \
"DISPLAY\
SSH_ASKPASS\
SSH_AUTH_SOCK\
SSH_AGENT_PID\
SSH_CONNECTION\
SSH_TTY\
WINDOWID\
XAUTHORITY"
bind C-r send-keys 'C-u' 'Enter' ' eval "$(tmux show-env -s)"' 'Enter' 'C-l'
# =====================================
# === Theme ===
# =====================================
# Feel free to NOT use this variables at all (remove, rename)
# this are named colors, just for convenience
# https://jonasjacek.github.io/colors/ - for color reference
color_orange="colour166"
color_purple="colour134"
color_green="colour29"
color_blue="colour25"
color_yellow="colour220"
color_red="colour160"
color_black="colour232"
color_white="white"
color_grey="colour245"
color_light_grey="colour250"
# This is a theme CONTRACT, you are required to define variables below
# Change values, but not remove/rename variables itself
color_dark="$color_black"
color_light="$color_white"
color_status_text="$color_grey"
color_main="$color_blue"
color_secondary="$color_green"
# =====================================
# === Appearance and status bar ===
# ======================================
set -g mode-style "fg=default,bg=$color_main"
# command line style
set -g message-style "fg=$color_orange,bg=$color_dark"
# status line style
set -g status-style "fg=$color_status_text,bg=$color_dark"
# window segments in status line
set -g window-status-separator ""
separator_powerline_left=""
separator_powerline_right=""
set -wg window-status-format " #I:#W "
set -wg window-status-current-style "fg=$color_light,bold,bg=$color_main"
set -wg window-status-current-format \
"#[fg=$color_dark,bg=$color_main]$separator_powerline_right#[default] #I:#W# \
#[fg=$color_main,bg=$color_dark]$separator_powerline_right#[default]"
# when window has monitoring notification
set -wg window-status-activity-style "fg=$color_light,bold,bg=$color_orange"
# outline for active pane
set -wg pane-active-border-style "fg=$color_main"
# general status bar settings
set -g status on
set -g status-interval 5
set -g status-justify left
set -g status-right-length 100
set -g status-left-length 100
# define widgets we're going to use in status bar
wg_session="#[fg=$color_secondary] #S #[default]"
wg_date="#[fg=$color_secondary]%d.%m.%Y %H:%M#[default]"
wg_user_host="#[fg=$color_secondary]#(whoami)#[default]@#H"
wg_zoomed="#[fg=$color_dark,bg=$color_secondary][Z]#[default]"
wg_not_zoomed="[Z]"
wg_is_zoomed="#{?window_zoomed_flag,#{wg_zoomed},#{wg_not_zoomed}}"
wg_mouse="#[fg=$color_dark,bg=$color_secondary][Mouse]#[default]"
wg_not_mouse="[Mouse]"
wg_is_mouse="#{?mouse,#{wg_mouse},#{wg_not_mouse}}"
wg_log="#[fg=$color_dark,bg=$color_secondary][Log]#[default]"
wg_not_log="[Log]"
wg_is_log="#{?pane_pipe,#{wg_log},#{wg_not_log}}"
wg_prefix="#[fg=$color_dark,bg=$color_secondary][^A]#[default]"
wg_not_prefix="[^A]"
wg_copy="#[fg=$color_dark,bg=$color_secondary][Copy]#[default]"
wg_is_prefix="#{?client_prefix,#{wg_prefix},#{?pane_in_mode,#{wg_copy},#{wg_not_prefix}}}"
set -g status-left "$wg_session$wg_is_prefix$wg_is_zoomed "
set -g status-right "$wg_is_log$wg_is_mouse | $wg_user_host | $wg_date "
# Showing pane name if exists, else current pane command and current pane path.
# Thanks to https://unix.stackexchange.com/a/564690
# Pane name is user option, can't use pane title, because applications can overwrite it.
# Thanks to https:/tmux/tmux/issues/2320
set -g pane-border-status top
set -g pane-border-format "#{?@pane_name,#{@pane_name},#{pane_current_command} #{pane_current_path}}"
# ==============================================
# === Nesting local and remote sessions ===
# ==============================================
# Session is considered to be remote when we ssh into host
# Can be disabled by setting tmux_do_not_use_remote_config env var.
if 'test -n "$SSH_CLIENT"' {
if -F "#{!=:$tmux_do_not_use_remote_config,true}" {
source-file ~/tmuxNOC/tmux.remote.conf
}
}