Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具。
为什么要使用 tmux ?
- 想同时打开多个目录不得不开很多终端标签来回切换
- 开了一个 vim 窗口之后,想切到其他目录不得不重新打开个一个终端窗口 ssh 到服务器
- 运行一个脚本,服务器断掉失联之后当前进程被服务器给无情地杀掉,不得不用 nohup 等方式让脚本在后台跑
Tmux 概念和使用
tmux 中有几个重要概念:
会话 (session): 建立一个 tmux 工作区会话,会话可以长期驻留,重新连接服务器不会丢失,我们只需重新 tmux attach 到之前的工作区就可以恢复会话,这样你的工作区就可以常驻服务器了,非常方便
窗口 (window): 容纳多个窗格
窗格 (pane): 可以在窗口中分成多个窗格,每个窗格都可以运行各种命令
前缀键
Tmux 窗口有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是 Ctrl+b
,即先按下 Ctrl+b
,快捷键才会生效。
如果更喜欢 Ctrl+a
, 则需要将其添加到 ~/.tmux.conf
# remap prefix to Control + a
set -g prefix C-a
# bind 'C-a C-a' to type 'C-a'
bind C-a send-prefix
unbind C-b
获得帮助
举例来说,帮助命令的快捷键是 Ctrl+b ?
。它的用法是,在 Tmux 窗口中,先按下 Ctrl+b
,再按下 ?
,就会显示帮助信息。
然后,按下 ESC 键或 q
键,就可以退出帮助。
查看 tmux 版本
CentOS 7 中版本是 1.8
$ tmux -V
tmux 1.8
会话管理
新建会话
第一个启动的 Tmux 窗口,编号是0
,第二个窗口的编号是1
,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话。
使用编号区分会话,不太直观,更好的方法是为会话起名。
$ tmux
# 新建一个指定名称的会话
$ tmux new -s <session-name>
# 启动新会话
Ctrl+b :new<回车>
列出所有会话
快捷键
Ctrl+b s
:列出所有会话
查看当前所有的 Tmux 会话
$ tmux ls
# or
$ tmux list-session
分离会话
快捷键
Ctrl+b d
:分离当前会话
或者输入 tmux detach
命令,就会将当前会话与窗口分离
$ tmux detach
上面命令执行后,就会退出当前 Tmux 窗口,但是会话和里面的进程仍然在后台运行。
恢复会话
tmux attach
命令用于重新接入某个已存在的会话
# 使用会话编号
$ tmux attach -t 0
# 使用会话名称
$ tmux attach -t <session-name>
# 简写
$ tmux a -t <session-name>
结束会话
tmux kill-session
命令用于杀死某个会话
# 使用会话编号
$ tmux kill-session -t 0
# 使用会话名称
$ tmux kill-session -t <session-name>
# 关闭所有会话
$ tmux ls | grep : | cut -d. -f1 | awk '{print substr($1, 0, length($1)-1)}' | xargs kill
切换会话
快捷键
Ctrl+b (
: 上一个会话Ctrl+b )
:下一个会话Ctrl+b L
:上一次使用过的会话Ctrl+b s
: 从列表中选择会话
tmux switch
命令用于切换会话
# 使用会话编号
$ tmux switch -t 0
# 使用会话名称
$ tmux switch -t <session-name>
重命名会话
快捷键
Ctrl+b $
:重命名当前会话
tmux rename-session
命令用于重命名会话。
$ tmux rename-session -t 0 <new-name>
上面命令将 0号会话重命名
窗口管理
Tmux 允许新建多个窗口(window)
新建窗口
快捷键
Ctrl+b c
:创建一个新窗口,状态栏会显示多个窗口的信息
tmux new-window
命令用来创建新窗口
$ tmux new-window
# 新建一个指定名称的窗口
$ tmux new-window -n <window-name>
切换窗口
快捷键
Ctrl+b w
:从列表中选择窗口Ctrl+b p
:切换到上一个窗口(按照状态栏上的顺序)Ctrl+b n
:切换到下一个窗口Ctrl+b l
:上一次使用过的窗口Ctrl+b <number>
:切换到指定编号的窗口,其中的<number>
是状态栏上的窗口编号Ctrl+b 0
Ctrl+b 9
tmux select-window
命令用来切换窗口。
# 切换到指定编号的窗口
$ tmux select-window -t <window-number>
# 切换到指定名称的窗口
$ tmux select-window -t <window-name>
重命名窗口
快捷键
Ctrl+b ,
:窗口重命名
tmux rename-window
命令用于为当前窗口起名(或重命名)
$ tmux rename-window <new-name>
窗口快捷键
下面是一些窗口操作的快捷键
Ctrl+b f
:查找窗口Ctrl+b &
:关闭当前窗口
调整窗口排序
按下 Tmux 前缀 ctrl+b
,然后输入 :
swap-window -s 3 -t 1 交换 3 号和 1 号窗口
swap-window -t 1 交换当前和 1 号窗口
move-window -t 1 移动当前窗口到 1 号
窗格操作
Tmux 可以将窗口分成多个窗格(pane),每个窗格运行不同的命令。以下命令都是在 Tmux 窗口中执行。
划分窗格
快捷键
Ctrl+b %
:划分左右两个窗格, 垂直分割Ctrl+b "
:划分上下两个窗格, 水平分割
tmux split-window
命令用来划分窗格
# 划分上下两个窗格
$ tmux split-window
$ tmux split-window -v
# 划分左右两个窗格
$ tmux split-window -h
移动光标
快捷键
Ctrl+b ↑
:光标切换到上方窗格Ctrl+b ↓
:光标切换到下方窗格Ctrl+b ←
:光标切换到左边窗格Ctrl+b →
:光标切换到右边窗格Ctrl+b ;
:光标切换到上一个窗格Ctrl+b o
:光标切换到下一个窗格
tmux select-pane
命令用来移动光标位置
# 光标切换到上方窗格
$ tmux select-pane -U
# 光标切换到下方窗格
$ tmux select-pane -D
# 光标切换到左边窗格
$ tmux select-pane -L
# 光标切换到右边窗格
$ tmux select-pane -R
交换窗格位置
快捷键
Ctrl+b {
:当前窗格与上一个窗格交换位置Ctrl+b }
:当前窗格与下一个窗格交换位置Ctrl+b Ctrl+o
:所有窗格向前移动一个位置,第一个窗格变成最后一个窗格Ctrl+b Alt+o
:所有窗格向后移动一个位置,最后一个窗格变成第一个窗格
tmux swap-pane
命令用来交换窗格位置
# 当前窗格上移
$ tmux swap-pane -U
# 当前窗格下移
$ tmux swap-pane -D
调整窗格尺寸
Ctrl+b :resize-pane -U 当前窗格向上扩大 1 格
Ctrl+b :resize-pane -L 当前窗格向左扩大 1 格
Ctrl+b :resize-pane -R 当前窗格向右扩大 1 格
Ctrl+b :resize-pane -D 20 当前窗格向下扩大 20 格
Ctrl+b :resize-pane -t 2 -L 20 编号为 2 的窗格向左扩大 20 格
Ctrl+b Alt+ ↑ 向上扩大窗格
Ctrl+b Alt+ ↓ 向下扩大窗格
Ctrl+b Alt+ ← 向左扩大窗格
Ctrl+b Alt+ → 向右扩大窗格
Ctrl+b Alt+ → → → 连续向右扩大窗格
翻页及内容搜索
快捷键
Ctrl+b [
:进入scrollback mode
, 使用↑
↓
上下方向键进行单行滚动Ctrl+b PgUp
:向上翻页Ctrl+b PgDn
:向下翻页- 在滚动模式中按下
q
退出滚动模式
可以按 Ctrl+s
进行内容搜索, 搜索到的多个内容按 n / N
调转到 下一个 / 上一个
匹配项. 而 Ctrl+s
是 emacs bindings
. 如果将 tmux 设置成了 vim bindings
, 进入 copy mode
再用 slash (/)
进行搜索
使用预设布局
Ctrl+b M-1 switch to even-horizontal layout
Ctrl+b M-2 switch to even-vertical layout
Ctrl+b M-3 switch to main-horizontal layout
Ctrl+b M-4 switch to main-vertical layout
Ctrl+b M-5 switch to tiled layout
Ctrl+b 空格 切换到下一个布局
窗格快捷键
下面是一些窗格操作的快捷键
Ctrl+b x
:关闭当前窗格Ctrl+b !
:将当前窗格拆分为一个独立窗口Ctrl+b z
:当前窗格全屏显示,再使用一次会变回原来大小Ctrl+b t
:窗口中央显示一个数字时钟Ctrl+b q
:显示窗格编号
其他命令
下面是一些其他命令。
# 列出所有快捷键,及其对应的 Tmux 命令
$ tmux list-keys
# 列出所有 Tmux 命令及其参数
$ tmux list-commands
# 列出当前所有 Tmux 会话的信息
$ tmux info
# 重新加载当前的 Tmux 配置
$ tmux source-file ~/.tmux.conf
[root@centos ~]# tmux -V
tmux 1.8
[root@centos ~]# tmux list-keys
bind-key C-b send-prefix
bind-key C-o rotate-window
bind-key C-z suspend-client
bind-key Space next-layout
bind-key ! break-pane
bind-key " split-window
bind-key # list-buffers
bind-key $ command-prompt -I #S "rename-session '%%'"
bind-key % split-window -h
bind-key & confirm-before -p "kill-window #W? (y/n)" kill-window
bind-key ' command-prompt -p index "select-window -t ':%%'"
bind-key ( switch-client -p
bind-key ) switch-client -n
bind-key , command-prompt -I #W "rename-window '%%'"
bind-key - delete-buffer
bind-key . command-prompt "move-window -t '%%'"
bind-key 0 select-window -t :0
bind-key 1 select-window -t :1
bind-key 2 select-window -t :2
bind-key 3 select-window -t :3
bind-key 4 select-window -t :4
bind-key 5 select-window -t :5
bind-key 6 select-window -t :6
bind-key 7 select-window -t :7
bind-key 8 select-window -t :8
bind-key 9 select-window -t :9
bind-key : command-prompt
bind-key ; last-pane
bind-key = choose-buffer
bind-key ? list-keys
bind-key D choose-client
bind-key L switch-client -l
bind-key [ copy-mode
bind-key ] paste-buffer
bind-key c new-window
bind-key d detach-client
bind-key f command-prompt "find-window '%%'"
bind-key i display-message
bind-key l last-window
bind-key n next-window
bind-key o select-pane -t :.+
bind-key p previous-window
bind-key q display-panes
bind-key r refresh-client
bind-key s choose-tree
bind-key t clock-mode
bind-key w choose-window
bind-key x confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key z resize-pane -Z
bind-key { swap-pane -U
bind-key } swap-pane -D
bind-key ~ show-messages
bind-key PPage copy-mode -u
bind-key -r Up select-pane -U
bind-key -r Down select-pane -D
bind-key -r Left select-pane -L
bind-key -r Right select-pane -R
bind-key M-1 select-layout even-horizontal
bind-key M-2 select-layout even-vertical
bind-key M-3 select-layout main-horizontal
bind-key M-4 select-layout main-vertical
bind-key M-5 select-layout tiled
bind-key M-n next-window -a
bind-key M-o rotate-window -D
bind-key M-p previous-window -a
bind-key -r M-Up resize-pane -U 5
bind-key -r M-Down resize-pane -D 5
bind-key -r M-Left resize-pane -L 5
bind-key -r M-Right resize-pane -R 5
bind-key -r C-Up resize-pane -U
bind-key -r C-Down resize-pane -D
bind-key -r C-Left resize-pane -L
bind-key -r C-Right resize-pane -R
Tmux 命令中的 M 按键是什么
bind-key M-1 select-layout even-horizontal
bind-key M-2 select-layout even-vertical
bind-key M-3 select-layout main-horizontal
bind-key M-4 select-layout main-vertical
bind-key M-5 select-layout tiled
bind-key M-n next-window -a
bind-key M-o rotate-window -D
bind-key M-p previous-window -a
这是 meta
键。所以 M-1
是 meta-1
。(就像 C-1
是 control-1
一样)。
如果你有一个普通的 PC 键盘, 当你查看键盘时, 你可能会注意到没有明显标记为 meta
的键。根据你的键盘布局设置方式, meta
通常是 alt 键
或 徽标 (Windows) 键
。
一般可以在 SSH 的客户端里设置 meta
按键映射
tmux cheat sheet
Tmux 快捷键 & 速查表 & 简明教程
Tmux 使用教程
How do I resize tmux pane by holding down prefix and arrow key for a while?
How do I scroll in tmux?
Tmux commands: What is M-whatever
其他
What do the keys on this Symbolics Space Cadet keyboard do?
tmux终端复用/tmate终端共享/screen
GNU Screen splitting
.tmux.conf 配置文件