Files
ZacharyZhang-NYandClaude Opus 5.5 bcce34cda1 Upgrade MyGo to v0.5.5
MyGo v0.5.5 returns ui.Element as a checked value handle instead of a
pointer. Migrated with `mygo migrate-ui`, then fixed what the codemod
leaves to review:

- Element nil checks become .Valid(); absent elements are ui.Element{}.
- Input handlers and paint callbacks run outside the build pass, where
  elements expire and Context methods are inert: read IsDisabled into a
  local during the build, keep a ui.Handle for Focus, use c.Services()
  for clipboard access, create ui.Local state during the build.
- Add core.AutoFocus: v0.5.5 records an overlay's opener after its
  content builds, so same-frame autofocus lost focus restore on close.
  It focuses one frame later; cascader rows defer their focus likewise.
- core.OverlayLayer identifies build passes by the root element, not
  c.Now(), which repeats across passes and under the Tester clock.
- Context menus survive the opening press counted as PressedOutside;
  split button tooltip no longer reorders its open menu; disabled
  menubar rows pass presses to the panel; Form defers blur-started
  async checks so the growing message no longer moves Submit away
  from the release; Combobox drops its disabled copy now that MyGo
  blocks typing under a disabled wrapper (canary flipped to a guard).
- The Tester clock is virtual: tests use Advance/Now instead of
  time.Sleep/time.Now and read element state inside the view. The web
  mirror advances the clock to wall time before each frame and input.
- AGENTS.md and docs describe the value Element API and the new pin.

Snapshot goldens are darwin-only and were not re-verified here.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-17 01:37:54 -04:00

3.0 KiB
Raw Permalink Blame History

321 Terminal · 终端

用途

显示终端网格:调用方把 PTY 输出写入 TerminalState.Write,组件解析 ANSI 样式(internal.ParseAnsi)、光标移动与清屏,保留滚动缓冲,支持鼠标选择复制,并把键盘输入编码后交给调用方写回 PTY。PTY 本身由调用方提供。

最小示例

var term code.TerminalState
term.Write("\x1b[1m~/court\x1b[0m $ ls\r\n\x1b[34mdecrees\x1b[0m  ledger.txt\r\n$ ")
view := func(c *ui.Context) {
	core.Use(c, core.Settings{})
	code.Terminal(c, &term, code.TerminalOptions{
		Input:   func(data string) { fmt.Printf("to pty: %q\n", data) },
		Resized: func(cols, rows int) { fmt.Println("pty size", cols, rows) },
	}).Size(380, 200)
}
ui.Render(view, 400, 300, 1)

参数

func Terminal(c *ui.Context, s *TerminalState, opts TerminalOptions) ui.Element。TerminalState 零值是 80×24 空屏,由调用方持有;Write(data) 写入输出(须在界面线程,例如经 Window.Update),Resize(cols, rows)、Lines()、LineText(i)、Select(a, b)、Selection()、ScrollBack(n)、Offset()、Cursor()、Size() 供程序读取与控制。

字段 类型 默认值 含义
Input func(data string) nil 用户输入编码后的字节:文字原样,Enter 为 \r,退格 \x7f,方向键 ESC [ A–D,Ctrl+字母为控制码。
Resized func(cols, rows int) nil 网格尺寸随元素大小变化时回调,用于同步 PTY 窗口大小。
Scrollback int 1000 滚动缓冲最多保留的行数;负数 panic。
Label string 内置“终端” 无障碍名称。
Disabled bool false 不接收任何输入。

状态

默认(Surface 底、细边框)、聚焦(外侧 2 DIP 焦点环,光标为 AccentText 实心块并反白字符)、未聚焦(光标只描边)、选择(Selection 背景)、回看滚动缓冲(隐藏光标)、输入法组合(光标处显示带下划线的组合文字)、禁用。

事件

Input:每次按键、输入文字或粘贴;Resized:网格尺寸变化。复制写入系统剪贴板。

键盘操作

  • 焦点在终端时,文字、Enter、Backspace、Tab、Shift+Tab、Escape、方向键、Home/End、Delete、PageUp/PageDown 与 Ctrl+字母都发送给 PTY。
  • 复制:macOS 上 Cmd+C,其他平台 Ctrl+Shift+C(复制选中文字);粘贴:Cmd+V / Ctrl+Shift+V。
  • Shift+PageUp / Shift+PageDown:翻看滚动缓冲;滚轮同样可用;任意输入回到底部。

限制

  • 状态机覆盖常用序列:SGR 样式、CUU/CUD/CUF/CUB、CHA、CUP、ED(0/1/2/3)、EL、CR/LF/BS/TAB 与 OSC(忽略)。其余 CSI 序列只记录 Debug 日志后忽略;不支持备用屏幕、滚动区域、鼠标上报与宽字符占两格。
  • 需要完整终端仿真时请使用 MyGo 的 plugins/terminal(基于 libghostty-vt)。
  • 字形用 ui.Shape 逐格排布并按行缓存,等宽字体由系统回退决定。