Tmux配置使用

1. 简介

tmux是一种窗口管理程序,主要功能如下

  • 提供窗口组随时存储和恢复,即使SSH断开或者机器重启,也可以恢复原来的窗口状态
  • 多会话、多窗口以及窗格分割,具体展示如图1-1所示,状态栏的配置在后续会介绍
    • 会话(session),一组窗口的集合,通常可以用于一个任务,会话可以自己进行命名
    • 窗口(windos),单个课件窗口,窗口有自己的编号
    • 窗格(Pane),大窗口分割的小块窗口
1-1
图1-1 tmux元素展现

2. 安装

以CentOS7为例,安装tmux,但是版本比较低,为1.8

1
yum install tmux

可以在CentOS7上编译安装版本更高的2.6,有更多新功能,不过需要安装一些库

1
yum install libevent-devel ncurses-devel -y

3.基本操作

Prefix-Command前置操作:所有下面介绍的快捷键,都必须以前置操作开始。tmux默认的前置操作是CTRL+b。例如新建一个窗口,首先按CTRL+b,然后c键创建一个窗口,以下操作均为默认快捷键

Session 操作 快捷键
查看所有session Prefix s
离开session Prefix d
重命令当前session Prefix $
Windows操作 快捷键
新建窗口 Prefix c
关闭一个窗口 Prefix &
根据编号切换窗口 Prefix 窗口编号
Pane操作 快捷键
切换到下一个窗格 Prefix o
垂直拆分一个新窗格 Prefix “
水平拆分一个新窗格 Prefix %

以上只是操作的一部分,更多操作以及快捷键自定义,可以在配置文件中修改


3. Tmux订制

以下配置以tmux 1.8为例

颜色模式设置

使用256色启动tmux,若使用默认命令启动tmux,无法识别vim的配色,可以在.bashrc中加入如下内容,则tmux以256色启动

1
alias tmux='tmux -2'

基本设置

在用户根目录下创建.tmux.conf文件,根据配置文件的内容,可以对tmux的快捷键以及样式进行订制

基本设置如下,更多选项,使用man命令查看,不同版本的tmux中不通用,一些选项不相同

1
2
3
4
5
6
7
set -g default-terminal "screen-256color"
set -g display-time 3000
set -g escape-time 0
set -g history-limit 65535
set -g base-index 1
set -g pane-base-index 1
set -g set-titles-string '#T'

配置文件加载

1
bind r source ~/.tmux.conf \; display "Configuration reloaded!"

控制台设置

修改进入控制台的快捷键,可以设置为自己习惯的组合键,同时释放默认快捷键。因为Ctrl+B和vim的翻页操作冲突,这里前置键修改为Ctrl+L

1
2
3
set -g prefix ^l
unbind ^b
bind l send-prefix

窗格设置

修改水平切割为|,垂直切割为-,方便记忆

1
2
3
bind c new-window -c 
bind | split-window -h -c
bind - split-window -c

按照vim快捷键的习惯切换窗格

1
2
3
4
bind k selectp -U # above (prefix k)
bind j selectp -D # below (prefix j)
bind h selectp -L # left (prefix h)
bind l selectp -R # right (prefix l)

调整当前窗格的大小

1
2
3
4
bind -r ^k resizep -U 10 # upward (prefix Ctrl+k)
bind -r ^j resizep -D 10 # downward (prefix Ctrl+j)
bind -r ^h resizep -L 10 # to the left (prefix Ctrl+h)
bind -r ^l resizep -R 10 # to the right (prefix Ctrl+l)

移动当前窗格

1
2
bind < swapp -U
bind > swapp -D

选择最后一个窗格/窗口,关闭一个窗格,关闭所有窗格

1
2
3
4
bind e lastp
bind ^e last
bind q killp
bind ^q killw

复制设置

像vim模式一样复制窗口内容

1
2
3
4
bind Escape copy-mode
bind ^p pasteb
bind -t vi-copy v begin-selection
bind -t vi-copy y copy-selection

鼠标设置

鼠标控制,可以通过鼠标点击选择窗口/窗口,调整窗格大小,以及通过鼠标滚轮进行翻页,同时进入复制模式,用鼠标进行选择复制。

1
2
3
4
setw -g mode-mouse on
set -g mouse-select-pane on
set -g mouse-resize-pane on
set -g mouse-select-window on

小技巧

  • 在当前窗口滚动鼠标滚轮后,可以进行翻页和复制,如图3-1所示,红色圈出的代表进入了复制模式,可以用鼠标进行选择复制范围

    1-1
    图3-1 tmux内复制
  • 剪切板的范围被限制在tmux以及服务器内。例如在Windows上使用xshell,想复制一段信息到Windows系统剪切板,此时按住shift键可以恢复ssh软件的选择功能,同理,粘贴到窗口内,也需要按住shift键,例如图3-2所示

    1-1
    图3-2 xshell选择复制
  • 如果tmux进行了窗格的左右切割,想复制某个窗格中的一段多行的文字,按住shift键,会把另一个窗格相同一行的文字选择也选择上,这时候需要shift+alt进行选择内容,如图3-3所示

    1-1
    图3-3 xshell选择复制

状态栏配置

配置状态栏以及其颜色,颜色可以以16进制的方式设置,例如#00875f,但是范围只是256色范围。也可以像colour235这种方式设置颜色,具体颜色以及对应,如图3-4所示

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
set -g status-utf8 on
set -g status-interval 1
set -g status-keys vi

setw -g mode-keys vi
setw -g allow-rename off
setw -g automatic-rename off

#-- colorscheme --#
# 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-fg '#00875f'
set -g pane-border-bg '#005f5f'
set -g pane-active-border-fg '#005f5f'
set -g pane-active-border-bg '#00875f'

# statusbar
set -g status-justify left
set -g status-bg colour235
set -g status-fg colour248
set -g status-attr dim

set -g status-left '#[fg=colour235,bg=#ffc000,bold] ❐ #S #[fg=#ffc000,bg=#990000,nobold]⮀#[fg=#d7bdbd,bg=#990000,bold] #(whoami) #[fg=#990000,bg=colour241]⮀ #[fg=colour235,bg=colour241,bold] #(hostname -s) #[fg=colour241,bg=colour235,nobold]⮀'
set -g status-left-attr bright
set -g status-left-length 80

#set -g status-right "
set -g status-right '#[fg=colour241,bg=colour235]⮂#[fg=colour233,bg=colour241,bold] %H:%M #[fg=#0f38ad,bg=colour241]⮂#[fg=colour233,bg=#0f68ad,bold] %-d %b '
set -g status-right-attr bright
set -g status-right-length 80

set -g window-status-format "#[fg=colour235,bg=colour234]⮀ #[fg=white,bg=colour234]#I ⮁ #W #[fg=colour234,bg=colour235]⮀"
set -g window-status-current-format "#[fg=colour235,bg=colour120]⮀#[fg=colour25,bg=colour120,noreverse,bold] #I ⮁ #W #[fg=colour120,bg=colour235,nobold]⮀"
set -wg window-status-separator ""
1-1
图3-4 256色色表

提示信息设置

1
2
3
set -g message-attr bold
set -g message-fg colour223
set -g message-bg colour235

插件

在编译安装新版本中,可以使用插件,插件安装方式参考 https://github.com/tmux-plugins/tpm

保存会话功能插件,详细参见https://github.com/tmux-plugins/tmux-resurrect

1
2
3
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @resurrect-capture-pane-contents 'on'
set -g @resurrect-strategy-vim 'session'

在tmux中更好地使用鼠标,详细参见https://github.com/NHDaly/tmux-better-mouse-mode

1
2
3
4
set -g @plugin 'nhdaly/tmux-better-mouse-mode'
set -g @scroll-without-changing-pane 'on'
set -g @emulate-scroll-for-no-mouse-alternate-buffer 'on'
#set -g @scroll-down-exit-copy-mode 'off'

显示CPU使用率,同时也要修改状态栏,详细参见https://github.com/tmux-plugins/tmux-cpu

1
2
3
4
5
6
7
8
9
10
11
12
set -g @plugin 'tmux-plugins/tmux-cpu'
set -g @cpu_low_icon "ᚋ"
set -g @cpu_medium_icon "ᚌ"
set -g @cpu_high_icon "ᚍ"

set -g @cpu_low_fg_color "#[fg=#87ff87]"
set -g @cpu_medium_fg_color "#[fg=#ffff00]"
set -g @cpu_high_fg_color "#[fg=#990000]"

set -g @cpu_low_bg_color "#[bg=#87ff87]"
set -g @cpu_medium_bg_color "#[bg=#ffff00]"
set -g @cpu_high_bg_color "#[bg=#990000]"

修改后的状态栏如下

1
set -g status-right '#{prefix_highlight}  #[fg=#262626]#{cpu_fg_color}⮂#{cpu_bg_color}#[fg=#121212] CPU: #{cpu_icon}#{cpu_percentage} #{cpu_bg_color}#[fg=#303030]⮂#[fg=#121212,bg=#303030,bold] %H:%M #[fg=#0f38ad,bg=#303030]⮂#[fg=#121212,bg=#0f68ad,bold] %-d %b '

当按下前置键的时候,状态栏显示状态,同时也要修改状态栏,如上所示,详细参见https://github.com/tmux-plugins/tmux-prefix-highlight

1
2
3
4
5
6
7
set -g @plugin 'tmux-plugins/tmux-prefix-highlight'
set -g @prefix_highlight_fg '#121212'
set -g @prefix_highlight_bg '#99ff00'
set -g @prefix_highlight_show_copy_mode 'on'
set -g @prefix_highlight_copy_mode_attr 'fg=#121212,bg=yellow,bold'
set -g @prefix_highlight_output_prefix '['
set -g @prefix_highlight_output_suffix ']'

tmux日志记录,详细参加https://github.com/tmux-plugins/tmux-logging

1
2
set -g @plugin 'tmux-plugins/tmux-logging'
set -g @plugin 'tmux-plugins/tmux-sidebar'


5. Expect脚本问题

expect脚本自动ssh登录之后,当终端窗口发生变化时,默认expect不会将终端窗口大小改变的信号传送到远程的服务器上,这样会导致tmux窗口的格式可能会被打乱,如图5-1所示。

1-1
图5-1 未获取窗口大小信号

为解决这个问题,需要在expect脚本中捕获窗口大小改变的信号,脚本如下所示,trap函数为捕获窗口大小改变的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/expect -f
#trap sigwinch spawned
trap {
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH

set password "123456"
spawn ssh 172.16.31.11 -l root -X
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$password\r" }
}
interact

使用以上脚本自动SSH登录之后,效果如图5-2所示,tmux状态栏以及内容可以自动调整

1-1
图5-2 获取窗口大小信号

修订版本信息

修订版本 时间 备注
文档创建 2017/03/08 文档创建
文档修改1 2017/12/23 添加插件配置

参考