tmux 简介与使用指南
tmux 是一个终端复用器(terminal multiplexer),它使你能够轻松地在多个终端程序之间来回切换,同时你还可以脱离它们(它们将在后台继续运行),然后在另一个终端窗口重新连接它们。
tmux 提升工作效率的两个主要功能:
窗口分割。在一个终端窗口中,可以随意进行水平或垂直分割,让你在一个窗口中运行多个独立的终端实例,这样你就无需打开多个终端窗口了。通过简单的组合键,你可以轻松在多个独立运行的终端实例间进行切换。
基于会话的访问控制。在使用 SSH 工作的情况下,tmux 能避免工作现场丢失。假设在你执行某条命令的过程中,因为某些不可抗的因素(如网络问题)导致连接断开,这时你可能很难确定刚才的命令是否执行成功;又或者当你处一个较深层次的目录位置时,若 SSH 连接断开,你不得不重新进入到之前的工作目录。如果使用了 tmux,就可以在 SSH 重新连接后,连接到 tmux 之前的 session,这样就可以回到原来的工作环境。
tmux 简介与使用指南
tmux 工作原理
本文将为您提供有关 tmux 的简要介绍,然后是安装和使用指南。
tmux 使用 C/S 模型构建,主要包含以下几个概念:
- Server:服务器,若当前没有 Server 进程,则执行 tmux 命令时会启动一个 Server
- Session:会话,一个 Server 可以包含多个 Session
- Window:窗口,一个 Session 可以包含多个 Window
- Pane:窗格,一个 Window 可以包含多个 Pane
当 tmux 启动时,它将创建一个具有单个 Window 的新 Session,这个 Window 中默认只包含一个 Pane,并将其显示在屏幕上。屏幕底部的状态栏显示了当前会话的信息,并用于输入交互式命令。
注:这里包括以下所说的屏幕指的是当前仿真终端窗口的屏幕区域,因为在执行 tmux 命令前首先需要打开一个终端模拟器。
Session 是“在 tmux 管理下的伪终端”的单个集合。每个会话都有一个或多个链接到它的 Window。Window 占据整个屏幕,并且可以分成多个矩形 Pane,每个 Pane 都是独立的伪终端。任意数量的 tmux 实例可以连接到同一个 Session,并且同一 Session 中可以存在任意数量的 Window。一旦所有的 Session 都被杀死,tmux 就会退出。
每个 Session 都是持久的,并且可以在意外断开连接(例如 ssh 连接超时)或故意断开连接(使用 C-b d
组合键)时幸免。可以使用以下方法重新连接 tmux:
1 | tmux attach |
在 tmux 中,Session 由 Client 显示在屏幕上,所有的 Session 均有单个 Server 管理。Server 和每个 Client 都是独立的进程,它们通过 /tmp 中的 socket 进行通信。
不使用 tmux 时,是这样的:
使用 tmux 时,是这样的:
安装
Ubuntu / Debian 及其衍生版只需执行以下命令即可:
1 | sudo apt-get install tmux |
CentOS 上安装执行:
1 | sudo yum -y install tmux |
如果是 Mac,则执行:
1 | brew install tmux |
开启你的第一个 Session
对于你的的第一个 Session,你只需要简单的启动 tmux 即可:
1 | tmux |
这将创建一个新的 tmux Session,底部带有一个绿色的状态栏:
状态栏是 tmux 的重要组成部分。除了当前打开的窗口(在左侧)之外,它还显示一些系统信息,例如日期和时间(在右侧),此外状态栏也可以自定义。
分割 Pane
现在,我们已经创建了第一个 Session,接着通过分屏我们可以了解 Pane。当创建新 Session 时,默认情况下,tmux 将自动为我们创建一个 Window 和 一个内部 Pane,现在我们进行分屏操作。
tmux 中的所有命令均由 前缀键+命令键
触发。默认情况下,tmux 使用 C-b
作为前缀键,C-
表示“按住Ctrl键”,C-b
表示同时按下 Ctrl
和 b
键。
将一个 Pane 分割成左右两个 Pane 的快捷键是 C-b %
,这里前缀键为 C-b
,命令键为 %
,这意味着你需要同时按住 Ctrl
和 b
,然后松开这两个键,最后输入 %
键,这样就可以将一个 Pane 垂直分割为两个 Pane 了。
想要水平分割成上下两个 Pane 则使用 C-b "
。
在 Pane 间切换
假如我们在新的右侧的 Pane 中了,现在想回到左侧的 Pane 可以使用 C-b Left
,其中 Left
为左方向键。根据 Pane 的排布,你可以输入不同的方向键去到你想去的 Pane 中,每次输入方向键前,都需要输入前缀键 C-b
。
关闭 Pane
关闭 Pane 输入 exit
然后回车或直接使用快捷键 C-d
就可以了。
创建 Window
tmux 中创建一个新的 Window 可以类比于创建一个新的虚拟桌面。创建一个新的 Window 很简单,只需输入 C-b c
就可以了。通过底部状态栏的星号,你就可以知道当前你所在的 Window 是哪个了。
要切换到上一个 Window (根据状态栏中的顺序),请使用 C-b p
,要切换到下一个 Window,请使用 C-b n
。如果创建了许多窗口,则使用 C-b <number>
会更加高效,其中 <number>
是指定要切换到的 Window 的前面的数字。
Session 管理
如果你已完成或未完成你想要进行的工作,你都可以使用 C-b d
断开 detach 你当前的 Session,这样将会断开你的连接,但是这个 Session 仍会保留在后台中以供重新连接到该 Session 继续之前的工作。
假设你已经 detach 了你的 Session,当你想要重新连接 attach 之前 Session 时,你需要先确定是哪个 Session,通过以下命令可以查看当前所有的 Session:
1 | tmux ls |
这将为你展示所有正在运行的会话的列表,在我们的示例中,该列表应类似于:
1 | 0: 2 windows (created Sun Nov 10 22:30:50 2019) [80x12] |
要连接到该会话,需要再次启动tmux,但这一次告诉它要 attach 到哪个 Session:
1 | tmux attach -t 0 |
注:-t 0
是告诉 tmux attach 到哪个会话的参数,"0" 是 tmux ls
输出的第一部分。
如果你希望为 Session 指定一个更有意义的名称(而不是以 0 开头的数字),则可以使用:
1 | tmux new -s database |
这将创建一个名为 "database" 的新 Session。
你还可以重命名现有会话:
1 | tmux rename-session -t 0 database |
下次连接到该会话时,只需使用 tmux attach -t database
,如果一次使用多个 Session,这对于我们区分不同的 Session 很有帮助。
当你想关闭 Session 时:
1 | tmux kill-session -t session-name |
复制模式 Copy Mode
使用
C-b :
进入 tmux 末行模式,设置 Copy 模式使用按键模式为 vi 模式:1
:setw -g mode-keys vi
- 使用
C-b [
进入 Copy 模式 - 按
Spacebar
开始选中,移动光标选择选中区域 - 按
Enter
复制选中区域内容并退出 Copy 模式 将光标移动到指定位置,使用
C-b ]
粘贴
tmux 常用按键
Session
创建一个新 Session
1
2
3tmux
tmux new
tmux new-session1
:new
创建一个名为 "mysession" 的新 Session
1
tmux new -s mysession
1
:new -s mysession
关闭或删除名为 "mysession" 的 Session
1
2tmux kill-sess -t mysession
tmux kill-session -t mysession关闭或删除当前会话以外的所有 Session
1
tmux kill-session -a
关闭或删除名为 "mysession" 会话以外的所有 Session
1
tmux kill-session -a -t mysession
重命名 Session
C-b $
Detach Session
C-b d
Detach others on the Session
通过 detach 其它 client 来最大化窗口
1
:attach -d
查看所有 Session
1
2tmux ls
tmux list-sessionsC-b s
Attach 到最近的 Session
1
2
3
4tmux a
tmux at
tmux attach
tmux attach-sessionAttach 到名为 "mysession" 的 Session
1
2
3
4tmux a -t mysession
tmux at -t mysession
tmux attach -t mysession
tmux attach-session -t mysession切换到上一个 Session
C-b (
切换到下一个 Session
C-b )
Window
创建一个名为 "mysession" 的新 Session 并指定创建 Window 的名称为 "mywindow"
1
tmux new -s mysession -n mywindow
创建 Window
C-b c
重命名当前 Window
C-b ,
关闭当前 Window
C-b &
切换到上一个 Window
C-b p
切换到下一个 Window
C-b n
根据数字切换 Window
C-b 0~9
重新排序窗口,交换编号为 2 和 1 的窗口
1
:swap-window -s 2 -t 1
将当前窗口向左移动一个位置
1
:swap-window -t -1
Pane
切换到上一次活动的 Pane
C-b ;
垂直分割 Pane
C-b %
水平分割 Pane
C-b "
向左移动当前 Pane
C-b {
向右移动当前 Pane
C-b }
切换到箭头方向的 Pane
C-b UP
C-b DOWN
C-b LEFT
C-b RIGHT
切换到同步 Pane(将命令发送到所有 Pane)
1
:setw synchronize-panes
在 Pane 布局之间切换
C-b Spacebar
切换到下一个 Pane
C-b o
展示 Pane 编号
C-b q
按编号切换 Pane
C-b q 0~9
缩放当前 Pane
C-b z
将 Pane 转换成 Window
C-b !
调整当前 Pane 的高度(按住第二个键是可选的)
C-b-UP
C-b C-UP
C-b-DOWN
C-b C-DOWN
调整当前 Pane 的宽度(按住第二个键是可选的)
C-b-LEFT
C-b C-LEFT
C-b-RIGHT
C-b C-RIGHT
关闭当前 Pane
C-b x
Copy Mode
设置 Copy 模式下使用 vi 命令
1
:setw -g mode-keys vi
进入 Copy 模式
C-b [
进入 Copy 模式并向上滚动一页
C-b PgUp
退出 Copy 模式
q
转到第一行
g
转到最后一行
G
向上滚动
UP
向下滚动
DOWN
向左移动光标
h
向下移动光标
j
向上移动光标
k
向右移动光标
l
一次将光标向前移动一个单词
w
一次将光标向后移动一个单词
b
向前搜索
/
向后搜索
?
搜索结果中,跳到下一个关键字出现位置
n
搜索结果中,跳到上一个关键字出现位置
N
开始选中内容
Spacebar
清空选中内容
Esc
复制选中内容
Enter
粘贴 buffer_0 的内容
C-b ]
展示 buffer_0 的内容
1
:show-buffer
将 Pane 中的所有可见内容复制到缓冲区
1
:capture-pane
显示所有缓冲区
1
:list-buffers
显示所有缓冲区并粘贴所选
1
:choose-buffer
将缓冲区内容保存到 buf.txt
1
:save-buffer buf.txt
删除 buffer_1
1
:delete-buffer -b 1
Misc
进入命令模式
C-b :
为所有 Session 设置 OPTION
1
:set -g OPTION
为所有 Window 设置 OPTION
1
:setw -g OPTION
Help
展示快捷键帮助
C-b ?
显示当前时间
C-b t
References
https://www.hamvocke.com/blog/a-quick-and-easy-guide-to-tmux/