TUI 全屏模式
niuma_code 的默认界面是基于 prompt_toolkit 的全屏终端 UI,专为长时间编码会话优化。输入框固定在底部——LLM 流式输出期间可随时追加新消息。
布局
┌──────────────────────────────────────────────┐
│ 输出区(可滚动) │
│ │
│ [对话消息 + Thinking 内容] │
│ │
├──────────────────────────────────────────────┤
│ [1/3] "当前消息" │ ← 队列条
│──────────────────────────────────────────────│
│ > 在此输入消息... │ ← 输入框
│──────────────────────────────────────────────│
│ [|] model · high ~1234 out / ~5678 in │ ← 状态栏
└──────────────────────────────────────────────┘
布局层次(从上到下):
- 输出区 — 自动滚动的对话显示区,支持 ANSI 彩色渲染
- 队列条 — 排队时显示
[N/M] "当前消息",空闲时显示──分隔线 - 输入框 — 单行输入,支持自动补全,长文本自动折行(最多 10 行)
- 分隔线 — 动态宽度分割线
- 状态栏 — 实时流式状态(spinner、token 计数、模型、推理级别)
9 个模态浮层
通过快捷键或命令访问:
| 快捷键 | 浮层 | 访问方式 | 用途 |
|---|---|---|---|
/model |
模型设置 | 仅命令 | 切换 Provider/模型/推理级别 |
Ctrl+Q |
消息队列 | 键盘 | 查看和调整待处理消息顺序 |
/context |
上下文切换 | 命令 | 多上下文管理 |
/messages |
对话管理 | 命令 | 查看、编辑、合并、收藏对话轮次 |
/ide |
IDE 草稿 | 命令 | 浏览和选择 Python 编排草稿 |
/tag |
标签管理 | 命令 | 管理自定义 #标签 |
/lang |
语言选择 | 命令 | 切换界面语言 |
| 自动 | 权限确认 | 自动触发 | 批准或拒绝工具执行 |
/ide new |
编辑器 | 命令 | 退出 TUI → 外部编辑器 → 返回 |
注意:
Ctrl+M不能打开模型设置。在 prompt_toolkit 中,Ctrl+M== Enter(都发送0x0d)。模型弹框只能通过/model命令打开。
模型设置 (/model)
三列导航:Provider → Model → Effort。
| 按键 | 操作 |
|---|---|
↑/↓ |
在列之间移动焦点 |
←/→ |
在当前列内切换值 |
Enter |
应用选择 |
Esc |
取消(恢复快照) |
消息队列 (Ctrl+Q)
| 按键 | 操作 |
|---|---|
↑/↓ |
选择消息 |
Shift+↑/↓ |
调整消息顺序 |
Delete |
删除选中消息 |
Esc |
关闭面板 |
上下文切换 (/context)
| 按键 | 操作 |
|---|---|
↑/↓ |
导航上下文 |
Enter |
切换到选中的上下文 |
Delete |
淘汰选中的上下文 |
Esc |
关闭面板 |
对话管理 (/messages)
完整的对话编辑功能,支持多选操作。
| 按键 | 操作 |
|---|---|
↑/↓ |
导航单元 |
Ctrl+↑/↓ |
扩展选区 |
Alt+↑/↓ |
移动单元位置 |
Delete 或 d |
删除选中 |
m |
合并选中(LLM 生成摘要) |
c |
清空所有 recall 注入 |
Enter |
收藏/取消收藏轮次 |
Ctrl+S |
保存更改到磁盘 |
Esc |
撤销更改 / 关闭 |
IDE 草稿 (/ide)
| 按键 | 操作 |
|---|---|
↑/↓ |
导航草稿 |
Enter |
在编辑器中打开选中的草稿 |
Delete 或 d |
删除草稿 |
Esc |
关闭面板 |
权限确认(自动)
当工具需要审批时,居中弹出确认框,提供 4 个选项:
| 按键 | 选项 |
|---|---|
1 或 ↑/↓ + Enter |
允许(仅本次) |
2 |
始终允许(本会话) |
3 |
始终允许(该工具类型) |
4 |
拒绝 |
快捷键
全局
| 快捷键 | 操作 |
|---|---|
Enter |
提交消息 |
Tab |
触发/接受自动补全 |
Ctrl+Enter |
插入换行(不提交) |
Esc |
取消当前生成 |
Ctrl+C |
复制选中文本(无选中时取消操作) |
Ctrl+D |
退出程序 |
Ctrl+R |
切换记忆召回开关 |
Ctrl+P |
复制最近 LLM 回复到剪贴板 |
Ctrl+I |
打开 IDE 模式 (/ide) |
Ctrl+G |
打开系统编辑器编辑输入 |
Ctrl+S |
保存对话(/messages 面板内) |
PageUp/PageDown |
输出区滚动 10 行 |
历史导航
| 按键 | 操作 |
|---|---|
↑ |
上一条输入(无浮层打开时) |
↓ |
下一条输入(无浮层打开时) |
输入框前缀
输入框根据状态显示不同前缀:
>— 普通模式🧠— 记忆召回已启用
自动补全系统
输入特定前缀触发上下文感知补全:
| 前缀 | 触发 | 示例 |
|---|---|---|
@ |
文件选择器(模糊搜索) | @app/main.py |
/ |
命令补全 | /model、/loop |
# |
自定义标签文本扩展 | #plan_mode、#skip_mode 或用户自定义标签 |
输入时自动出现补全列表。按 Tab 或 Enter 接受,继续输入可过滤。
鼠标支持
| 操作 | 行为 |
|---|---|
| 滚轮 | 浏览对话历史 |
Ctrl+滚轮 |
调整字体大小(Windows) |
| 左键拖拽 | 在输出区选择文本 |
| 左键释放 | 自动复制选中文本到剪贴板 |
| 右键单击 | 从剪贴板粘贴(或复制选中文本) |
输出区支持文本选择和滚动。选中的文本以醒目背景色高亮显示。
状态栏
状态栏在 LLM 生成期间实时渲染:
[|] model · high ~1234 out / ~5678 in
7 种状态
| 状态 | 显示 | 触发时机 |
|---|---|---|
| Idle | 最终统计或空 | 生成间隙 |
| Thinking | [spinner] 思考中... | model · effort |
等待首个 token |
| Generating | [spinner] ~N out / ~M in | model · effort |
流式生成内容 |
| ToolExecuting | [spinner] tool_name (phase) |
执行工具调用 |
| Compressing | [spinner] [==== ] 40% 压缩中 |
上下文压缩 |
| WaitingForCompression | [spinner] 等待压缩完成 |
异步压缩等待 |
| Error | Error: message(5 秒后自动清除) |
API/网络错误 |
活跃状态时 spinner 以 100ms 间隔循环 [|] [/] [-] [\]。
输入功能
命令
在输入框输入 / 查看可用命令:
/model 打开模型选择弹框
/context 多上下文切换(新建/重命名/淘汰)
/clear 清空对话历史
/compact 手动压缩上下文
/recall 开关记忆召回 [Ctrl+R]
/loop 标准工程化完成任务(规划→执行→验证→自纠)
/copy 复制回复到剪贴板 [Ctrl+P]
/ls 列出文件(支持模糊搜索)
/cat 读取文件内容
/edit 打开系统编辑器 [Ctrl+G]
/refactor 重构代码
/ide Python 编排运行模式 [Ctrl+I]
/new 开启新话题
/messages 对话管理
/star 收藏/取消收藏对话轮次
/tag 自定义 #标签管理
/brainstorming Brainstorming 设计技能
/planning Planning-with-files 规划技能
/help 显示帮助
/restart 重启服务
/quit /exit 退出程序 [Ctrl+D]
模型切换
使用 /model 命令打开 TUI 浮层或 CLI 列表进行模型选择:
/model → 打开模型选择浮层(TUI)或列出所有供应商(CLI)
输入 # 加标签名可触发文本扩展(非模型路由):
#plan_mode → 扩展 plan_mode 标签
#skip_mode → 扩展 skip_mode 标签
输出渲染管线
LLM 流 → _raw_buffer → Rich Console → StringIO → ANSI 解析 → FormattedText → 输出区
- ANSI 转义码解析为 prompt_toolkit FormattedText 元组,保留 Rich 颜色
- 终端 resize 触发动态分隔线宽度更新和输出重新折行
- 上下文切换时整体替换输出区内容(每上下文独立输出隔离)
无障碍
- 字体缩放:
Ctrl+鼠标滚轮调整字体大小 - 纯键盘操作:无需鼠标即可使用全部功能
- 高对比度:兼容大多数终端配色方案
- 宽屏自适应:响应式布局支持 200+ 列宽
- CJK 支持:正确计算双宽度字符