aboutsummaryrefslogtreecommitdiffstats
path: root/_tmux.conf
blob: 4514cdec747b20a487bc3e8f17571111267d9f3f (plain)
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
#
# ~/.tmux.conf
# ------------
# See tmux(1) for more information
#
#
# References
# ----------
# [1] tmux: Productive Mouse-Free Development (by Brian P. Hogan)
#     https://pragprog.com/book/bhtmux/tmux
# [2] Making tmux Pretty and Usable - A Guide to Customizing your tmux.conf
#     http://www.hamvocke.com/blog/a-guide-to-customizing-your-tmux-conf/
# [3] ArchWiki - Tmux
#     https://wiki.archlinux.org/index.php/tmux
# [4] Practical Tmux
#     http://mutelight.org/practical-tmux
# [5] Tmux Plugin Manager
#     https://github.com/tmux-plugins/tpm
# [6] Tmux themepack
#     https://github.com/jimeh/tmux-themepack
# [7] Oh My Tmux!
#     https://github.com/gpakosz/.tmux
#
# Tips
# ----
# * With mouse mode enabled, it is not allowed to select text with mouse.
#   However, pressing "Shift" key while doing things with the mouse will
#   overrides the mouse protocol and lets you select/paste.  This behavior
#   is documented in xterm(1) and also supported by most terminals.
#   Credit: https://unix.stackexchange.com/a/332425
#

# Start window and pane numbering at 1
set -g base-index 1
setw -g pane-base-index 1

# Renumber the windows when a window is closed
set -g renumber-windows on

# Automatically set window title
set -g set-titles on
setw -g automatic-rename on
# Don't allow programs to change the window name
set -g allow-rename off

# Use vi-style key bindings in the status line
set -g status-keys vi
# Use vi-style key bindings in copy and choice modes
setw -g mode-keys vi

# Disable the delay between an escape key press and subsequent characcters
set -sg escape-time 0

# Increase the scrollback history limit
set -g history-limit 10000

# Lock after 15 minutes
#set -g lock-after-time 1800

# Keep windows around after they exit
# On exit, the pane will display the message "Pane is dead" until it is
# closed with the command "kill-pane" or "kill-window", or a new command
# is started there with "respawn-pane" or "respawn-window".
#set -g remain-on-exit on

# Turn on xterm-keys so that additional function keys get escape sequences
set -g xterm-keys on

# Change the default $TERM to screen-256color
# * xterm-256color for tmux may have problem with special keys in zsh
# * tmux-256color may not be recognized, e.g., DragonFlyBSD
set -g default-terminal "screen-256color"

# Enable RGB colour if running in xterm(1)
set -sa terminal-overrides ",xterm*:Tc"
# Override terminal's default Cr (color reset) to avoid the strange
# 'char+112' when just exited the tmux session.
# Credit: https://github.com/tmux/tmux/issues/266
set -sa terminal-overrides ',xterm*:Cr=\E]12;gray\007'


##
## Key bindings
##

# Change the prefix key to C-a
set -g prefix C-a
unbind C-b
bind C-a send-prefix

# Get the command prompt more quickly
unbind \;
bind \; command-prompt

# Detach tmux instead of exit
bind -n C-d detach

# Sane window split keybinds
unbind '"'
unbind %
bind | split-window -h -c '#{pane_current_path}'
bind \ split-window -h -c '#{pane_current_path}'
bind - split-window -v -c '#{pane_current_path}'

# Pane switching
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
bind -n M-Left  select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up    select-pane -U
bind -n M-Down  select-pane -D

# Pane resizing
bind -r M-h resize-pane -L 5
bind -r M-j resize-pane -D 5
bind -r M-k resize-pane -U 5
bind -r M-l resize-pane -R 5

# Create new window starting from the current directory
bind c  new-window -c '#{pane_current_path}'
# URxvt tab like window control
bind -n S-Down  new-window -c '#{pane_current_path}'
bind -n S-Left  previous-window
bind -n S-Right next-window
bind -n C-Left  swap-window -t -1
bind -n C-Right swap-window -t +1

# Enable/disable mouse mode
bind m set mouse\; display 'Toggled mouse #{?mouse,on,off} (this session)'
bind M set -g mouse\; display 'Globally toggled mouse #{?mouse,on,off}'

# Keys to toggle monitoring activity in a window, and synchronize-panes
#bind m set monitor-activity
bind S set synchronize-panes\; display 'synchronize-panes #{?synchronize-panes,on,off}'

# Reload Tmux configuration
bind R source-file ~/.tmux.conf\; display "Configuration reloaded."

# Do not display the original window's name when renaming it
bind , command-prompt -p "(rename-window '#W')" "rename-window '%%'"
# Do the same for session renaming
bind '$' command-prompt -p "(rename-session '#S')" "rename-session '%%'"

# Save all scrollback to a file
# Credit: https://unix.stackexchange.com/a/26568
bind P command-prompt -p 'save history to filename:' \
    -I '~/tmux.history' 'capture-pane -S - ; save-buffer %1 ; delete-buffer'

# Copy & paste
bind Escape copy-mode
bind p paste-buffer


##
## Appearance
##

# Status line
set -g status-justify      centre
set -g status-left-length  30
set -g status-right-length 30
set -g status-style        "bg=default,bold"
set -g status-left \
    "#[fg=magenta][#[fg=yellow]#h:#[fg=blue]#S#[fg=magenta]]#[default]"
set -g status-right \
    "#[fg=magenta][#[fg=green]%a #[fg=yellow]%b %d #[fg=blue]%H:%M#[fg=magenta]]"

# If running inside tmux ($TMUX is set), then change the status line to red
#if-shell -b '[ -n "$TMUX" ]' "set -g status-bg red"

# Window status
setw -g window-status-separator      " "
setw -g window-status-style          "fg=blue,bold"
setw -g window-status-current-style  "fg=green,bold,reverse"
setw -g window-status-last-style     "fg=magenta,bold"
setw -g window-status-activity-style "fg=yellow,bold"
setw -g window-status-bell-style     "fg=red,bold"
setw -g window-status-format \
    "#[fg=yellow]#I:#[default]#{=10:window_name}#F"
setw -g window-status-current-format \
    "#[fg=yellow]#I:#[fg=default]#W#F"

# Window mode
setw -g mode-style        "fg=yellow,bg=default,bold"
setw -g clock-mode-colour green
setw -g clock-mode-style  24

# Messaging
set -g message-style         "fg=white,bg=blue,bold"
set -g message-command-style "fg=white,bg=default,bold"

# Highlight windows with activity in the status line
setw -g monitor-activity on
# Disable bell action and activity messages
set -g bell-action none
set -g visual-activity off

# Pane
set -g pane-border-style        "fg=default,bg=default"
set -g pane-active-border-style "fg=blue,bg=default"


##
## Deal with different syntax between different versions!
##

# Credit: https://stackoverflow.com/a/40902312/1046584
run-shell "tmux setenv -g TMUX_VERSION $(tmux -V | cut -c 6-)"

# In version 2.1 "mouse" replaced the previous 4 mouse options
if-shell -b '[ "$(echo "$TMUX_VERSION >= 2.1" | bc)" = 1 ]' \
   "set -g mouse on"

# UTF8 is autodetected in 2.2 onwards, but errors if explicitly set
if-shell -b '[ "$(echo "$TMUX_VERSION < 2.2" | bc)" = 1 ]' \
   "set -g utf8 on; set -g status-utf8 on; set -g mouse-utf8 on"

# New keybindings for vi-mode
# Credit: https://shapeshed.com/custom-vim-bindings-in-tmux-2-4/
# See also: https://github.com/tmux/tmux/issues/754
if-shell -b '[ "$(echo "$TMUX_VERSION >= 2.4" | bc)" = 1 ]' \
   "unbind -T copy-mode-vi MouseDragEnd1Pane; \
    bind -T copy-mode-vi 'v' send -X begin-selection; \
    bind -T copy-mode-vi 'V' send -X select-line; \
    bind -T copy-mode-vi 'r' send -X rectangle-toggle; \
    bind -T copy-mode-vi 'y' send -X copy-pipe-and-cancel \
        'xclip -in -selection clipboard'"
if-shell -b '[ "$(echo "$TMUX_VERSION < 2.4" | bc)" = 1 ]' \
   "unbind -t vi-copy MouseDragEnd1Pane; \
    bind -t vi-copy Escape cancel; \
    bind -t vi-copy v begin-selection; \
    bind -t vi-copy V select-line; \
    bind -t vi-copy r rectangle-toggle; \
    bind -t vi-copy y copy-pipe 'xclip -in -selection clipboard'"


# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=tmux: #