# GNU Screen 快速参考

*会话、窗口、分屏、复制模式与共享*

> Source: GNU Screen Manual (gnu.org/software/screen) · MIT

## 会话管理

### 创建与列出会话

```
screen                        # new unnamed session
screen -S work                # new session named "work"
screen -ls                    # list all sessions
screen -list                  # same as -ls
```

### 会话命令

| Command | Description |
|---------|-------------|
| `screen -S name` | 创建新命名会话 |
| `screen -r name` | 重新连接到已分离的会话 |
| `screen -x name` | 连接到已被连接的会话（共享） |
| `screen -d name` | 远程分离会话 |
| `screen -d -r name` | 在其他地方分离，在此处重新连接 |
| `screen -D -RR` | 强制分离并重新连接（激进模式） |
| `screen -ls` | 列出所有会话及其 PID |
| `screen -wipe` | 清理死亡会话 |

## 窗口

### 窗口基础

| Command | Description |
|---------|-------------|
| `Ctrl-a c` | 创建新窗口 |
| `Ctrl-a n` | 下一个窗口 |
| `Ctrl-a p` | 上一个窗口 |
| `Ctrl-a 0-9` | 按编号切换窗口 |
| `Ctrl-a "` | 列出所有窗口（交互式） |
| `Ctrl-a '` | 按名称/编号切换窗口 |
| `Ctrl-a A` | 重命名当前窗口 |
| `Ctrl-a k` | 关闭当前窗口 |

### 窗口管理

| Command | Description |
|---------|-------------|
| `Ctrl-a w` | 在状态栏显示窗口列表 |
| `Ctrl-a Ctrl-a` | 在最近两个窗口间切换 |
| `Ctrl-a N` | 显示窗口编号和名称 |
| `exit / Ctrl-d` | 关闭窗口（退出 shell） |

## 分屏与区域

### 分屏命令

| Command | Description |
|---------|-------------|
| `Ctrl-a S` | 水平分屏（上下） |
| `Ctrl-a \|` | 垂直分屏（左右） |
| `Ctrl-a Tab` | 将焦点移到下一个区域 |
| `Ctrl-a X` | 关闭当前区域 |
| `Ctrl-a Q` | 关闭除当前区域外的所有区域 |

### 区域工作流

```
Ctrl-a S             # split horizontal
Ctrl-a Tab           # move to new region
Ctrl-a c             # create window in region
Ctrl-a :resize 20   # set region to 20 lines
```

## 复制模式

### 回滚与复制

| Command | Description |
|---------|-------------|
| `Ctrl-a [` | 进入复制/回滚模式 |
| `Space` | 开始/结束选择（在复制模式中） |
| `Enter` | 复制选择内容并退出复制模式 |
| `Ctrl-a ]` | 粘贴已复制的文本 |
| `h/j/k/l` | 移动光标（复制模式中的 vi 按键） |
| `Ctrl-u / Ctrl-d` | 向上/向下滚动半页 |
| `/ or ?` | 向前/向后搜索 |
| `Esc` | 退出复制模式 |

### 复制工作流

```
Ctrl-a [         # enter copy mode
Space            # mark start (navigate first)
Space            # mark end + copy (navigate first)
Ctrl-a ]         # paste into current window
```

## 分离与重新连接

### 分离

| Command | Description |
|---------|-------------|
| `Ctrl-a d` | 分离当前会话 |
| `Ctrl-a D D` | 分离并注销 |
| `Ctrl-a z` | 挂起 screen（类似 Ctrl-Z） |
| `screen -d PID` | 远程按 PID 分离会话 |

### 重新连接

```
screen -r                 # reattach (if only one session)
screen -r work            # reattach by name
screen -r 12345           # reattach by PID
screen -d -r work         # steal session from other terminal
```

### 持久化工作流

```
# Start long-running task, detach, reconnect later
screen -S build
make -j4 all        # start build
Ctrl-a d             # detach, go home
screen -r build      # reattach later
```

## 共享

### 多用户模式

```
# Host enables multiuser
Ctrl-a :multiuser on
Ctrl-a :acladd alice    # grant access to user alice
# Alice attaches
screen -x hostuser/sessionname
```

### 访问控制

| Command | Description |
|---------|-------------|
| `:multiuser on` | 启用多用户模式 |
| `:acladd user` | 授予用户完全访问权限 |
| `:aclchg user -w '#'` | 将用户设为只读（所有窗口） |
| `:acldel user` | 移除用户访问权限 |
| `screen -x user/sess` | 连接到共享会话 |

## 配置

### ~/.screenrc 要点

```
startup_message off          # skip splash screen
defscrollback 10000          # scrollback buffer lines
hardstatus alwayslastline
hardstatus string '%{gk}%H %{wk}%?%-Lw%?%{bw}%n*%f %t%{wk}%?%+Lw%?'
shell -$SHELL                # use login shell
```

### 常用设置

| Command | Description |
|---------|-------------|
| `startup_message off` | 抑制启动消息 |
| `defscrollback N` | 设置回滚缓冲区（默认 100） |
| `escape ^Bb` | 将前缀键改为 Ctrl-b |
| `shelltitle '$ \|bash'` | 自动设置窗口标题 |
| `caption always '%n %t'` | 始终显示含窗口信息的标题栏 |
| `autodetach on` | 挂断时自动分离（默认开启） |
| `vbell on` | 使用视觉铃声代替声音铃声 |

## 常用模式

### 开发环境配置

```
# Auto-create windows in .screenrc
screen -t editor 0 vim
screen -t server 1 python -m http.server
screen -t shell  2 bash
select 0                     # start on editor window
```

### 日志与监控

```
Ctrl-a H                     # toggle logging to screenlog.N
Ctrl-a M                     # monitor window for activity
Ctrl-a _                     # monitor window for silence
```

### 快速参考

| Command | Description |
|---------|-------------|
| `Ctrl-a ?` | 显示所有键绑定 |
| `Ctrl-a :help` | 内置帮助 |
| `Ctrl-a :source file` | 加载配置文件 |
| `Ctrl-a :screen cmd` | 在新窗口中运行命令 |
| `Ctrl-a :quit` | 关闭所有窗口并退出会话 |
