阅读 1025

终端复用工具 Tmux

Tmux 是什么?

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

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

为什么要用 Tmux ?

  • 以服务为核心,适用于远程 ssh 等服务
    • 防止终端崩溃
    • 远程配对
  • 多终端、多窗口支持
  • 与 vim 绝佳的配合

安装 Tmux

# linux
sudo apt-get install tmux

# macOS
brew install tmux

# window 使用: https://codeandkeep.com/Tmux-on-Windows/

# window 使用 mysys64 中 pacman 工具 安装 Tmux 然后配合 Git Bash 来使用(但是不能在window terminal )
复制代码

Tmux 三层心智模型

  • Session层: 服务是基础
  • window层: 是运行在 Session 的概念
  • Pane层: 是运行在 window 上的概念

Tmux 的帮助命令

ctrl-b, ?
···

## 通用快捷键前缀

tmux 含有两套方式操作 tmux 窗口,Panel,一种是 tmux 命令,另一种是 tmux 命令对应的快捷键。通过 `tmux list-keys` 打印所有的快捷键,机器对应的快捷键信息。

- `ctrl + b`

tmux 可用通过 tmux 命令,和 `ctrl + b, <other>` 两种方式通过 tmux 操作终端。

### 修改前缀

```sh
vim ~/.tmux.conf # 编辑或者创建配置文件

set -g prefix C-a # 设置全局前缀是: Ctrl + a
unbind C-b # 解绑原来 Ctrl + b
复制代码

终端会话

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

tmux info # 获取当前的会话信息
复制代码

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

增加:默认会话

tmux # 添加默认会话
复制代码

增加:命名会话

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

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

# new-session -t 配合
tmux new-session -t <name>
复制代码

链接:已有会话

  • 按编号
  • 按名称
tmux attach -t 0
tmux attach -t <name>
复制代码
  • 链接最近使用的 session
tmux a
复制代码

切换:已有会话

  • 按编号
  • 按名
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

更改:已有会话

  • tmux 命令
  • 快捷键: ctrl+b, $
tmux rename-session -t 0 <name>
复制代码

查看:会话

  • tmux 命令
  • 使用快捷键
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 文档
文章分类
开发工具
文章标签