From 400f2ad9a5e4e14f8089b2d273ea33bcf8ef123b Mon Sep 17 00:00:00 2001 From: Shuery <2463253700@qq.com> Date: Sun, 27 Sep 2026 22:25:39 +0800 Subject: [PATCH] =?UTF-8?q?docs(probe):=20=E7=BB=99=20TUI=20=E9=80=89?= =?UTF-8?q?=E5=9E=8B=E6=8E=A2=E9=92=88=E5=8A=A0=E7=B4=A2=E5=BC=95=EF=BC=88?= =?UTF-8?q?=E5=AE=83=E4=BB=AC=E8=AF=81=E6=98=8E=E4=BA=86=E4=BB=80=E4=B9=88?= =?UTF-8?q?=E3=80=81=E7=BB=93=E8=AE=BA=E8=90=BD=E5=9C=A8=E5=93=AA=E6=9D=A1?= =?UTF-8?q?=20ADR=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 探针保留作实测证据:ADR-0010~0013 的结论与数字在正文里,这些脚本是能复现它们的东西 —— 将来想确认"某个库现在还能不能用",重跑对应探针即可,不必重新摸索。 索引按探针标注了来源与结论去向,并写明重跑注意:多数探针需要真终端(重定向下会走退化分支);load-probe 与 settle-probe 依赖已删除的 _probe/load 与 _probe/nuget(当时一次 git add 误把从 NuGet 拉的包扫进提交,已删除并 gitignore),重跑前要先自己拉包;其余可直接跑。 同时说明这些是一次性脚本:不参与构建、不受 test.ps1 的 Encode/Parse 层管辖;真正的 TUI 实现在 BakNRet/Public/ 且跑在两个 PowerShell 版本上。 --- .scratch/_probe/README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .scratch/_probe/README.md diff --git a/.scratch/_probe/README.md b/.scratch/_probe/README.md new file mode 100644 index 0000000..bd2dcc4 --- /dev/null +++ b/.scratch/_probe/README.md @@ -0,0 +1,28 @@ +# TUI 选型探针(保留作实测证据) + +这些脚本是 `docs/adr/0010~0013` 里那些实测结论的**来源**。结论与数字已经写进 ADR 正文;这里留的是 +"能复现它们的东西" —— 将来想确认某个库现在还能不能用,重跑对应探针即可,不必重新摸索一遍。 + +## 它们证明了什么(结论见 ADR,这里只标注来源) + +| 探针 | 证明的事 | 结论落在 | +| --- | --- | --- | +| `console-probe*.ps1`、`vt-probe.ps1` | 无控制台时 `$Host.UI.SupportsVirtualTerminal` **会撒谎**(返回 `True`),而 `[Console]::SetCursorPosition` 直接抛异常;VT 在本机默认已开 | ADR-0010(第一道闸门必须是 `IsOutputRedirected`) | +| `noconsole-probe.ps1` | 没有控制台时 `RawUI.WindowSize` 悄悄返回假的 `160x40`、`KeyAvailable` 返回 `True` | ADR-0010 | +| `tg-probe.ps1`、`tgwin*.ps1` | `Terminal.Gui` 1.15.0 的两个硬伤:要给内部 `NetMainLoop` 做反射、`Application.Shutdown()` 在两个版本上都抛 NRE | ADR-0010(否决) | +| `settle-probe.ps1`、`settle2-probe.ps1` | `Spectre.Console` 0.49.1 在 5.1 上能加载,但要额外带 4 个 DLL,且没有鼠标支持 | ADR-0010(否决) | +| `load-probe*.ps1` | `ConsoleGuiTools` 要求 PS 7.2(5.1 上不可能);本机原本没装任何 TUI 模块 | ADR-0010(否决) | +| `cells-probe.ps1`、`width-probe*.ps1` | 中文按列宽算(CJK 1 字符 = 2 列)、半角片假名 1 列、全角拉丁 2 列、框线字符 1 列、emoji 按码点 2 列;`RawUI.LengthInBufferCells` 在 5.1 上是错的、7 上是对的 | ADR-0010、第一轮 ① | +| `final-probe*.ps1`、`diag-probe.ps1` | 收口时的对照验证(把各家的实测结果并排跑一遍) | ADR-0010 | +| `TuiKit.ps1` | 零依赖方案的可运行原型(行内绘制 + 定位写 + 菜单),用来证明"不用任何库也能做出要的效果" | ADR-0010 | + +## 重跑注意 + +- 需要**真终端**(不是重定向的管道):多数探针会读 `[Console]::WindowWidth`,重定向下会走退化分支。 +- `load-probe*.ps1` 与 `settle*-probe.ps1` 依赖 `_probe/load/` 与 `_probe/nuget/` 两个目录,它们装的是 + 从 NuGet 拉来的 DLL/模块,**已删除并加进 `.gitignore`**(当时一次 `git add` 误把它们全扫进了提交)。 + 所以要重跑这几个,得先自己把包拉回来;**其余探针不依赖它们,可以直接跑**。 +- 探针是**一次性脚本**:不参与构建,不受 `test.ps1` 的 Encode/Parse 层管辖(它们不在受管文件清单里)。 + +真正的 TUI 实现在 `BakNRet/Public/`(`Get-BakNRetCellWidth`、`Read-BakNRetKey`、`Write-BakNRetAt`、 +`Invoke-BakNRetMenu` 等),有断言、跑在两个 PowerShell 版本上。