-
Notifications
You must be signed in to change notification settings - Fork 0
/
.tmux.conf
136 lines (107 loc) · 4.98 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
# set the prefix to Ctrl-q
set -g prefix C-q
unbind-key C-b
bind-key -T prefix C-q send-prefix
set -g default-command /bin/zsh
# Use this override of the containing terminal type to enable truecolor support
set-option -sa terminal-overrides ',xterm-256color:RGB'
# But the value for the terminal inside tmux needs to be a variant of "tmux" or "screen"
set-option -g default-terminal "tmux-256color"
# set the window and pane base index to 1, for easier switching with one hand
set -g base-index 1
setw -g pane-base-index 1
# set the command escape time
# address vim mode switching delay (http://superuser.com/a/252717/65504)
set -s escape-time 0
# focus events
set-option -g focus-events on
# mouse stuff
set-option -g mouse on
# refresh tmux.conf
bind-key R run-shell ' \
tmux source-file ~/.tmux.conf > /dev/null; \
tmux display-message "refreshed ~/.tmux.conf"'
# pane manipulation and switching
bind-key -r J resize-pane -D 5
bind-key -r K resize-pane -U 5
bind-key -r H resize-pane -L 5
bind-key -r L resize-pane -R 5
# the default last-window functionality bound to l is weird and kind of confusing
# replaces this with vim-style commands to swap between panes
unbind-key l
bind-key j select-pane -D
bind-key k select-pane -U
bind-key h select-pane -L
bind-key l select-pane -R
bind-key C-k send-keys C-k
bind-key C-l send-keys C-l
# Smart pane switching with awareness of Vim splits.
# See: https://github.com/christoomey/vim-tmux-navigator
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind-key -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L"
bind-key -n C-j if-shell "$is_vim" "send-keys C-j" "select-pane -D"
bind-key -n C-k if-shell "$is_vim" "send-keys C-k" "select-pane -U"
bind-key -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R"
bind-key -T copy-mode-vi C-h select-pane -L
bind-key -T copy-mode-vi C-j select-pane -D
bind-key -T copy-mode-vi C-k select-pane -U
bind-key -T copy-mode-vi C-l select-pane -R
# copy-mode (scrolling the history) stuff
# enter copy-mode when the mouse is scrolled
bind-key -T prefix WheelUpPane if-shell -Ft= "#{mouse_any_flag}" "send-keys -M" "if-shell -Ft= '#{pane_in_mode}' 'send-keys -M' 'select-pane -t=; copy-mode -e; send-keys -M'"
bind-key -T root WheelUpPane select-pane \; send-keys -M
bind-key -T root WheelDownPane select-pane \; send-keys -M
# faster mouse-scrolling using Ctrl-Mouse
bind-key -T prefix C-WheelUpPane if-shell -F "#{pane_in_mode}" "send-keys -M" "select-pane -t=; copy-mode -e; send-keys -M"
bind-key -T copy-mode C-WheelUpPane send-keys -X halfpage-up
bind-key -T copy-mode C-WheelDownPane send-keys -X halfpage-down
# u / d to move up / down in the history by a half-page (manual page style)
bind-key -T prefix u copy-mode -e \; send-keys -X scroll-up \; send-keys -X halfpage-up
bind-key -T copy-mode u send-keys -X halfpage-up
bind-key -T copy-mode d send-keys -X halfpage-down
bind-key -T copy-mode k send-keys -X scroll-up
bind-key -T copy-mode j send-keys -X scroll-down
unbind-key -T copy-mode MouseDragEnd1Pane # default behavior with the mouse is kind of annoying
# bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-selection # this is another option that just copies automatically but doesn't cancel
bind-key -T copy-mode C-x send-keys -X copy-pipe-and-cancel pbcopy
bind-key -T copy-mode C-c send-keys -X copy-pipe pbcopy # overwrites the default close binding
bind-key -T copy-mode c send-keys -X clear-selection
# Splitting into panes and making new windows
# adding the -c "#{pane_current_path}" option keeps the new panes/windows in the current path
bind-key -T prefix v split-window -h -c "#{pane_current_path}"
bind-key -T prefix s split-window -v -c "#{pane_current_path}"
bind-key -T prefix "\\" split-window -h -c "#{pane_current_path}"
bind-key -T prefix "-" split-window -v -c "#{pane_current_path}"
bind-key -T prefix C-n new-window -c "#{pane_current_path}"
bind-key -T prefix c kill-window
bind-key -T prefix C-w confirm-before -p "kill-window #W? (y/n)" kill-window
bind-key -T prefix x kill-pane
bind-key -T root S-Left previous-window
bind-key -T root S-Right next-window
# max number of lines maintained in a window's history
set -g history-limit 10000
# the amount of time to display window status line messages and other screen indicators
set -g display-time 4000
set -g visual-silence on
set -g visual-bell on
set -g bell-action any
# fix resizing
set-window-option -g aggressive-resize on
set-window-option -g automatic-rename on
set-window-option -g monitor-activity on
set-option -g set-titles on
# emacs controls in the status line
set-option -g status-keys emacs
# and in copy mode
set-window-option -g mode-keys emacs
# Cosmetic stuff
set-option -g status-interval 5
source-file ~/.tmuxline-snapshot
# set-option -g status on
# set-option -g status-justify "left"
# set-option -g status-left-length 60
# set-option -g status-right-length 90
# set-option -g status-style bg=black,fg=cyan
# set -g status-left '#(whoami)'
# set -g status-right '%H:%M'