Scrollback TUI

dim 的交互式终端界面有两种形态:全屏(fullscreen)Scrollback。本页只讲 Scrollback 形态,全屏形态见 全屏 TUI

Scrollback 形态直接写在终端主屏上:对话像 git lognpm test 的输出一样一行行往下追加,翻上去的内容进入终端自己的 scrollback。历史归终端所有——滚动、搜索、选择、复制全部用你终端原本的键位,应用不接管。退出之后,整段对话仍然留在终端里。

代价是鼠标全程关闭(终端自滚和鼠标上报互斥),也没有主题切换(已经写进终端的行无法重绘)。

什么时候用它

你的场景 建议
想在跑完之后用 Cmd+F 搜索整段对话 Scrollback
想把某段输出拖选复制成纯文本 Scrollback
想让对话和 shell 命令混在同一份终端记录里 Scrollback
在 SSH / tmux 里工作 Scrollback
需要鼠标点击、换主题、居中浮层 全屏

两种形态共用同一套会话和配置,随时互切,不会丢会话。

启动

# 以 Scrollback 形态打开
dim tui --scrollback

# 打开并恢复指定会话
dim tui --scrollback --session <session-id>

没有设置过默认形态时,直接敲 dim 打开的就是 Scrollback。

设为默认形态

dim tui --scrollback default

只写配置、不打开界面,成功后输出 Default TUI form set to scrollback。之后直接敲 dim 就是 Scrollback。也可以在界面里改:/settings启动界面形态

运行中切换形态

输入 /tui 回车切到另一种形态,/tui --fullscreen/tui --scrollback 指定目标。切换不新建会话,正在跑的任务不中断。

首次进入新目录

第一次在某个目录里启动时会先问一次是否信任该目录——项目级的 .mcp.json 和 hooks 配置只有在信任之后才会加载。选择不信任则直接退出,不会启动会话。

界面结构

终端从上到下分成两部分:上面是已经写死的历史(归终端),下面是会随时重绘的交互区。

── 终端 scrollback:滚轮 / Cmd+F / 拖选复制都归终端 ──────────

  ┌────────────────────────────────────────────────────┐
  │   ▓▓▓▓                                             │
  │ ▓▓    ▓▓  Welcome to DIM!                          │
  │ ▓▓    ▓▓  Type / for commands · Ctrl+P for palette │
  │   ▓▓▓▓                                             │
  │                                                    │
  │  Workspace   ~/repo                                │
  │  Git branch  main                                  │
  └────────────────────────────────────────────────────┘

  › 帮我修这个测试

  ◆ 先看失败原因。
  ● Read src/app.test.ts
  ● Bash npm test -- --filter app
  ✕ Edit src/app.ts  +1 -1

── 以下是会随时重绘的交互区 ──────────────────────────────

  ∴ 正在检查测试输出…                        ← 实时区
  · Bash npm test  4s
  ⣾ working  4s
  ┌─────────────────────────────────────────┐
  │ › Ask anything...                       │  ← 输入框
  └─────────────────────────────────────────┘
  esc interrupt       ctx 42.0K (33%)  model   ← 状态行

启动时会先写一块配置摘要:工作目录、Git 分支、当前模型、审批模式,以及一行"你这个终端怎么翻历史"的提示。它是一次性的快照,之后改设置不会回写。

读懂输出

每个块的行首有 2 格 gutter,用符号区分类型;块内所有行都缩进到 gutter 右边,方便整段拖选复制。

符号 含义
你发出的消息(整条带底色,标记新一轮的开始)
模型回复
thinking
工具执行完成
工具执行失败
子代理 / 后台任务通知(以 bg · 开头)
错误
状态、压缩、中断、审批结果等系统提示

工具块只展示摘要,不铺整段输出:

● Bash npm test
● Grep "ProviderManager"  12 matches
● Edit src/app.ts  +2 -1
   12 - const a = 1
   12 + const a = 2
● Write src/new.ts (120 lines)

模型看到的是工具的完整结果,你在终端里看到的是摘要——这是刻意的取舍,避免几千行输出淹没对话。

代码块保留原始的 ``` 围栏并做语法高亮,除了统一的 2 格缩进不加任何装饰前缀;拖选复制出来只需要去掉这 2 格。

翻历史、搜索、复制

这些操作由你的终端提供,键位因终端而异:

终端 翻页滚动 搜索 复制选区
macOS Terminal / iTerm2 Cmd+PageUp 或滚轮 Cmd+F 拖选 / Cmd+C
kitty / Ghostty / WezTerm / Alacritty Shift+PageUp 或滚轮 终端自带的分页器搜索 拖选 / Ctrl+Shift+C
Linux(GNOME / Konsole) Shift+PageUp Ctrl+Shift+F Ctrl+Shift+C
Windows Terminal Ctrl+Shift+PageUp Ctrl+Shift+F 拖选 / Ctrl+Shift+C
tmux 内 prefix+[ 进 copy-mode copy-mode / copy-mode SpaceEnter

回到顶部 / 底部:macOS 上是 Cmd+Home / Cmd+End,多数终端是 Shift+Home / Shift+End,Windows Terminal 是 Ctrl+Shift+Home / Ctrl+Shift+End,tmux copy-mode 里是 g / G

不用记:启动摘要里会写一行你当前终端的速查,随时输入 /keys 还能把完整键位表打进 scrollback,之后用终端搜索就能翻回来。

输入框

输入框固定在文档尾部,内容 1 到 7 行自动增高。

操作 按键
发送 Enter
换行 Shift+Enter;终端不支持时用 Ctrl+J
切换 AGENT / PLAN 模式 Tab
翻输入历史(单行状态下) Up / Down
打开命令面板 /Ctrl+P
引用技能 $
引用文件或目录 @ 或直接输入路径,Tab 补目录
粘贴剪贴板图片 Ctrl+V
清空草稿 Esc(空闲且无面板时)

粘贴长文本、文件路径、图片都会折叠成一个高亮 token,删掉 token 即移除附件。输入历史按目录分桶保存。

面板

Scrollback 没有居中浮层:所有面板都在输入框下方展开,同宽、同左缘,同一时刻只有一个。

 ┌─────────────────────────────────────────────┐
 │ ›                                           │
 └─────────────────────────────────────────────┘
 ┌ Sessions ─────────────────────── esc close ┐
 │ filter: fix_                                │
 │ › fix test flake              10m ago       │
 │   composer refactor           2h ago        │
 │   1-2 / 23 · enter open · ^R refresh        │
 └─────────────────────────────────────────────┘
 esc interrupt              ctx 42.0K (33%)  model
面板类型 操作
列表 打字过滤,Up/DownHome/EndPageUp/PageDown 移动,Enter 激活,Esc 先清过滤词再关闭
表单 Tab/Shift+Tab 切控件,Left/Right 切分段选项,Space 开关,Enter 执行,Esc 退一步
补全(/$、路径) 保持输入框可编辑,打字即过滤,输入空格就自动关闭

每个面板底部都有一行 hint 写着当前可用的键,不需要背。

命令

命令与全屏形态基本一致,另外多两个本形态专属的:

命令 作用
/keys 把完整键位表(应用键位 + 你这个终端的原生键位)写进 scrollback
/queue 查看和管理运行中排队的消息

以下命令在本形态不提供

命令 原因
/theme 已经写进终端的行无法重绘,换主题只会让历史与新内容颜色不一致
/effort 推理档位已经能在 /models 面板里用 Left/Right 直接调

其余常用命令:/new/resume/connect/models/approvals/settings/mcp/plugins/skills/timeline/compact/export/language/debug/tui/exit

/resume 只列出当前目录的会话;要打开别的目录的会话,先 cd 过去再启动 CLI。

/models 面板里,Left/Right 调整光标所在行的 thinking 等级,改完立即保存;Enter 只负责选中模型并关闭面板。

运行中

发送后,输入框上方出现实时区:thinking 与回复的稳定行会持续追加进终端历史,只留最后一行在实时区;下面逐条列出正在跑的工具和耗时。

 ∴ thinking 当前未完成的一行…
 回复当前未完成的一行…
 · Bash npm test  4s
 ┌─ 队列(2) ────────────────────────┐
 │ › 然后跑一下 lint                  │
 │ › 顺便更新一下文档                 │
 │ ↑ 编辑 · ctrl+s 立即 steer · /queue │
 └────────────────────────────────────┘
 ⣾ working  4s
想做的事 怎么做
打断当前这轮 Esc
运行中继续输入 直接打字,Enter 提交后进队列
编辑最后一条排队消息 输入框为空时按
让最早一条排队消息立刻进入本轮 Ctrl+S
管理队列(删除、逐条 steer) /queue
看后台任务 / 子代理 Ctrl+O

状态行常驻一行,左边是模式标签、审批模式、运行状态和分支,右边是上下文用量和当前模型:

 AGENT  ⏵⏵ default  :main              ctx 42.0K (33%)  gpt-5.2

审批标签用颜色区分让出了多少权限:default 灰、approve for me 黄、full access 红。

审批与提问

审批面板同样在输入框下方展开:

 ┌ Permission required ────────────────────────┐
 │ Bash: rm -rf node_modules                   │
 │ [Allow once]  Allow always  Reject          │
 │ y allow · n reject · ←→ move · enter confirm│
 └─────────────────────────────────────────────┘

Y 允许一次,N 拒绝,Left/Right/Tab 移焦,Enter 确认。决议会以 块写进 scrollback,所以整份终端记录就是完整的决策留痕。

模型提问(AskUser)时,Up/Down 移动选项,19 直接选第 N 项,Space 勾选,Enter 前进到下一题,Tab/Left/Right 在题目之间切换,最后在 Confirm 页提交;Esc 取消整轮提问。

快捷键总表

Scrollback 只用 Ctrl 系和无修饰键,不用 Cmd / Alt——那些键会被终端自己截获。

按键 作用
Enter 发送
Shift+Enter / Ctrl+J 换行
Tab 切换 AGENT / PLAN
Ctrl+P 命令面板(任何面板下都能用)
Ctrl+O 后台任务面板
Ctrl+T 时间线 / 消息选择
Ctrl+N 新会话
Ctrl+V 粘贴剪贴板图片
Ctrl+R 会话 / 技能面板里刷新
Ctrl+D 会话 / 技能面板里删除
F2 会话面板里重命名
Esc 面板:先清过滤词再关闭;运行中:打断;空闲:清空草稿
Ctrl+C 第一次关面板 / 清草稿 / 打断;第二次退出

事件按 退出确认 → 审批提问 → 面板 → 输入框 的顺序分派,上层处理过的按键不会再传到下层。

退出

Ctrl+C 按两次,或输入 /exit。有任务在跑时会先弹确认,Enter / Y 强退,Esc / N 留下。

退出后整段对话仍然留在终端里,可以继续滚动、搜索和复制。

常见问题

滚上去以后新内容看不见了。 终端停在你滚到的位置。按终端的"回到底部"键(多数终端直接敲一个键或滚到底即可)。

resize 之后旧内容排版乱了。 已经写进终端的行不会重排——各终端的硬换行行为不一致,重排反而会破坏复制。新内容按新宽度渲染。

恢复会话后看不到很早以前的消息。 恢复时只重放最近一页(最多 100 条),更早的历史无法往上插入,边界处会有一行明确标注。要翻更早的内容用 /timeline

白底终端里字看不清。 启动时会探测一次终端底色并选择深色或浅色配色。如果探测不准,换用全屏形态并用 /theme 选主题。

鼠标点不动。 本形态鼠标全程关闭,这是终端原生滚动能工作的前提。所有操作都有键盘路径,/keys 可以查。