##############################################
# @file : tmux.conf
# @brief : Tmux Config File
# @author :
# @version: 1.0
# @date : 2018-03-19
##############################################
##############################################
# tmux commands help
# https://tmuxcheatsheet.com/
#
# tmux使用C/S模型构建,主要包括以下单元模块:
# server服务器。输入tmux命令时就开启了一个服务器。
# session会话。一个服务器可以包含多个会话
# window窗口。一个会话可以包含多个窗口。
# pane面板。一个窗口可以包含多个面板。
##############################################
###------------ tmux commands -------------###
# tmux ls :list session
# tmux kill-session
# tmux kill-session -a
# tmux kill-session -t xx :删除除了xx以外的所有session
# tmux new -s xxx :创建名为xxx的session
# tmux a -t xxx :attach重连xxx session
# tmux a :只有一个session
# tmux new -s session
# tmux new -s session -d :#在后台建立会话
# tmux rename-session -t <会话名>
# tmux choose-session -t <会话名>
###---------------------------------------###
################### 快捷键 ####################
## C-b ? 显示快捷键帮助
## C-b : 命令行模式
## C-b t 显示时钟
##
## [会话相关]:
## prefix+$ : 重命名当前会话
## prefix+:new<回车> 启动新会话
## prefix+s 列出所有会话,以菜单方式显示和选择会话
## C-b d 退出tumx,并保存当前会话,
## tmux仍在后台运行,可以通过tmux attach进入 到指定的会话
## [窗口相关]:
## C-b c 创建新窗口 create new windows
## prefix w 列出所有窗口
## prefix n 后一个窗口
## prefix p 前一个窗口
## prefix f 查找窗口
## prefix , 重命名当前窗口 rename windows
## prefix & 关闭当前窗口 close curr window
## prefix 1~9 跳到第n个窗口 go x window
## prefix w 以菜单方式显示及选择窗口
## prefix ! 把当前窗口变为新窗口
## swap-window -s 3 -t 1 交换 3 号和 1 号窗口
## swap-window -t 1 交换当前和 1 号窗口
## move-window -t 1 移动当前窗口到 1 号
## [面板相关]:
## C-b C-o 调换面板位置,类似与vim 里的C-w
## C-b 空格键 采用下一个内置面板布局
## C-b “ 横向分隔pane
## C-b % 纵向分隔pane
## C-b q 显示分隔面板的编号
## C-b o 跳到下一个分隔面板
## C-b ; 切换到最后一个使用的面板last-pane
## C-b [hjkl] 切换面板
## C-b x 关闭面板
## C-b q n(然后按对应的编号) : 按编号选择pane
## C-b z:将当前panel最大化/恢复原窗口布局 Zoom in/Zomm out
## C-b % : 水平分割pane
## C-b ^ : 垂直分割pane
## C-b " : 竖直分割pane
## C-b pageup/pagedown 翻屏
## C-b [up/down/left/right] 调整分隔窗口大小
###############################################
###===== configure ======###
#unbind C-b : 解除与C-b前缀的对应关系
unbind-key C-p
unbind-key C-n
###--- base settings ---###
######------此类配置可以在命令行模式中输入show-options -g查询------######
set -g default-terminal "screen-256color" #支持256位色
set -g display-time 3000 #提示信息持续时间,单位ms
set -sg escape-time 1 #设定前缀键和命令键之间的延时
set -g history-limit 256
set -g base-index 1 #窗口初始序号为1,默认为0
set -g pane-base-index 1 #Panle初始序号为1,默认为0
set-option -g repeat-time 2000 #控制台激活后的持续时间;设置合适的时间以避免每次操作都要先激活控制台,单位为毫秒
###====== statusbar ======###
set-option -g status-keys vi #操作状态栏时的默认键盘布局;可以设置为vi或emacs
#set-option -g status-right "#(date +%H:%M' ')" #状态栏右方的内容;这里的设置将得到类似23:59的显示
#set-option -g status-right-length 10 #状态栏右方的内容长度;建议把更多的空间留给状态栏左方(用于列出当前窗口)
#set -g status-interval 3
#FIXME:[NOT OK]
#set -g status-utf8 on #开启状态栏的UTF-8支持
### 颜色 ###
set -g status-bg black
set -g status-fg white
set -g status-interval 60 #每60s更新状态栏
### 对齐方式 ###
set-option -g status-justify centre
### 左下角 ###
#set-option -g status-left '#[bg=black,fg=green][#[fg=cyan]session:#S#[fg=green]]'
set-option -g status-left '#[bg=black,fg=green][#[fg=cyan]S:#S W:#W#[fg=green]]' ##OK
#set-option -g status-left '#[bg=colour47,fg=colour33][#[fg=cyan]S:#S W:#W#[fg=green]]' ###doing
set-option -g status-left-length 20
### 窗口列表 ###
setw -g automatic-rename on
#set-window-option -g window-status-format '#[dim]#I:#[default]#W#[fg=grey,dim]'
#set-window-option -g window-status-current-format '#[fg=cyan,bold]#I#[fg=blue]:#[fg=cyan]#W#[fg=dim]'
set-window-option -g window-status-format '#[dim]#I:#[default]#P#[fg=grey,dim]'
set-window-option -g window-status-current-format '#[fg=cyan,bold]#I#[fg=blue]:#[fg=cyan]#P#[fg=dim]'
### 右下角 ###
set-option -g status-right-length 30 #状态栏右方的内容长度;建议把更多的空间留给状态栏左方(用于列出当前窗口)
set -g status-right '#[fg=green][#[fg=cyan]%Y-%m-%d %H:%M#[fg=green]] '
#set -g status-left #[fg=Green]#(whoami)#[fg=white]::#[fg=blue] (hostname -s)#[fg=white]::##[fg=yellow]#(curl ipecho.net/plain;echo);
#set -g status-right #[fg=Cyan]#S #[fg=white]%a %d %b %R
######------将激活控制台的快捷键由Ctrl+b修改为Ctrl+a------######
# Send prefix
set-option -g prefix C-a
unbind-key C-a
bind-key C-a send-prefix
######------此类设置可以在命令行模式中输入show-window-options -g查询------######
setw -g automatic-rename off
#copy-mode 将快捷键设置为vi 模式
set-window-option -g mode-keys vi #复制模式中的默认键盘布局;可以设置为vi或emacs
#FIXME:[NOT OK]
#set-window-option -g utf8 on #开启窗口的UTF-8支持
######------ 选择/复制/粘贴 ------######
# copy-mode 默认配置键:
#Prefix+[ : 进入复制模式
#按 space 开始复制,移动光标选择复制区域
#按 Enter 复制并退出copy-mode。
#Prefix+] :将光标移动到指定位置,粘贴
#copy-mode 修改后的配置键
#Prefix+Esc :进入vi模式
#h/j/k/l :移动光标
#v :选择
#y :复制+退出copy-mode
#Prefix+] :粘贴
## enter copy mode (prefix Escape) ##
unbind-key Escape
bind Escape copy-mode #取消默认进入copy模式的快捷键prefix+Esc
# paste buffer (prefix Ctrl+p)
bind ^p pasteb
# select (v)
bind-key -T copy-mode-vi v send-keys -X begin-selection
# copy (y)
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
#FIXME:[NOT work]
##bind -t vi-copy v begin-selection
##bind -t vi-copy y copy-selection
######------ Easy config reload ------######
#bind-key r source-file ~/.tmux.conf \; display-message "tmux.conf reloaded"
bind C-r source-file ~/.tmux.conf \; display-message "tmux.conf reloaded"
######------ Use [hjkl] to switch panes ------######
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
bind C-h select-pane -L
bind C-j select-pane -D
bind C-k select-pane -U
bind C-l select-pane -R
# Use Alt-arrow keys to switch panes
#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
######------ resize pane ------######
unbind-key C-Up
unbind-key C-Down
unbind-key C-Left
unbind-key C-Right
#[not work]
bind -r C-Up resizep -U 5
bind -r C-Down resizep -D 5
bind -r C-Left resizep -L 5
bind -r C-Right resizep -R 5
bind -r Up resizep -U 3
bind -r Down resizep -D 3
bind -r Left resizep -L 3
bind -r Right resizep -R 3
######------ Shift [C-p/C-n] to switch windows ------######
bind C-p previous-window
bind C-n next-window
# Shift arrow to switch windows
# [FIXME: no work]
#bind -n S-Left previous-window
#bind -n S-Right next-window
######------ Set easier window split keys [%/^] ------######
# Set easier window split keys [%/^]
#bind-key % split-window -h
bind-key ^ split-window -v
#bind - splitw -v #横向分割
#bind | splitw -h #纵向分割
######------ Mouse mode [FIXME: NOT OK] ------######
# (setw其实是set-window-option的别名)
#set-window-option -g mode-mouse on
#setw -g mouse-resize-pane on # 开启用鼠标拖动调节pane的大小(拖动位置是pane之间的分隔线)
#setw -g mouse-select-pane on # 开启用鼠标点击pane来激活该pane
#setw -g mouse-select-window on # 开启用鼠标点击来切换活动window(点击位置是状态栏的窗口名称)
#setw -g mode-mouse on # 开启window/pane里面的鼠标支持(也即可以用鼠标滚轮回滚显示窗口内容,此时还可以用鼠标选取文本)
# [FIXME: NOT OK]
#set -g mode-mouse on
### tmux version > 2.1 no use
#set -g mouse-resize-pane on
#set -g mouse-select-pane on
#set -g mouse-select-window on
######------ 默认启动应用, 当tmux启动时,可以默认启动一些应用 ------######
#[NOT OK]
#new -s job #新建名为job的会话
#neww ranger #启动ranger
#neww vim #启动vim
#selectw -t 3 #默认选择标号为 3 的窗口
######------ 设定窗口布局 ------######
bind C-X source-file ~/.tmux/mylayout
#select-pane -t 1
##selectp -t 1 #选中第0个窗格
#splitw -h -p 50 #将其分成左右两个
#selectp -t 2 #选中第一个,也就是右边那个
#splitw -v -p 50 #将其分成上下两个,这样就变成了图中的布局了
#selectp -t 1 #选回第一个
#-d 立即从这个新建回话中分离。
#tmux new-session -s mutou -n Win1 -d
#tmux send-keys -t development 'cd /opt/' C-m
#tmux send-keys development 'vim' C-m
#tmux split-window -v -p 10 -t Win1
#tmux select-layout -t development main-horizontal
######------ 设定消息格式 ------######
set -g message-fg white
set -g message-bg black
set -g message-attr bright
###--—----------TODO:------------###
## panes
#set -g pane-border-bg colour234
#set -g pane-border-fg colour234
#set -g pane-active-border-bg colour232
#set -g pane-active-border-fg colour232
## swap pane
## swap with the previous pane (prefix Ctrl+u)
#bind ^u swapp -U
## swap with the next pane (prefix Ctrl+d)
#bind ^d swapp -D
#
#
## misc
## select the last pane (prefix e)
#bind e lastp
## select the last window (prefix Ctrl+e)
#bind ^e last
## kill pane (prefix q)
#bind q killp
## kill window (prefix Ctrl+q)
#bind ^q killw
#
#
## app
## htop (prefix !)
#bind ! splitw htop
## man (prefix m)
#bind m command-prompt "splitw 'exec man %%'"
## perl func (prefix @)
#bind @ command-prompt "splitw 'exec perldoc -t -f %%'"
## perl var (prefix *)
#bind * command-prompt "splitw 'exec perldoc -t -v %%'"
## perl doc (prefix %)
#bind % command-prompt "splitw 'exec perldoc -t %%'"
## ruby doc (prefix /)
#bind / command-prompt "splitw 'exec ri %%'"
#
##-- colorscheme --#
##https://github.com/daethorian/conf-tmux/blob/master/colors/zenburn.conf
#
## modes
#setw -g clock-mode-colour colour223
#setw -g mode-attr bold
#setw -g mode-fg colour223
#setw -g mode-bg colour235
#
## panes
#set -g pane-border-bg colour234
#set -g pane-border-fg colour234
#set -g pane-active-border-bg colour232
#set -g pane-active-border-fg colour232
#
#set -g pane-active-border-bg colour132
#set -g pane-active-border-fg colour232
#
#
## statusbar
#set -g status-justify centre
#set -g status-bg colour235
#set -g status-fg colour248
#set -g status-attr dim
##[default]>> #[fg=colour187]#S #[default] #[fg=colour187]w#I.p#P#[default]"
#set -g status-left "
#set -g status-left-attr bright
#set -g status-left-length 20
##[fg=colour174]#(/home/xiaodong/bin/uptime) #[default] #[fg=colour174]#(cut -d ' ' -f 1-3 /proc/loadavg)"
#set -g status-right "
#set -g status-right-attr bright
#set -g status-right-length 80
#
#setw -g window-status-current-fg colour223
#setw -g window-status-current-bg colour237
#setw -g window-status-current-attr bold
#setw -g window-status-current-format "#I:#W#F"
#
##setw -g window-status-alert-attr bold
##setw -g window-status-alert-fg colour255
##setw -g window-status-alert-bg colour160
#
## messages
#set -g message-attr bold
#set -g message-fg colour223
#set -g message-bg colour235
#=====================TODO==============
#":"进入命令行
#bind : command-prompt
#执行命令,比如:看 Manpage、查 Perl 函数,开启info,在新的window中进行ssh连机,自动载入fish
#bind m command-prompt "splitw -h 'exec man %%'"
#bind @ command-prompt "splitw -h 'exec perldoc -f %%'"
#bind / command-prompt "split-window 'exec info %%'"
#bind S command-prompt "new-window -n %1 'ssh %1'"
#定制状态行
#状态行左边默认就很好了,我对右边定制了一下,显示 uptime 和 loadavg:
#set -g status-right "#[fg=green]#(uptime.pl)#[default] #[fg=green]#(cut -d ' ' -f 1-3 /proc/loadavg)#[default]"
#设置状态行的背景和前景色:具体设置请自行查阅man
#常用颜色:black,white,(bright)red,(bright)green,(bright)yellow,(bright)blue,(bright)magenta,(bright)cyan,and so on
##总的状态栏
#set -g status-fg brightcyan
#set -g status-bg white
#
##左右的状态栏
#set -g status-left-fg brightred
#set -g status-left-bg yellow
#set -g status-right-fg brightgreen
#set -g status-right-bg brightmagenta
#
##window状态栏
#set -g window-status-fg brightyellow
#set -g window-status-bg brightcyan
#set -g window-status-activity-fg brightred
#set -g window-status-activity-bg brightgreen
#set -g window-status-current-fg brightred
#set -g window-status-current-bg brightgreen
#set -g window-status-content-fg yellow
#set -g window-status-content-bg red
#set -g window-status-bell-fg red
#set -g window-status-bell-bg green
#
##pane相关的状态栏
#set -g pane-border-fg brightyellow
#set -g pane-border-bg brightblue
#set -g pane-active-border-fg brightgreen
#set -g pane-active-border-bg red
#
#set -g message-fg brightred
#set -g message-bg green
#set -g message-command-fg brightblue
#set -g message-command-bg cyan
#
#set -g mode-fg brightred
#set -g mode-bg green
#
##时钟颜色
#set -g clock-mode-colour brightred
#set -g clock-mode-style 12
set -g status-fg colour190
set -g status-bg colour234
#setw -g window-status-current-fg colour190
#setw -g window-status-current-bg colour234
#setw -g window-status-current-attr bright
###可视化通知###
setw -g monitor-activity on
set -g visual-activity on
###命令控制打开日志功能
#bind C-l pipe-pane -o "cat >>~/#W.log" \; display "Toggled logging to ~/#W.log"