终端复用工具 Tmux

2,699 阅读8分钟

Tmux 是什么?

Tmux: Terminal MultipleXer(终端复用器)。那么问题来了,Tmux 提供什么功能,能够实现终端功能复用?

  • 终端会话管理
  • 终端窗口管理
  • Tmux窗口 Panel

为什么要用 Tmux ?

  • 以服务为核心,适用于远程 ssh 等服务
    • 防止终端崩溃
    • 远程配对
  • 多终端、多窗口支持
  • 与 vim 绝佳的配合
  • 想要将编辑器与终端分离
  • 终端重度依赖者

安装 Tmux

sudo apt-get install tmux # linux
brew install tmux # macOS
# window 使用: https://codeandkeep.com/Tmux-on-Windows/
# window 使用 mysys64 中 pacman 工具 安装 Tmux 然后配合 Git Bash 来使用(但是不能在window terminal )

Tmux 三层心智模型

  • Session层: tmux 会话。即服务(使用前,需要先创建 session)
  • window层: 在 session 基础上就创建不同的窗口(即 buffer )
  • Pane层: 在 window 的基础上,还可以将 window 切分,即 pane(pane 的创建不添加 buffer)

创建 session 可以理解一个"操作系统",

  • 使用 tmux 的时候要开机(即创建 session)
  • 要在"操作系统"中操作内容,就是需要一个窗口(window buffer)
  • 可以对window 进行分割,产生新的 pane

Tmux 的帮助命令

ctrl-b, ? # 获取 tmux 的帮助信息

控制 tmux 的方式

  • 快捷键 Keyboard shortcut
  • 命令 Command

快捷键前缀

  • ctrl + b 快捷键先导键(理解为:程序中命令空间,tmux 的命令都是从 )

修改快捷键前缀

vim ~/.tmux.conf # 编辑或者创建配置文件
set -g prefix C-a # 设置全局前缀是: Ctrl + a
unbind C-b # 解绑原来 Ctrl + b

终端会话管理

用户与计算机之间通过终端交互称之为 "会话(session)" ,但是会话随着终端的关闭而结束。有时候,使用时并不想它结束,只是想切到一个新窗口做一些其他的事情,为了满足这些需求,Tmux 这些能够实现多后台会话功能的终端复用器出现。

tmux info # 获取当前的会话信息

Tmux 会话-增/链/切/退/改/查

增加:命名会话

使用 new 命令与 -s 参数新建

#  new -s 配合
tmux new -s <name>

# new-session -t 配合
tmux new-session -t <name>

链接:已有会话(按编号、按名称)

tmux attach -t 0 # 进入编号 0 的 session
tmux attach -t <name> # 进入指定 name 的 session
  • 链接:所有会话
tmux a # 展示所有的 tmux session 列表

切换:已有会话(按编号、按名)

tmux switch -t 0
tmux switch -t <name>

退出(删除):会话

  • 使用快捷键:ctrl + d
  • 使用命令: exit

杀死:会话(按编号、按名)

依据会话编号删除:

tmux kill-session -t 0 # 按编号
tmux kill-session -t <name> # 按名字

杀死当前 session 快捷键

  • ctrl + b, x

分离(快捷键):会话(分离可以简单的理解为后台模式)

  • 使用快捷键:ctrl + b, d

分离(命令):会话

tmux detach # 分离

重命名(快捷键):已有会话

  • 快捷键: ctrl+b, $

重命名(命令):已有会话

tmux rename-session -t 0 <name>

查看:会话命令

tmux ls # 查看会话列表(简写)
tmux list-session #

查看(快捷键):会话

  • ctrl + b, s (一个可视化窗口)

修改(快捷键):重命名

  • ctrl + b, $ 修改创库

window 管理

创建 window 命令

tmux new-window

tmux new-window -n <window-name>
  • ctrl + b, c 创建一个新的 window

绑定新的快捷键:

unbind n  # 移除 n 绑定
unbind w  # 移除 w 绑定

ind n command-prompt "rename-window '%%'" # n 重命名 window
bind w new-window -c "#{pane_current_path}" # w 新建一个 windw

使用

切换 window

tmux select-window -t <window-number/window-name>
  • 切换(向上):ctrl + b,p
  • 切换(向下):ctrl + b,n
  • 切换(指定 number):ctrl + b,<number>

重命名 window

tmux rename-window <new-name>
  • 重命名:ctrl + b,,

选择 window

  • 列表 window:ctrl + b, w
  • 列表 sessions:ctrl + b, s
  • 列表 pane: ctrl + b, p

同 session 下的 window

在一个 session 下创建多个 pane。在一个 window 下使用创建 window的命令, 就会归属到同一个 session 下。

一个前端项目科室用一个 session 下三个 window 管理:

  • 一个服务 service window
  • 一个 git 提交 window
  • 一个 vim 编辑器

Panel 管理

创建 Panel

  • 水平 Panel
  • 垂直 Panel

tmux 命令

tmux split-window
tmux split-window -h

tmux 命令对应的快捷键

  • tmux split-window 等价于 ctrl + b, ";
  • tmux split-window -h 等价于 ctrl + b, %;

绑定新的快捷键

unbind v  # 解绑 v
unbind h #  解绑 h
unbind %  #解绑 %
unbind '"' # 解绑 "

bind v split-window -h -c "#{pane_current_path}" # 绑定 v: 当前 window 创建垂直 pane
bind h split-window -v -c "#{pane_current_path}" # 绑定 h: 当前 window 创建水平 pane

调节 Panel 大小

  • 使用快捷键调节 panel 的大小
// macOS
ctrl + b; option + ↑↓←→

// windows
ctrl + b; alt + ↑↓←→

即:键盘中 option 等价于 alt。

关闭(删除)Panel

  • 使用 exit 退出
  • 快捷键: Ctrl + x 关闭当前窗格

移动: select-pane

tmux 命令的方式:

tmux select-pane -U (Upper)

tmux select-pane -D (Down)

tmux select-pane -L (Left)

tmux select-pane -R (Right)

ctrl + b, <keyboard> 快捷键方式:

  • 按照方向进行切换:Ctrl + b, arrow
  • 切换到上一个Panel:Ctrl + b, ;;
  • 切换到下一个Panel:Ctrl + b, o;

Tmux 配置文件绑定 Vim 模式的快捷键

bind -n C-h select-pane -L
bind -n C-j select-pane -D
bind -n C-k select-pane -U
bind -n C-l select-pane -R

整体移动:

  • 整体前移:ctrl + b, ctrl + o;
  • 整体后移:ctrl + b, alt.+ o;

交换 swap-pane

tmux 命令的方式:

tmux swap-pane -U (Upper)
tmux swap-pane -D (Down)

ctrl + b, <keyboard> 快捷方式:

  • 与上交换:Ctrl + b, {
  • 与小交换:Ctrl + b, }

独立

  • 从 panel 独立出到 window:ctrl + b,!

全屏/退出 panel

  • ctrl + b, z

调整

  • ctrl + b, ctrl + <arrow key>
  • 开启鼠标模式,可使用鼠标

编号信息

  • ctrl + b, q

所有 tmux 命令

tmux list-commands

Tmux 模式

Tmux 与 Vim 一样,都有模式概念,Tmux 默认是默认模式

默认模式

默认是等效于 vim 的插入模式,它允许您在不同的文本框中键入所需的任何内容 panes

复制模式

配置复制模式使用 vim

set-window-option -g mode-keys vi

向使用 vim 一样使用 tmux 的复制模式

配置文件

查看更多的历史

set -g history-limit 100000

路径

vim ~/.tmux.conf

重载

tmux source-file ~/.tmux.conf

当修改配置文件之后,需要重新加载 Tmux,可设置快捷方式:

unbind r # 解绑 r 键
bind r source-file ~/.tmux.conf \; display "Reloaded ~/.tmux.conf" # 重绑定 r 键的功能

重新绑定快捷

unbind C-b # 解绑
set -g prefix C-a # 全局设置 prefix 快捷键

Tmux 工作流

Tmux 一般配合 Vim 无需鼠标的情况下进行终端进行操作。

以项目为基础的工作流

  • 项目名字为 session-name
  • 项目的 git 提交 window
  • 项目的 server 服务 window
  • 项目的 edit 编辑 window
    • 编辑 window 根据需要创建 pane
cd your-project-dir

tmux new-session -t your-project-name
tmux new-window -n git # 用于提交
tmux new-window -n server # 用于启动服务
tmux new-window -n edit # 配合 vim 编辑

在项目文件夹下,我们就创建一个简单的 Tmux session 开启服务,本质上使用的是切换 window 方式的工作流,核心工作之间不相互影响。

支持鼠标

虽然推荐终端无鼠标,但是 Tmux 也支持鼠标模式,鼠标模式主要是:

  • 选中
    • window
    • pane(调整大小)
  • 复制
    • 复制文本等操作
set -g mouse on # 开启 tmux mouse 功能

Tmux 的管理工具

Tmux session 管理工具

  • tmuxp (基于 python)

Tmux 插件管理

  • tpm Tmux 的插件管理工具

Tmux 插件

  • tmux-resurrect 永久保存 session 插件

tmuxn 一个 Tmux session 管理工具

tmux 管理 session 已经很方便了,但是我们想要有更加方便的管理方式 --- 配置式,根据项目配置一个 session 管理我们。

这么一个场景:如果你一个人在开发三个 React web 前端项目,每次关机之后可能需要打开三个项目,前后启动服务,每天都在赶干这些重复的事情。tmuxn 就是能够帮,从 session 中启动项目。本质其实很简单

  • 配置
  • 命令启动服务
npm -g i tmuxn

tmuxn -h

tmuxn 提供了如下的命令

  • tmuxn 使用项目名的命令:
tmuxn -c/--create your-project-name # 使用项目名字创建一个项目
tmuxn -s/--start your-project-name # 使用项目名字开始已经创建项目
tmuxn -k/--kill your-project-name # 使用项目名字杀死一个项目
tmuxn -d/--debug your-project-name # 使用调试
  • tmuxn 默认配置文件的位置: /Users/magnesium/.config/tmuxn
Created project file: /Users/xxx/.config/tmuxn/test.yml
  • 使用已有的 tmuxn 配置文件
tmuxn -p/--project <project_config>

tmux 配置文件

name:test
root: ~/

# 新建 windows
window:
    - editor: # window 名
        - pane: # editor window 中包含两个 pane
            - vim # 启动 vim
            - mongo # 启动 server
    - server: yarn start:dev  # 启动服务
    - git # 用于 git 条

tmuxp 管理 session/window/pane

tmuxp 是使用 python 开发的 tmux session管理工具,使用 yaml 书写配置文件

一个简单的 tmuxp 配置文件

session_name: your_sesssion_name
start_directory: your_project_path
windows:
-window_name: server
    panes:
        -shell_command:
            - yarn start
            - code your_project_path
-window_name:git

配置文件分析:

  • session_name:tmuxp 要创建的 tmux 的 session 名字
  • start_directory:session 启动的路径
  • windows:是当前 session 中的 window 的name 等信息
  • panes: 是当前 window 下所有 终端要干的事情。例如:
    • 启动一个前端 react 的服务
    • 需要启动 vscode
    • 其他

tmuxp 命令行

  • tmuxp load 读取 yaml 的配置文件,

参考

  1. Tmux 源码库
  2. Tmux 使用教程
  3. What's tmux and How to Configure It: a Detailed Guide
  4. Tmuxp 文档