# 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 输入框打中文