Files
BakNRet/.scratch/_probe/README.md
T
Shuery 400f2ad9a5 docs(probe): 给 TUI 选型探针加索引(它们证明了什么、结论落在哪条 ADR)
探针保留作实测证据:ADR-0010~0013 的结论与数字在正文里,这些脚本是能复现它们的东西 —— 将来想确认"某个库现在还能不能用",重跑对应探针即可,不必重新摸索。

索引按探针标注了来源与结论去向,并写明重跑注意:多数探针需要真终端(重定向下会走退化分支);load-probe 与 settle-probe 依赖已删除的 _probe/load 与 _probe/nuget(当时一次 git add 误把从 NuGet 拉的包扫进提交,已删除并 gitignore),重跑前要先自己拉包;其余可直接跑。

同时说明这些是一次性脚本:不参与构建、不受 test.ps1 的 Encode/Parse 层管辖;真正的 TUI 实现在 BakNRet/Public/ 且跑在两个 PowerShell 版本上。
2026-09-27 22:25:39 +08:00

2.7 KiB
Raw Blame History

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 版本上。