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 的配置文件,