本系列文章包括3篇,主要分享我在后端开发过程中使用终端的一些经验和心得,分享fish shell使用,使用tmux终端复用管理会话、窗口,以及vim插件使用,让vim变成强大的IDE。通过阅读本系列文章,你也可以打造一个高效易用的终端,能很大的提高工作的效率,让手指飞起来,让命令行飞起来。

本系列的3篇文章包括:

打造最强终端之一:Fish shell简明教程

打造最强终端之二:Tmux配置及使用教程

打造最强终端之三:vim插件使用教程

本系列文章使用的fish配置文件,tmux配置文件和vim插件都上传到了github, cool-terminal-conf.

本文为第二篇,Tmux简明教程。

简介

命令行的典型使用方式是,打开一个终端窗口(terminal window),在里面输入命令。用户与计算机的这种交互,称为一次“会话“(session)。

会话的一个重要特点是,窗口与其启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束。这样会话中的进程也会随之关闭,不管有没有运行完。

tmux就是将会话与窗口”解绑“的工具。

  1. 它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
  2. 它可以让新窗口"接入"已经存在的会话。
  3. 它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
  4. 它还支持窗口任意的垂直和水平拆分。

配置

tmux配置文件为 ~/.tmux.conf,我自定义了tmux的快捷键和状态栏,配置项我都写了注释,读者可以根据自己的喜好修改自定义 :)

 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
# tmux默认快捷键的前缀是 ctrl-b, 我修改成了 ` (数字键1左边的那个键)
# Set Ctrl-b key bindings
unbind C-b
set -g prefix `

# 窗口索引从1开始,`-1 即切换到第一个窗口
# Count sessions start at 1
set -g base-index 1

# vi模式,v开始选择,y 复制选择内容到剪贴板
# Use vim bindings
setw -g mode-keys vi
# start selecting text typing 'v' key (once you are in copy mode)
bind-key -T copy-mode-vi 'v' send -X begin-selection
# # copy selected text to the system's clipboard
bind-key -T copy-mode-vi 'y' send -X copy-pipe-and-cancel pbcopy

#up
bind-key k select-pane -U
#down
bind-key j select-pane -D
#left
bind-key h select-pane -L
#right
bind-key l select-pane -R

# 切分窗口,快捷键修改为 - 水平切分窗口, \ 垂直切分窗口
# split window
unbind '"'
bind - splitw -v
unbind %
bind \ splitw -h

# ctrl + k/j/h/l 调整pane大小
# resize pane
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)

# Status bar settings
# alignment
set-option -g status-justify centre

# left-bottom corner
set-option -g status-left '#[bg=black,fg=green][#[fg=cyan]#S#[fg=green]]'
set-option -g status-left-length 20

# window list
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]'

# right-bottom status
set -g status-right '#[fg=green][#[fg=cyan]%Y-%m-%d#[fg=green]]'

# center window status
set -g window-status-format "#I:#W"
set -g window-status-current-format "#I:#W"

# default statusbar colors
set -g status-fg white
set -g status-bg black

# default window title colors
set-window-option -g window-status-style fg=white
set-window-option -g window-status-style bg=default
set-window-option -g window-status-style dim

# active window title colors
set-window-option -ag window-status-current-style fg=red
set-window-option -ag window-status-current-style bg=default
set-window-option -ag window-status-current-style bold

# command/message line colors
set -g message-style fg=white
set -g message-style bg=black
set -g message-style bright

set -g status-keys vi
bind-key -T vi-edit Up send -X history-up
bind-key -T vi-edit Down send -X history-down

set -g status-interval 1
set -g status-justify centre # center align window list

# window-name
set-option -g allow-rename off

使用

下面操作的快捷键 指的是快捷键的前缀,默认是ctrl-b,我配置文件修改为了 `(键盘数字1左边的键)

基本操作

1
2
3
4
5
tmux ls  # 查询所有会话
tmux new -s session_name    # 创建会话
tmux detach # 断开会话,或者使用快捷键 <prefix>-d
tmux attach [-t session_name]   # 重新连接会话,-t session_name 指定连接的会话名称
tmux kill-session -t session_name   # 关闭会话,会话关闭后,会话中所有的程序也会关闭

会话(session)管理

1
2
3
s   # 列出所有会话
$   # 重命名会话
d   # 断开会话

下图展示<prefix>-s列出所有session的结果,我们只窗口了一个blog会话,选择session时,也会展示该session中各窗口的缩略图。

2-tmux-session-mgr

窗口(window)管理

1
2
3
4
5
6
7
8
9
c # 新建窗口
, # 重命名窗口
w   # 列出所有窗口
n # 选择下一个窗口
p # 选择上一个窗口
0-9 # 选择对应编号的窗口

- # 水平分割窗口,默认键为 %
\ # 垂直分割窗口,默认键为 "

下图展示<prefix>-w列出所有窗口的结果,可以看到blog会话包含了hugo, post, udp 3个窗口,选择某个窗口时也展示了该窗口包含的pane。

2-tmux-window-mgr

窗格(pane)管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
q # 显示窗格的编号
o # 在窗格间切换
} # 与下一个窗格交换位置
{ # 与上一个窗格交换位置
x # 关闭当前窗格

- # 创建一个水平窗格,默认键为 %
\   # 创建一个竖直窗格,默认键为 "
j # 选择下一个窗格
k # 选择上一个窗格
h # 选择左一个窗格
l # 选择右一个窗格
ctrl-j  # 向下resize窗格
ctrl-k  # 向上resize窗格
ctrl-h  # 向左resize窗格
ctrl-l  # 向右resize窗格

下图展示<prefix>-q显示pane的编号,可以看到窗口3(udp)包含了 0 1 2 三个pane,

2-tmux-pane-mgr

其他命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 列出所有快捷键,及其对应的 Tmux 命令
tmux list-keys

# 列出所有 Tmux 命令及其参数
tmux list-commands

# 列出当前所有 Tmux 会话的信息
tmux info

# 重新加载当前的 Tmux 配置
tmux source-file ~/.tmux.conf

总结

tmux终端复用的好处不仅在于将窗口与会话"解绑”,这样即使你不小心关掉了终端,终端中正在运行的程序不会退出,你仍然可以使用 tmux attach切换到会话中来,同时,一个session可以管理多个窗口和窗格,窗口之间能快速切换,能很大的提高工作效率。