Tmux 简介与使用
Tmux 是一个用于在终端窗口中运行多个终端会话的工具,即终端复用软件(terminal multiplexer)。在 Tmux 中可以根据不同的工作任务创建不同的会话,每个会话又可以创建多个窗口来完成不同的工作,每个窗口又可以分割成很多小窗口。这些功能都是非常实用的。
Tmux 的多窗口和窗口分割并不是它吸引的我原因,对于这一点我可以有另外一个终端工具代替,即 Terminator。使用 Tmux 最大的益处在于,远程 SSH 访问服务器进行工作时。即使非正常掉线,它能保存当前工作状态,并保证当前任务继续运行。这一点对于远程 SSH 工作的人来说是非常重要的。远程 ssh 工作时,Tmux 的多会话、多窗口、多面板的益处才充分体现了出来。使用 Tmux 就不必开启多个标签连接多个 ssh 了,所有工作在一个 ssh 连接上就搞定了,也不必担心突然掉线后工作丢失。
与 Tmux 类似的软件还有 screen、dvtm、splitvt、byobu 等。
会话, 窗口, 窗格
根据 Tmux 的定义,在开启了 Tmux 服务器后,会首先创建一个会话,而这个会话则会首先创建一个窗口,其中仅包含一个窗格;也就是说,这里看到的所谓终端控制台应该称作 Tmux 的一个窗格,虽然其使用方法与终端控制台完全相同。
Tmux 使用 C/S 模型构建,主要包括以下单元模块:
- server 服务器:输入
tmux
命令时就开启了一个服务器,服务器由于管理多个会话。 - session 会话:一个服务器可以包含多个会话,可以理解成是一个特定的终端组合,通常将同一任务下的工作放到一个会话中。
- window 窗口:一个会话可以包含多个窗口,一个窗口就相当于普通终端的一个标签,通常在不同的窗口中完成不同的工作。
- pane 窗格:一个窗口可以被分割成多个小的窗格。
会话,窗口和窗格是 Tmux 的基本概念,在使用 Tmux 之前必须要理解他们的含义。
安装
在 Mac OS 中安装:
$ brew install tmux
在 Ubuntu 中安装:
sudo apt-get install tmux
或者下载源码编译安装:https://tmux.github.io/
基本使用
对 Tmux 的操作都是用命令或者快捷键来完成的,在使用 Tmux 快捷键时都需要加上一个命令前缀(prefix),即 Ctrl+b
。快捷键的使用方法是,按下组合键 Ctrl-b
,接着放开组合键 Ctrl-b
,接着再按相关的快捷键。如果你觉得 Ctrl+b
使用起来不方便,可以重定义命令前缀,在配置文件 ~/.tmux.conf
中添加如下内容:
# remap prefix from 'C-b' to 'C-a'
unbind C-b
set -g prefix C-a
bind-key C-a send-prefix
运行 tmux 命令直接新建一会话,并进入:
tmux
每一个会话都有一个编号或者名字,用于在会话间切换或者重新连接会话。但是记住每个会话的编号并不容易,当然,我们在新建会话时可以指定一个名字,以便于记忆:
tmux new -s mysession
或者:
tmux new-session -s mysession
使用快捷键 prefix + d
可以暂时离开当前会话,如果要再次连接以前的某个会话,可以用如下命令:
tmux attach -t <session-name>
或者:
tmux attach-session -t <session-name>
或者简写成:
tmux a -t <session-name>
要杀掉会话,可以用如下命令:
tmux kill-session -t <session-name>
或者直接杀死所有会话:
tmux kill-server
常用命令
-
信息查询:
- tmux list-keys 列出所有可以的快捷键和其运行的 tmux 命令
- tmux list-commands 列出所有的 tmux 命令及其参数
- tmux info 流出所有的 session, window, pane, 运行的进程号,等。
-
会话控制:
- tmux new -s session_name 创建一个叫做 session_name 的 tmux session
- tmux attach -t session_name 重新开启叫做 session_name 的 tmux session
- tmux switch -t session_name 转换到叫做 session_name 的 tmux session
- tmux rename -t old-name new-name 重命名 session
- tmux list-sessions / tmux ls 列出现有的所有 session
- tmux detach 离开当前开启的 session
- tmux kill-server 关闭所有 session
-
窗口控制:
- tmux new-window 创建一个新的 window
- tmux list-windows 列出所有的 window
- tmux select-window -t :0-9 根据索引转到该 window
- tmux rename-window 重命名当前 window
-
窗格控制:
- tmux split-window 将 window 垂直划分为两个 pane
- tmux split-window -h 将 window 水平划分为两个 pane
- tmux swap-pane -[UDLR] 在指定的方向交换 pane
- tmux select-pane -[UDLR] 在指定的方向选择下一个 pane
-
其他操作:
- tmux clear-history 清空输出缓冲区
常用快捷键
所有快捷键的使用都必须加上命令前缀(prefix), 默认是 Ctrl+b
。
- 基本操作:
命令 | 说明 |
---|---|
? | 列出所有快捷键;按 q 返回 |
d | 脱离当前会话,可暂时返回 Shell 界面 |
s | 选择并切换会话;在同时开启了多个会话时使用 |
L | 切换回上一次的会话 |
D | 选择要脱离的会话;在同时开启了多个会话时使用 |
: | 进入命令行模式;此时可输入支持的命令,例如 kill-server 关闭所有tmux会话 |
[ | 复制模式,光标移动到复制内容位置,空格键开始,方向键选择复制,回车确认,q/Esc 退出 |
] | 进入粘贴模式,粘贴之前复制的内容,按 q/Esc 退出 |
~ | 列出提示信息缓存;其中包含了之前 tmux 返回的各种提示信息 |
t | 显示当前的时间 |
- 窗口操作:
命令 | 说明 |
---|---|
c | 创建新窗口 |
& | 关闭当前窗口 |
[0-9] | 数字键切换到指定窗口 |
p | 切换至上一窗口 |
n | 切换至下一窗口 |
l | 前后窗口间互相切换 |
w | 通过窗口列表切换窗口 |
, | 重命名当前窗口,便于识别 |
. | 修改当前窗口编号,相当于重新排序 |
f | 在所有窗口中查找关键词,便于窗口多了切换 |
- 窗格操作:
命令 | 说明 |
---|---|
” | 将当前面板上下分屏 |
% | 将当前面板左右分屏 |
x | 关闭当前分屏 |
! | 将当前面板置于新窗口,即新建一个窗口,其中仅包含当前面板 |
q | 显示面板编号 |
o | 选择当前窗口中下一个面板 |
{ | 向前置换当前面板 |
} | 向后置换当前面板 |
z | 最大化当前所在面板 |
方向键 | 移动光标选择对应面板 |
page up | 向上滚动屏幕,q 退出 |
page down | 向下滚动屏幕,q 退出 |
alt+o | 逆时针旋转当前窗口的面板 |
ctrl+o | 顺时针旋转当前窗口的面板 |
ctrl+方向键 | 以 1 个单元格为单位移动边缘以调整当前面板大小 |
alt+方向键 | 以 5 个单元格为单位移动边缘以调整当前面板大小 |
复制模式(copy-mode)
Tmux 的使用类似于 vim, 在窗口中要自由的复制文本,可以进入复制模式,使用 prefix + [
进入复制模式:
- 按 space 开始复制,移动光标选择复制区域
- 按 Enter 复制并退出 copy-mode。
- 将光标移动到指定位置,按
prefix + ]
粘贴
如果启用了鼠标,可以直接用鼠标选中要复制的文本,然后用 prefix + ]
进行粘贴。
还可以按住 shift
键,然后再用鼠标选中要复制的文本,此时是系统正常的复制,需要鼠标右键选择复制
才能复制文本。在 Mac OSX 上,该快捷功能键是 option
.
其他技巧
同步窗格:
可以在一个窗口下的多个窗格中同时同步执行一个命令操作。实现该功能需要开启 synchronize-panes
配置。进入命令模式 Ctrl-B :
然后输入以下指令开启或关闭窗口同步:
:setw synchronize-panes on # 开启窗口同步
:setw synchronize-panes off # 关闭窗口同步
配置
Tmux 支持自定义的配置文件,/etc/tmux.conf
是全局的配置,~/.tmux.conf
是用户配置。例如 Tmux 也可以像 vim 一样使用底行命令模式,我们重新配置其快捷键跟 vim 一样使用 :
,在配置文件中添加如下内容:
# bind : to command-prompt like vim
# this is the default in tmux already
bind : command-prompt
在命令行模式下可以输入 tmux 的命令来执行相关动作。