Bubble Tea ๊ธฐ๋ฐ ๋น๋๊ธฐ ๋ ๋๋ง์ ํตํ TUI Split-pane Preview ๊ตฌํ
peektea opens a second eye ๐ side-by-side file previews
AI ์์ฝ
Context
TUI ํ๊ฒฝ์์ ํ์ผ ํ์ ์ ์ฝํ ์ธ ํ์ธ์ ์ํด ๋งค๋ฒ ํ๋ฉด์ ์ ํํด์ผ ํ๋ UX ๋ณ๋ชฉ ๋ฐ์. ๋์ฉ๋ ํ์ผ ์ฝ๊ธฐ ๋ฐ ์ด๋ฏธ์ง ๋ ๋๋ง ์ ๋ฉ์ธ ๋ฃจํ๊ฐ ๋ธ๋กํน๋์ด ์ธํฐํ์ด์ค ์๋ต์ฑ์ด ์ ํ๋๋ ๊ตฌ์กฐ์ ํ๊ณ ์กด์ฌ.
Technical Solution
tea.Cmd๋ฅผ ํ์ฉํ Async Loading ๊ตฌ์กฐ ์ค๊ณ๋ก ํ์ผ ์ฝ๊ธฐ ๋ฐchafaํ๋ก์ธ์ค ์คํ ์ TUI ์๋ต์ฑ ์ ์งpreviewMsg๋ฉ์์ง ๊ธฐ๋ฐ์ ์ํ ์ ๋ฐ์ดํธ ํจํด์ ์ ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์๋ฃ ํ UI๋ฅผ ๊ฐฑ์ ํ๋ Event-driven ๋ ๋๋ง ๊ตฌํchafaCLI ๋๊ตฌ๋ฅผ ํตํฉํ๊ณ--size์ต์ ์ ํตํ Dynamic Window Resizing์ผ๋ก ํฐ๋ฏธ๋ ํฌ๊ธฐ์ ์ต์ ํ๋ ์ด๋ฏธ์ง ๋ ๋๋ง ์ฒ๋ฆฌ- ํ์ผ ์์ 512 bytes์ Null Byte ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ Heuristic ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ Binary File ๋ ธ์ด์ฆ ์ถ๋ ฅ ๋ฐฉ์ง
tea.WindowSizeMsg๋ฅผ ํตํ ์ค์๊ฐ ํฐ๋ฏธ๋ ํฌ๊ธฐ ์ถ์ ๋ฐ ํ์ผ๋ช ๊ธธ์ด์ ๋ฐ๋ฅธ ๊ฐ๋ณ์ Left Panel Width ๊ณ์ฐ ๋ก์ง ๊ตฌํ
์ค์ฒ ํฌ์ธํธ
- TUI ์ค๊ณ ์ ๋ฌด๊ฑฐ์ด I/O ์์ ์ ๋ฐ๋์ `tea.Cmd`์ ๊ฐ์ ๋น๋๊ธฐ ๋ช ๋ น์ด๋ก ๋ถ๋ฆฌํ์ฌ ๋ฉ์ธ ๋ฃจํ ๋ธ๋กํน ๋ฐฉ์ง - Binary ํ์ผ ํ๋ณ ์ ์ ์ฒด ์ฝ๊ธฐ๊ฐ ์๋ ์์ ๊ณ ์ ๋ฐ์ดํธ(์: 512B)๋ง ๊ฒ์ฌํ๋ ์ต์ ํ ๊ธฐ๋ฒ ๊ฒํ - ํฐ๋ฏธ๋ ๋ฆฌ์ฌ์ด์ง ์ด๋ฒคํธ ๋ฐ์ ์ UI ์ปดํฌ๋ํธ ๊ฐ์ ๊ฐ๋ณ ๋น์จ(Min Width ๋ฐ Max Width) ์ ์๋ฅผ ํตํ ๋ ์ด์์ ์์ ์ฑ ํ๋ณด