# Linux-tmux把所有操作终端塞进一个远程ssh！
<!--more-->
# Linux-tmux

## TL;DR：高频命令速查

> 在执行任何快捷键之前，必须先按下 前缀键（默认是 `<C-b>` Ctrl+b键）  
> 在使用过程中如果不知道现在要怎么操做，直接敲`<C-b> ?`查看快捷键

### 会话层 - 项目级隔离

创建会话

```shell
tmux new -s <name>
```

进入会话（不指定t默认使用序号创建）

```shell
tmux a -t <name>
```

列出会话

```shell
tmux ls
```

删除会话 (不指定 `-t` 则删除当前会话)

```shell
tmux kill-session -t <name>
```

**会话层快捷键：**

| 操作               | 快捷键       |
| :--------------- | :-------- |
| **脱离会话** (挂起至后台) | `<C-b> d` |

### 窗口层 - 任务标签页

CLI 创建窗口

```shell
tmux new-window -n <name>
```

**窗口层快捷键：**

| 操作 | 快捷键 |
| :--- | :--- |
| **新建窗口** | `<C-b> c` |
| **下 / 上一个窗口** | `<C-b> n / p` |
| **跳转窗口** | `<C-b> 0-9` |
| **重命名窗口** | `<C-b> ,` |
| **关闭窗口** | `<C-b> &` |

### 窗格层 - 一 屏 多 用

**窗格层快捷键：**

| 操作                     | 快捷键             |
| :--------------------- | :-------------- |
| **垂直分割** (左右分屏)        | `<C-b> %`       |
| **水平分割** (上下分屏)        | `<C-b> "`       |
| **切换窗格**               | `<C-b> 方向键`     |
| **全屏切换** (放大 / 缩小当前窗格) | `<C-b> z`       |
| **调整大小**               | `<C-b> <C-方向键>` |
| **关闭窗格**               | `<C-b> x`       |

### 守护进程 (Server)

启动守护进程

```shell
tmux start-server
```

停止所有会话

```shell
tmux kill-server
```

指定 socket

```shell
tmux -L <socket>
```

指定 socket 路径

```shell
tmux -S /path/to/socket
```

强制终止进程

```shell
pkill -f tmux
```

---
## Welcome to tmux!

>tmux 是终端多路复用器。它可以让您轻松地在一个终端中的多个程序之间切换、分离它们（它们在后台继续运行）并将它们重新连接到不同的终端。


<span style="cursor: help;" title="这不纯牛马吗"><b>幕后：tmux 守护进程</b></span>

>不要把 tmux 当成普通的命令，它的本质是一个常驻后台的服务

- **悄悄打工**： 当你敲下第一句 tmux 时，它就会在后台默默启动，接管你的终端。
- **断线保命**： 突然断网了？别慌。它的后台仍在运行，随时等你回来“认领”工作现场。（前提是服务器没重启、tmux 进程没被杀掉）。
- **功成身退**： 当你手动关闭了它里面所有的会话和窗口后，它就会自动销毁，绝不偷偷占用内存。

<details>
  <summary style="cursor: pointer; color: #888;">评价一下</summary>
  纯牛马<br>
  自己来，自己走，中间还无条件给你后台保底
</details>

### 会话、窗口和窗格

- 窗格：tmux里，每个窗格都是一个终端
- 窗口：当前的显示界面，可以由多个窗格组成，同时可以给窗口一个名字
- 会话：由多个窗口组成，一般一个会话用于一个项目

![](images/file-20260319180845088.png)

---
## 滚动与复制

由于默认配置下的tmux接管了终端，无法使用`<S-PgUp>`进行屏幕滚动，那么我们需要进入tmux自己的滚动与复制逻辑邻域了……（虽然我感觉这有点难用）

**tmux正常的复制流程如下：**

| 阶段    | 步骤说明          | 快捷键           |
| :---- | :------------ | :------------ |
| 1. 进入 | 冻结屏幕，开启翻页模式   | `<C-b> [`     |
| 2. 浏览 | 上下翻找历史日志/报错信息 | 方向键 或 PgUp/Dn |
| 3. 选中 | 在目标起点开启选择     | `<C-Space>`   |
| 4. 复制 | 覆盖目标文本后确认并退出  | `<Enter>`     |
| 5. 粘贴 | 在命令行甩出内容      | `<C-b> ]`     |
| 取消    | 随时放弃操作并返回实时终端 | `q`           |

**同时这里有一个大坑，`C-Space` 会出现快捷键冲突，导致无法进入复制模式！！！！**

我这里准备了几个方法：
1. 添加配置，添加`set -g mouse on`到`~/.tmux.conf`里，让鼠标可以在tmux使用，但是可能会遇到一些异常情况
2. 添加配置，添加`set -w -g mode-keys vi`到`~/.tmux.conf`,使用vi的键盘操作方式进行复制。`只需要学会hjklvyq就学会vi了(bushi`
还有其他比较复杂的方式就不例举出来了

---
## 会话之外 - 一些杂项操作

### ~/.tmux.conf 配置

可以将以下配置加入到`~/.tmux.conf` 配置最下面，优化使用体验

```Shell
# --- 交互基础：开启鼠标支持（支持滚轮翻页、点击换窗口、拖拽改分屏） ---
set -g mouse on

# --- 复制模式：使用 vi 按键绑定（进入 <C-b> [ 后可用 h/j/k/l 移动） ---
set -w -g mode-keys vi

# --- 命令行模式：在 tmux 的命令提示符下（<C-b> :）使用 vi 按键 ---
set -g status-keys vi

# --- 编号习惯：窗口编号从 1 开始（键盘上 1 在左边，0 太远了） ---
set -g base-index 1

# --- 编号习惯：窗格编号也从 1 开始 ---
set -g pane-base-index 1

# --- 进阶补充 1：环境对齐（让终端颜色和 Vim 保持一致，告别灰蒙蒙） ---
set -g default-terminal "screen-256color"

# --- 进阶补充 2：自动重编号（关闭中间的窗口后，后面的窗口自动顶上来） ---
set -g renumber-windows on

# --- 进阶补充 3：焦点监控（让 Vim 知道你切走了，触发自动保存/插件刷新） ---
set -g focus-events on
```

复杂内容以后再来探索吧（
## 参考

- [tmux官方文档](https://github.com/tmux/tmux/wiki)
- [封面](https://www.mylittlewallpaper.com/c/vocaloid/download/61842bd2854237.35654847)