# tmux 快速参考

*会话、窗口、面板、复制模式、配置*

> Source: tmux Documentation (github.com/tmux/tmux) · MIT

## 会话管理

### 创建与连接

```
tmux                        # new session
tmux new -s work            # new named session
tmux attach -t work         # attach to session
tmux attach -dt work        # detach others, attach
```

### 会话命令

| Command | Description |
|---------|-------------|
| `tmux ls` | 列出所有会话 |
| `tmux kill-session -t work` | 终止指定会话 |
| `tmux kill-server` | 终止 tmux 服务器及所有会话 |
| `tmux rename-session -t old new` | 重命名会话 |
| `Prefix d` | 从当前会话断开 |
| `Prefix $` | 重命名当前会话 |
| `Prefix s` | 列出会话（交互式） |

*默认前缀键为 Ctrl-b*

## 窗口

### 窗口快捷键

| Command | Description |
|---------|-------------|
| `Prefix c` | 创建新窗口 |
| `Prefix ,` | 重命名当前窗口 |
| `Prefix &` | 关闭当前窗口（需确认） |
| `Prefix n` | 切换到下一个窗口 |
| `Prefix p` | 切换到上一个窗口 |
| `Prefix 0-9` | 按编号切换窗口 |
| `Prefix w` | 列出窗口（交互式选择） |
| `Prefix l` | 切换到上次活跃窗口 |

### 窗口命令

```
tmux new-window -t work     # new window in session
tmux swap-window -t 0       # move window to index 0
tmux move-window -t 3       # renumber to index 3
```

## 面板

### 分割与关闭

| Command | Description |
|---------|-------------|
| `Prefix %` | 水平分割（左 \| 右） |
| `Prefix "` | 垂直分割（上 / 下） |
| `Prefix x` | 关闭当前面板（需确认） |
| `Prefix !` | 将面板拆分为独立窗口 |
| `Prefix z` | 切换面板全屏（zoom） |

### 调整面板大小

| Command | Description |
|---------|-------------|
| `Prefix Ctrl-Arrow` | 调整 1 格 |
| `Prefix Alt-Arrow` | 调整 5 格 |
| `Prefix Space` | 循环切换布局 |

*布局：even-horizontal、even-vertical、main-horizontal、main-vertical、tiled*

## 导航

### 在面板间移动

| Command | Description |
|---------|-------------|
| `Prefix Arrow` | 移动到指定方向的面板 |
| `Prefix o` | 循环切换到下一个面板 |
| `Prefix q` | 显示面板编号，按编号跳转 |
| `Prefix {` | 与上一个面板交换 |
| `Prefix }` | 与下一个面板交换 |

### 在会话间移动

| Command | Description |
|---------|-------------|
| `Prefix (` | 切换到上一个会话 |
| `Prefix )` | 切换到下一个会话 |
| `Prefix s` | 会话选择器（树形视图） |
| `Prefix w` | 跨所有会话的窗口选择器 |

## 复制模式

### 进入与导航

| Command | Description |
|---------|-------------|
| `Prefix [` | 进入复制模式 |
| `q` | 退出复制模式 |
| `Arrow / hjkl` | 移动光标（vi 模式） |
| `Ctrl-u / Ctrl-d` | 向上/向下翻页 |
| `g / G` | 跳到顶部/底部 |
| `/` | 向前搜索 |
| `?` | 向后搜索 |
| `n / N` | 下一个/上一个匹配 |

### 选择与复制

| Command | Description |
|---------|-------------|
| `Space` | 开始选择（vi 模式） |
| `Enter` | 复制选择并退出 |
| `Prefix ]` | 粘贴缓冲区 |
| `v` | 切换矩形选择（vi 模式） |

*启用 vi 模式：set -g mode-keys vi*

## 配置

### 常用设置（~/.tmux.conf）

```
set -g mouse on                 # enable mouse
set -g base-index 1             # windows start at 1
set -g renumber-windows on      # renumber on close
set -g default-terminal "tmux-256color"
set -g history-limit 50000
```

### 重载配置

```
tmux source-file ~/.tmux.conf   # from shell
# or Prefix : then type:
source-file ~/.tmux.conf
```

## 状态栏

### 状态栏选项

```
set -g status-position top
set -g status-style "bg=black,fg=white"
set -g status-left "[#S] "
set -g status-right "%H:%M %d-%b"
set -g status-interval 5
```

### 格式变量

| Command | Description |
|---------|-------------|
| `#S` | 会话名称 |
| `#I` | 窗口编号 |
| `#W` | 窗口名称 |
| `#P` | 面板编号 |
| `#H` | 主机名 |
| `#T` | 面板标题 |

## 快捷键绑定

### 自定义绑定

```
# change prefix to Ctrl-a
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# vim-style pane navigation
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
```

### 绑定语法

| Command | Description |
|---------|-------------|
| `bind X command` | 将 Prefix + X 绑定到命令 |
| `bind -n M-Left prev` | 无前缀绑定（Alt-Left） |
| `bind -r H resize-pane -L 5` | 可重复触发的绑定 |
| `unbind X` | 移除绑定 |
| `Prefix ?` | 列出所有当前快捷键绑定 |

## 脚本化

### 脚本布局

```
tmux new-session -d -s dev
tmux send-keys -t dev "vim" Enter
tmux split-window -h -t dev
tmux send-keys -t dev "npm run dev" Enter
tmux attach -t dev
```

### 常用命令

| Command | Description |
|---------|-------------|
| `tmux send-keys -t sess 'cmd' Enter` | 向会话发送按键 |
| `tmux capture-pane -p` | 将面板内容打印到 stdout |
| `tmux display-message '#S'` | 显示消息/变量 |
| `tmux set-environment -g VAR val` | 设置环境变量 |
| `tmux list-keys` | 列出所有快捷键绑定 |

## 常用模式

### 推荐 ~/.tmux.conf

```
set -g mouse on
set -g base-index 1
set -g mode-keys vi
set -g status-position top
set -g history-limit 50000
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
```

### 实用技巧

| Command | Description |
|---------|-------------|
| `SSH 断线保持` | `tmux new -s work` → 断开 → `tmux attach -t work` |
| `共享会话` | 双方都执行 `tmux attach -t same`（只读加 `-r`） |
| `保存滚动历史` | `tmux capture-pane -S -3000 -p > log.txt` |
| `终止卡死面板` | Prefix x，或 `tmux kill-pane -t %N` |
| `重排窗口顺序` | `:swap-window -s 3 -t 1` |
