You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
3.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 01 Windows 中文输入方案
## 结论(已拍板:方案 C)
主界面是 TUI。启动时检测终端:
- Windows Terminal / VS Code / Cursor 等可用宿主 → 进入自研 TUI
- 经典 cmd(conhost)→ **不进入 Textual**,打印如何用 WT 启动,并 **自动回退 REPL**
不把「在 cmd 里用 Textual 打中文」列为验收。TUI 在 WT 里若中文仍偶发失败,用 `/edit` 外开编辑器写长提示。
## 根因
你在 Qoze 的 cmd 里打不了中文,不是没设 UTF-8。
Textual 在 Windows 上走 `WindowsDriver`:`ReadConsoleInputW` + Raw VT + Kitty Keyboard Protocol(`\x1b[>1u`)。应用一旦 raw 读键,控制台宿主无法完成 IME 组字(拼音 → 汉字)。`PYTHONUTF8` 只影响 Python 输出编码,不修复组字。
Qoze 里 [utils/iterm_driver.py](D:\ideaProject\QozeCode-main\utils\iterm_driver.py) 用拦截 Kitty 协议修 iTerm 中文,但从未接到主程序;Windows 侧没有对应处理。安装脚本生成 `qoze.cmd`,更容易落到 conhost。
当前机器是 Windows 10 1903(build 18362)时,conhost / 早期 ConPTY 的 IME 更差。只在 README 写「请用 Windows Terminal」不够,必须启动时探测并降级。
```mermaid
flowchart TD
keyPress[按键] --> host{谁拥有输入}
host -->|熟模式 cooked REPL| ime[系统 IME 组字]
ime --> appStdin[应用读到完整汉字]
host -->|生模式 raw TUI| skipIme[应用直接吃按键]
skipIme --> fail[拼音散开或无法上屏]
```
## 业内对照(为何选 C)
| 方案 | 含义 | G-CODE |
|------|------|--------|
| A. 永远 REPL | 输入权归终端,cmd 也能打中文 | 仅作 conhost 回退,不是主界面 |
| B. `/edit` 外开编辑器 | 类似 git commit | TUI 下的第二兜底 |
| C. 检测终端再决定 | Claude Code / Gemini CLI 一类「请用 WT」的工程化 | **已选**:能开 TUI 就开,不能开就回退 |
| D. 自研 Windows Driver 关 Kitty | Qoze 的 iTerm 思路 | TUI 路径建议做,cmd 仍救不了 |
| E/F. Web 窗 / Win32 悬浮输入框 | 浏览器 IME 完美,或极重 | 不做 |
没有银弹。Cursor、Claude Code、Textual 系 TUI 在 Windows 中文输入上至今都有缺口。稳妥做法是:**不在不支持的宿主里硬开 raw TUI**。
## REPL 是什么
Read-Eval-Print Loop:读一行 → 执行 → 打印 → 再等下一行。不进全屏交替缓冲区,IME 归终端。G-CODE 里它不是产品脸,只是逃生口:
```text
gcode> 请总结 README
[think] ...
[tool] read_file README.md
[final] ...
```
主界面仍是 TUI:顶栏、消息气泡、思考区、工具状态、底部输入框。自己写 widget 与样式。
## 探测规则
允许 TUI(满足任一即可,实现时以代码为准并记日志):
- 环境变量 `WT_SESSION` 存在
- `TERM_PROGRAM` 为 `vscode` 等已知 PTY
- 父进程名为 `WindowsTerminal.exe`
否则视为 conhost:
1. 打印:当前是传统 CMD,中文输入在全屏界面不可用;请用 Windows Terminal 打开本目录后执行 `gcode`
2. 进入 REPL,功能可用(HITL 用 y/N 文本确认)
3. `gcode --ui tui` 在 conhost 上应失败并提示,禁止硬开
4. `gcode --ui repl` 任意终端都可强制熟模式
TUI 启动后仍建议拦截 / 关闭 Kitty 协议(`\x1b[>1u`),降低 WT 下 IME 失败概率。
## 验收
- 在 Windows Terminal 中:`gcode` 进入 TUI,能完成一轮「提问 → 工具 → 回复」
- 在经典 cmd 中:不进入 TUI;有引导文案;REPL 能打中文并完成同一轮任务
- `--ui tui` 在 cmd 中非零退出或明确拒绝,不黑屏假死
- `/edit` 能打开 `%EDITOR%` 或记事本,保存后把内容当作用户输入
- 不验收:cmd 内 Textual 输入框打中文