Tmux使用说明

1. Tmux的作者

Tmux的作者是Nicholas Marriott, 网上关于Nicholas Marriott的介绍很少, 但是本人对创建如此复杂而功能强大的Tmux的开源开发者十分感兴趣, 希望知道的能补充一些关于Tmux的信息.

2. Tmux 是什么?

Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具。
打开一个终端窗口(terminal window,以下简称”窗口”),在里面输入命令。用户与称为一次”会话”(session) 。
口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话不管有没有运行完。
登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时命令的。因为上一次 SSH 会话已经终止了,里面的进程也随之消失了。
窗口可以”解绑”:窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候.

3. 为什么需要安装tmux

我偏爱 tmux 而非其他的终端工具有几个原因:
会话处理:从会话分离和附加到会话帮助我进行上下文切换和远程工作
平台独立性:我可以在我的 Macbook、我的 Linux 笔记本、云服务器、windows下的Cygwin, Raspberry Pis、BeagleBones 等上使用 tmux。
可定制:有很多方法可以定制我的 tmux 环境的外观和行为。 我可以使用一个简单的点文件跨不同平台同步
街头信誉:你不想让别人称你为跛脚,是吗?

3.1. Tmux中的重要概念

在Tmux逻辑中,需要分清楚Server > Session > Window > Pane这个大小和层级顺序是极其重要的,直接关系到工作效率:
Server:是整个tmux的后台服务。有时候更改配置不生效,就要使用tmux kill-server来重启tmux。
Session:是tmux的会话。我之前就错把这个session当成窗口用,造成了很多不便里。一般只要保存一个session就足够了。
Window:相当于一个工作区,包含很多分屏,可以针对每种任务分一个Window。如下载一个Window,编程一个window。
Pane:是在Window里面的小分屏。最常用也最好用
了解了这个逻辑后,整个Tmux的使用和配置也就清晰了。
使用 Tmux 的时候千万不要去背指令,所有的指令都可以在 .tmux.conf 配置文件中绑定自己顺手的快捷键,也可以配置开启鼠标。

3.2. Tmux 的作用

Tmux 就是会话与窗口的”解绑”工具,将它们彻底分离.

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

类似的终端复用器还有 GNU Screen。Tmux 与它功能相似,但是更易用,也更强大。

4. 安装Tmux

1
2
3
4
5
6
7
8
# Ubuntu 或 Debian
$ sudo apt-get install tmux

# CentOS 或 Fedora
$ sudo yum install tmux

# Mac
$ brew install tmux

5. 基本用法

5.1. 启动与退出

安装完成后,在命令行下键入tmux命令,就进入了 Tmux 窗口。

1
tmux

上面命令会启动 Tmux 窗口,底部有一个状态栏。状态栏的左侧是窗口信息(编号和名称),右侧是系统信息。

5.2. 前缀键

Tmux 窗口有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是Ctrl+b,即先按下Ctrl+b,快捷键才会生效。
举例来说,帮助命令的快捷键是Ctrl+b ?。它的用法是,在 Tmux 窗口中,先按下Ctrl+b,再按下?,就会显示帮助信息。
然后,按下 ESC 键或q键,就可以退出帮助。

6. session管理

6.1. 新建会话

第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话。
使用编号区分会话,不太直观,更好的方法是为会话起名。

1
tmux new -s <session-name>

上面命令新建一个指定名称的会话。
快捷键: Ctrl+b :new<回车>

6.2. 分离window和session

在 Tmux 窗口中,按下Ctrl+b d或者输入tmux detach命令,就会将当前会话与窗口分离。

1
tmux detach

上面命令执行后,就会退出当前 Tmux 窗口,但是会话和里面的进程仍然在后台运行。
快捷键: Ctrl+b d

6.3. 查看session

tmux ls命令可以查看当前所有的 Tmux 会话。

1
2
3
$ tmux ls
# or
$ tmux list-session

也可以使用快捷键Ctrl+b s快速查看session,并使用方向键切换会话,非常方便.
快捷键: Ctrl+b :ls

6.4. 接入会话

tmux attach命令用于重新接入某个已存在的会话。

1
2
3
4
5
# 使用会话编号
$ tmux attach -t 0

# 使用会话名称
$ tmux attach -t <session-name>

6.5. 关闭会话

tmux kill-session命令用于杀死某个会话。

1
2
3
4
5
# 使用会话编号
$ tmux kill-session -t 0

# 使用会话名称
$ tmux kill-session -t <session-name>

6.6. 切换会话

tmux switch命令用于切换会话。

1
2
3
4
5
# 使用会话编号
$ tmux switch -t 0

# 使用会话名称
$ tmux switch -t <session-name>

6.7. 重命名会话

tmux rename-session命令用于重命名会话。

1
tmux rename-session -t 0 <new-name>

也可以使用Ctrl+b $:快速重命名当前会话。

6.8. 会话管理快捷键汇总

下面是一些会话相关的快捷键。
| 快捷键 | 描述 |
| :—- | —- |
| Ctrl+b : | 进入命令行模式,可以用ls等命令。|
| Ctrl+b :new<回车> | 启动新会话。|
| Ctrl+b d | 分离当前会话。|
| Ctrl+b D | 选择要断开的会话。|
| Ctrl+b ctrl+z | 起当前会话。|
| Ctrl+b r | 重载当前会话。|
| Ctrl+b s | 列出所有会话。|
| Ctrl+b $ |重命名当前会话。|

7. 窗格管理

Tmux 可以将窗口分成多个窗格(pane),每个窗格运行不同的命令。以下命令都是在 Tmux 窗口中执行。

7.1. 分割窗格

tmux split-window命令用来分割窗格。

垂直分割窗口 Ctrl+b "

1
2
# 划分上下两个窗格
$ tmux split-window

水平分割窗口, 快捷键Ctrl+b %

1
2
# 划分左右两个窗格
$ tmux split-window -h

7.2. 切换窗格

tmux select-pane命令用来移动光标位置。
可以使用命令,也可以使用会计见以下up, down, left, right表示键盘方向键
切换到上方窗格 快捷键Ctrl+b Ctrl+up

1
2
# 光标切换到上方窗格
$ tmux select-pane -U

切换到下方窗格 快捷键Ctrl+b Ctrl+down

1
2
# 光标切换到上方窗格
$ tmux select-pane -D

切换到左侧窗格 快捷键Ctrl+b Ctrl+left

1
2
# 光标切换到左边窗格
$ tmux select-pane -L

切换到左侧窗格 快捷键Ctrl+b Ctrl+right

1
2
# 光标切换到右边窗格
$ tmux select-pane -R

也可以使用快捷键循环切换窗口
Ctrl+b ;:光标切换到上一个窗格。
Ctrl+b o:光标切换到下一个窗格。

8. 交换窗格位置

tmux swap-pane命令用来交换窗格位置

1
2
3
4
# 当前窗格上移
$ tmux swap-pane -U
# 当前窗格下移
$ tmux swap-pane -D

8.1. 窗格管理快捷键

下面是一些窗格管理的快捷键。
| 快捷键 | 描述 |
| —- | —- |
| Ctrl+b “|划分上下两个窗格。|
| Ctrl+b %|划分左右两个窗格。 |
| Ctrl+b <arrow key>|光标切换到其他窗格。<arrow key>是指向要切换到的窗格的方向键,比如切换到下方窗| 格,就按方向键↓。|
| Ctrl+b ;|光标切换到上一个窗格。|
| Ctrl+b o|光标切换到下一个窗格。 |
| Ctrl+b {|当前窗格与上一个窗格交换位置。|
| Ctrl+b }|当前窗格与下一个窗格交换位置。|
| Ctrl+b Ctrl+o|所有窗格向前移动一个位置,第一个窗格变成最后一个窗格。|
| Ctrl+b Alt+o|所有窗格向后移动一个位置,最后一个窗格变成第一个窗格。|
| Ctrl+b x|关闭当前窗格。|
| Ctrl+b !|将当前窗格拆分为一个独立窗口。 |
| Ctrl+b z|当前窗格全屏显示,再使用一次会变回原来大小。|
| Ctrl+b Ctrl+<arrow key>|按箭头方向调整窗格大小。|
| Ctrl+b q|显示窗格编号。|

9. 窗口管理

9.1. 新建窗口

tmux new-window命令用来创建新窗口。

1
2
3
4
$ tmux new-window

# 新建一个指定名称的窗口
$ tmux new-window -n <window-name>

9.2. 切换窗口

tmux select-window命令用来切换窗口。

1
2
3
4
5
# 切换到指定编号的窗口
$ tmux select-window -t <window-number>

# 切换到指定名称的窗口
$ tmux select-window -t <window-name>

9.3. 重命名窗口

tmux rename-window命令用于为当前窗口起名(或重命名)。

1
tmux rename-window <new-name>

9.4. 窗口管理快捷键

下面是一些窗口操作的快捷键。
| 快捷键 | 描述 |
| —- | —- |
| Ctrl+b c | 创建一个新窗口,状态栏会显示多个窗口的信息。|
| Ctrl+b p | 切换到上一个窗口(按照状态栏上的顺序)。|
| Ctrl+b n | 切换到下一个窗口。|
| Ctrl+b <number>|切换到指定编号的窗口,其中的<number>是状态栏上的窗口编号。|
| Ctrl+b w |从列表中选择窗口。|
| Ctrl+b , |窗口重命名。|

9.5. 其他命令

下面是一些其他命令。

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

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

# 查看某个子命令帮助
$ tmux

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

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

10. 定制自己的tmux

以上讲了那么多快捷键, 其实在日常使用中可能会用不到, 所以不用记. 使用Tmux就有这样的好处, 如果快捷键难记, 那么我们就改掉它, 改成顺手的,习惯的.
tmux默认会读取用户home目录下一个叫.tmux.conf的文件,定制自己的tmux主要是修改这个配置文件.

  • 首先我们要修改的就是prefix键, 默认的profix键是Ctrol+b, 这个组合虽然可以避免和常用的快捷键冲突,但是使用起来也很别扭, 有点像弹钢琴时练习跨八度指法练习, 长期使用对手指和手腕的健康不好. 如果你也有同样的感受, 可以使用如下配置将它改掉.

    1
    2
    3
    4
    # remap prefix from 'C-b' to 'C-a'
    unbind C-b
    set-option -g prefix C-a
    bind-key C-a send-prefix
  • 第二个需要修改的是水平窗口分割和垂直窗口分割, 则两个功能默认的快捷键是双引号和百分号, 我实在无法将双引号和百分号与水平和垂直联系起来, 当我在写这篇文章的时候我也区分不开到底是使用双引号还是百分号去做垂直分割, 虽然我已经使用了很多次了, 每次我都要瞄一眼文档, 或者错了再重试另一个. 但是请记住捣腾这些工具的目的, 就是追求效率, 所以对于我来说, 这两个常用功能的快捷键是一定要改掉的. 这里使用 ‘|’ 表示水平分割, ‘-‘ 表示垂直风格, 至于为什么选择这两个键, 我想不用做过多解释了, 它就像尖刀在屏幕上画了两这样两条线, 改完后还用记吗? 如果你比喜欢上面的方式, 如果你英文较好, 可以使用h代表horizontal水平的, v代表vertical垂直的, 也可以拼音h 横, c垂直, 这里尽量不用s, s表示session, 已经被占用了.

    1
    2
    3
    4
    5
    # split panes using | and -
    bind | split-window -h
    bind - split-window -v
    unbind '"'
    unbind %
  • 第三个需要修改的窗口切换快捷键
    默认的快捷键严重影响效率, 默认的快捷键是先按一下ctrl+b, 再按ctr加方向键, 窗口多了的情况下,也不用太多大于3个, 使用起来就特别别扭, 达不到所想即所得的效果, 当你的大脑在频繁的出错, 频繁ctrl+b ctrl+方向重试的过程中, 一定是很沮丧的. 对于一个对用户体验有要求的用户来说, 这种方式离开丝滑感觉相差太远了, 即使你使用tmux另一组快捷键,使用数字选择窗格, 也要去思考应该选第几个窗格, 也是对脑力的浪费. 这里我修改了配置使用alt+方向来切换窗格. 下面的M表示alt键. Left, Right, Up, Down为左右上下方向键.

    1
    2
    3
    4
    5
    # switch panes using Alt-arrow without prefix
    bind -n M-Left select-pane -L
    bind -n M-Right select-pane -R
    bind -n M-Up select-pane -U
    bind -n M-Down select-pane -D
  • 第四个要修改的是enable 鼠标功能, 默认鼠标的行为是被关闭的
    对于tmux 2.1 以上版本 只要一项配置就能enable所有的鼠标行为

    1
    2
    # Enable mouse mode (tmux 2.1 and above)
    set -g mouse on

    对于tmux 2.1以下版本还需要一项一项去配置

    1
    2
    3
    4
    # Enable mouse control (clickable windows, panes, resizable panes)
    set -g mouse-select-window on
    set -g mouse-select-pane on
    set -g mouse-resize-pane on
  • 第五 刷新配置
    刷新配置使用快捷键Ctrl + b : 然后在左下方文章会出现命令行输入框,输入命令 source-file ~/.tmux.conf
    如果你经常需要更新配置可以将其配置为快捷键, 这样以后你使用prefix键Ctrl+a r就可以更新配置了.

    1
    2
    # reload config file (change file location to your the tmux.conf you want to use)
    bind r source-file ~/.tmux.conf
  • 第六 为了方便拷贝, 我把以上说讲到的配置汇总在下方, 这样只要copy之后就能直接使用.
    文件名: ~/.tmux.conf
    内容:

    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
    # remap prefix from 'C-b' to 'C-a'
    unbind C-b
    set-option -g prefix C-a
    bind-key C-a send-prefix

    # split panes using | and -
    bind | split-window -h
    bind - split-window -v
    unbind '"'
    unbind %

    # switch panes using Alt-arrow without prefix
    bind -n M-Left select-pane -L
    bind -n M-Right select-pane -R
    bind -n M-Up select-pane -U
    bind -n M-Down select-pane -D

    # Enable mouse mode (tmux 2.1 and above)
    set -g mouse on
    # 复制模式下, 可以设置为vi或emacs快捷键
    # 也可以设置emacs 默认为emacs
    # 进入复制模式使用prefix [
    set -g mode-keys vi

    # Enable mouse control (clickable windows, panes, resizable panes)
    # set -g mouse-select-window on
    # set -g mouse-select-pane on
    # set -g mouse-resize-pane on

    # reload config file (change file location to your the tmux.conf you want to use)
    bind r source-file ~/.tmux.conf

11. tmux的复制粘贴

在 tmux 2.1 中,开启鼠标支持,在.tmux.conf中添加一行配置

1
2
#开启鼠标支持
set-option -g mouse on

复制 按住shift键,然后拖动鼠标复制要选择的内容,然后按下ctrl+shift+c,复制到系统剪贴板
粘贴 按下ctrl+shift+v 粘贴系统剪贴板中的内容到tmux中
需要注意的是
ctrl+shift+v是在终端设置的粘贴快捷键
ctrl+shift+c是在终端设置的复制快捷键
需要根据你的终端配置的复制粘贴快捷键来进行操作

11.1. 复制模式

复制模式步骤:
我的控制键为:C-b
1、 C-b [ 进入复制模式
2、 参考上表移动鼠标到要复制的区域,移动鼠标时可用vim的搜索功能”/“,”?”
3、 安空格键开始选择复制区域
4、 选择完成后安enter键退出
5、 C-b ] 粘贴

12. 设置打开终端即打开 tmux

创建init_tmux.sh,并在 ~/.bashrc 中调用该脚本就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# 检查tmux是否安装
if [ -z "$TMUX" ]; then
# 检查session 是否存在
tmux has-session -t session_name
# 如果不存在, 则创建session, 并初始化window, panes
if [ $? -ne 0 ]; then
tmux new-session -s session_name -n window_name -d
tmux send-keys -t session_name:0 "cd path_for_panel_0" C-m
# session_name:0.0 第一个0代表0号windown, 第二个0代表0号pane
# -h 水平分割 -p 40 分割屏幕的40%给新窗口
tmux split-window -h -p 40 -t session_name:0.0
# C-m 为ctrl + m 相当于敲下回车键
tmux send-keys -t session_name "cd path_for_panel_1" C-m
# session_name:0.1 0代表0号windown, 1代表1号pane
tmux split-window -v -t session_name:0.1
tmux send-keys -t session_name "cdphiloenglish && cd webapp" C-m

tmux select-window -t session_name:0
tmux select-pane -t session_name:0.1 -L
fi
tmux attach -t session_name
fi

13. 后记

本文原文位于鹏叔的技术博客 - Tmux使用说明, 获取最近更新, 请访问原文.

14. 参考文档

Tmux 使用教程

Tmux 配置:打造最适合自己的终端复用工具

Making tmux Pretty and Usable

tmux 帮助手册

使用tmux改进终端体验

tmux的复制粘贴