diff options
| author | eunhhu <[email protected]> | 2026-09-26 10:52:12 +0100 |
|---|---|---|
| committer | eunhhu <[email protected]> | 2026-09-26 10:52:12 +0100 |
| commit | 04e883a310fd3914d6f4294a92b08b3fe9f55686 (patch) | |
| tree | bf01098a08aa809104366a5d4057ad66a51f51ad /docs/design/001-first-component.md | |
| parent | b55395802f4c7b929c45013efb572aab786a8b43 (diff) | |
| download | vega-04e883a310fd3914d6f4294a92b08b3fe9f55686.tar.gz vega-04e883a310fd3914d6f4294a92b08b3fe9f55686.zip | |
Send the terminal only the cells that changed
The TUI rebuilt its grid from the app on every change and then sent all
of it. It now keeps what the terminal shows and sends each run of changed
cells after a cursor move (short unchanged gaps stay in a run, being
cheaper than another move; a run that starts in the second half of a wide
character starts at its first). A resize sends everything again.
vega tui --paint WxH writes the bytes of each frame; the checks replay
them with a small terminal emulator and compare with the dumped frame:
4,800 random frames at three sizes agree, and a change costs 139 bytes on
average against 1,220 for a whole frame. The interactive check now reads
the final screen from the replayed bytes.
Diffstat (limited to 'docs/design/001-first-component.md')
| -rw-r--r-- | docs/design/001-first-component.md | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/docs/design/001-first-component.md b/docs/design/001-first-component.md index 5033389..0161af9 100644 --- a/docs/design/001-first-component.md +++ b/docs/design/001-first-component.md @@ -35,7 +35,7 @@ view tasks_list_focus = at.position | 표면 | 명령 | 하는 일 | |---|---|---| -| TUI | `vega tui app.pmod` | 대체 화면, 원시 입력. 제목·필드·목록·표·키 목록·입력 줄. 포커스 행을 최소 스크롤로 화면에 두고 **보이는 행의 칸만** 계산한다. 크기 변경(SIGWINCH), frame 핸들러가 있으면 60 Hz | +| TUI | `vega tui app.pmod` | 대체 화면, 원시 입력. 제목·필드·목록·표·키 목록·입력 줄. 포커스 행을 최소 스크롤로 화면에 두고 **보이는 행의 칸만** 계산한다. 터미널에 보이는 격자를 기억해 **바뀐 칸만** 보낸다. 크기 변경(SIGWINCH), frame 핸들러가 있으면 60 Hz | | CLI | `vega cli app.pmod < script` | 파이프용 평문. 목록은 `> ` 표시와 `[badge]`, 표는 표시 폭으로 정렬한 열. 터미널이고 `NO_COLOR`가 없을 때만 색 | | NUI | `vega say app.pmod < script` | 문장. 이벤트마다 포커스 항목을 말하고(`Item 2 of 3: danger, milk, urgent.`), 실패하면 `Could not toggle.`, `show`에서 화면 전체 | @@ -46,6 +46,17 @@ Tab이 키 모드로 바꾸면 글자·숫자·Space가 `KeyA`·`Digit0`·`Space 표시 폭은 Vega가 맡는다. 한글·CJK·그림 이모지는 두 칸, 결합 문자·변이 선택자·ZWJ는 0칸, 제어 문자는 제어 그림(U+2400대)으로 보인다. grapheme 단위 자르기는 아직 없어 ZWJ 이모지 묶음은 근사다. +## 셀 단위 갱신 + +TUI는 매 변경마다 격자를 앱에서 다시 그리지만(보이는 칸만 계산), 터미널에는 지금 보이는 것과 다른 칸만 보낸다. +바뀐 칸의 연속 구간마다 커서를 옮기고 그 구간만 쓴다. 짧은 무변경 틈(6칸 이하)은 커서 이동보다 싸므로 구간에 넣는다. +넓은 글자의 뒷칸에서 시작하는 구간은 앞칸부터 쓴다. 크기가 바뀌면 전체를 다시 보낸다. + +`vega tui app.pmod --paint WxH`는 스크립트의 `show`마다 터미널로 보낼 바이트를 낸다. 검사는 그 바이트를 작은 터미널 +에뮬레이터로 재생해 `--dump`의 화면과 프레임마다 비교한다(커서 이동, 지우기, 색·반전, 두 칸 글자, 결합 문자). +무작위 입력 4,800 프레임(40×12, 24×9, 80×30)에서 모두 같았다. 한 프레임이 보내는 바이트는 평균 1,220 B(전체)에서 +139 B(변경분)로 줄었다. SSH처럼 느린 터미널에서 입력 한 번의 화면 갱신이 그만큼 가볍다. + ## 규약 검사 (`vega check`) `vega check app.pmod`는 모듈이 뜻한 듯하지만 규약에 맞지 않는 곳을 알린다. 표면은 이런 보기를 조용히 다른 @@ -94,5 +105,5 @@ CLI나 문장 표면이 그대로 이어받는다. Vega에도 앱에도 저장 � - 포커스를 표면에서 바꾸기(GUI 클릭, TUI 마우스). 지금은 앱의 키 핸들러만 포커스를 옮긴다. Pure에 표의 인덱스를 이벤트로 바꾸는 호스트 API가 필요하다. -- 셀 단위 갱신(TUI는 매 변경마다 전체를 다시 그린다), GUI 표면, 음성 합성으로 가는 NUI. +- GUI 표면, 음성 합성으로 가는 NUI. - 문장의 언어. 지금 NUI의 틀 문장은 영어이고 값은 앱의 text 그대로다. |
