- Bản demo terminal với chức năng tối thiểu dựa trên libghostty C API, hoạt động bằng một tệp C duy nhất và kết xuất bằng Raylib
- Được cấu trúc để kiểm chứng khả năng của libghostty-vt, đồng thời cho thấy một triển khai terminal dựa trên đồ họa 2D thay vì kết xuất GPU
- Hỗ trợ các tính năng ở mức terminal thực thụ như text reflow, màu 24-bit, xử lý Unicode, giao thức chuột và bàn phím
- Một số tính năng như Kitty Graphics Protocol và OSC clipboard / đặt tiêu đề vẫn chưa được triển khai, đồng thời chưa hỗ trợ Windows
- Tận dụng lõi của libghostty để mang lại khả năng mở rộng cho nhiều ứng dụng có thể kết hợp GUI hoặc renderer riêng
Tổng quan về Ghostling
- Ghostling là dự án demo terminal với chức năng tối thiểu dựa trên libghostty C API, là một ví dụ được cấu thành từ một tệp C duy nhất
- Sử dụng Raylib để quản lý cửa sổ và kết xuất, vận hành theo kiến trúc đơn luồng
- Để thể hiện tính linh hoạt của libghostty-vt, dự án dùng renderer đồ họa 2D thay vì kết xuất trực tiếp bằng GPU
- Đây không phải terminal hoàn chỉnh cho sử dụng hằng ngày mà là ví dụ triển khai terminal khả dụng tối thiểu, nên việc kiểm chứng tính đúng đắn của mã còn hạn chế
Giới thiệu Libghostty
- Libghostty là thư viện giả lập terminal nhúng được tách ra từ lõi của Ghostty, cung cấp API cho C và Zig
- libghostty-vt là thư viện không có phụ thuộc, phụ trách quản lý trạng thái terminal như phân tích chuỗi VT, vị trí con trỏ, kiểu dáng, scrollback
- Không bao gồm mã kết xuất hay quản lý cửa sổ; ứng dụng sử dụng nó phải tự triển khai các phần này
- Dựa trên nền mã đã được kiểm chứng trong Ghostty GUI, cung cấp giả lập terminal chính xác và đầy đủ, phân tích tối ưu bằng SIMD, hỗ trợ Unicode nâng cao, sử dụng bộ nhớ hiệu quả, và độ ổn định dựa trên kiểm thử diện rộng
Tính năng chính
- Hỗ trợ thay đổi kích thước cửa sổ có kèm text reflow
- Hỗ trợ màu 24-bit và bảng màu 256 màu, cùng các kiểu đậm, nghiêng, đảo màu
- Xử lý Unicode và grapheme nhiều codepoint (nhưng không có shaping / layout)
- Xử lý phím bổ trợ như Shift, Ctrl, Alt, Super
- Hỗ trợ Kitty keyboard protocol, theo dõi chuột (X10, normal, button, any-event), cùng nhiều định dạng báo cáo chuột (SGR, URxvt, UTF8, X10)
- Hỗ trợ cuộn bằng bánh xe chuột và thanh cuộn kéo-thả, cùng focus reporting (CSI I / CSI O)
- Bao gồm phần lớn các tính năng giả lập terminal ở cùng cấp độ với Ghostty GUI
Tính năng dự kiến
- Những tính năng vẫn chưa được libghostty-vt phơi bày hoàn toàn
-
Kitty Graphics Protocol
-
Hỗ trợ OSC clipboard
- Đặt tiêu đề bằng OSC
- Hỗ trợ Windows có thể thực hiện ở libghostty-vt nhưng trong Ghostling vẫn chưa được triển khai
- Danh sách này sẽ tiếp tục được mở rộng khi phát hiện thêm tính năng cần bổ sung
Những tính năng không được cung cấp
- libghostty tập trung vào lõi giả lập terminal nên không bao gồm các tính năng ở tầng GUI
- Không bao gồm tab, nhiều cửa sổ, chia màn hình, quản lý phiên, tệp cấu hình, GUI, giao diện tìm kiếm, v.v.
- Các tính năng này phải do ứng dụng sử dụng libghostty tự triển khai
- Ghostling cố ý loại bỏ các tính năng đó để giữ vai trò là ví dụ tối giản
Cách build
FAQ
-
Vì sao dùng C thay vì Zig
-
libghostty-vt cung cấp API Zig đầy đủ, nhưng API C được dùng rộng rãi hơn và dễ tiếp cận hơn
- Ghostling là bản demo nhằm cho thấy ví dụ sử dụng tối thiểu của C API
-
Hỗ trợ ngôn ngữ khác như Rust
- libghostty-vt có thể hoạt động không phụ thuộc gì thông qua C API
- Có thể dùng từ hầu hết ngôn ngữ chỉ với binding mỏng, còn binding chính thức tập trung vào C và Zig
- Kỳ vọng cộng đồng sẽ phát triển và duy trì binding cho nhiều ngôn ngữ khác nhau
-
Có bắt buộc dùng Raylib không
- Không bắt buộc. libghostty không áp đặt renderer hay framework GUI nào
- Có thể hoạt động độc lập cả trong môi trường WASM
- Cung cấp render state API, nên có thể kết hợp với bất kỳ renderer nào như Metal, OpenGL, Raylib
-
Vì sao chọn CMake và Raylib
- Không bị ràng buộc vào công nghệ cụ thể nào, và CMake là hệ thống build phổ dụng với mức hỗ trợ rộng
-
Raylib là thư viện cửa sổ / kết xuất 2D đơn giản và dễ cấu hình
- Mục tiêu của dự án không phải quảng bá lựa chọn công nghệ mà là cho thấy ví dụ ứng dụng libghostty
1 bình luận
Ý kiến trên Hacker News
Tôi đang dùng libghostty cho Trolley
Dự án này đóng gói TUI thành ứng dụng desktop, khá giống cách bọc web app bằng Electron
Chỉ cần thêm GUI và CLI bundler mà nó vẫn hoạt động hoàn hảo trên Windows
Tôi thực sự rất khâm phục các nhà phát triển Ghostty
Như vậy có thể hiểu ngay ứng dụng thêm kiểu chrome (phần khung UI) nào quanh TUI
File C nhỏ đến mức tôi đọc hết chỉ trong vài phút
Khoảng đến dòng thứ 5 thì tôi ngạc nhiên khi thấy cách nhúng font bằng header được tạo tự động rất độc đáo
Tôi vốn quen với kiểu resource của Windows, còn ở đây là dùng mã CMake để tạo mảng byte
Hơi sốc nhưng cũng rất ấn tượng — cảm giác như cuối cùng đã tìm ra lời giải cho việc nhúng tài nguyên nhị phân đa nền tảng
Với lệnh
cmake -DINPUT=pixel.gif -DOUTPUT=pixel.h -DARRAY_NAME=pixel_gif -P bin2header.cmaketôi có thể chuyển một file GIF 1x1 pixel thành mảng C
Trong header được tạo tự động, hình ảnh được đưa nguyên vẹn vào dưới dạng mảng byte
#includetrực tiếp mà không cần chỉnh sửaWiki X PixMap giải thích khá rõ cấu trúc này
xxdtrong góivimNhưng với tài nguyên lớn thì khá kém hiệu quả — gcc/clang sẽ bùng nổ bộ nhớ
Vì vậy tôi dùng dự án LIEF
Nó cho phép chèn rồi đọc lại tài nguyên trong binary Windows PE, macOS Mach-O và Linux ELF
Nhờ đó tôi đã xây được một hệ thống đóng gói tài nguyên đa nền tảng không bị giới hạn kích thước
DrawTextExkhá thú vịĐây là một mẫu thể hiện rất rõ độ biểu đạt của thư viện Ghostty
Những lựa chọn thư viện khác cũng rất tuyệt, và nó khiến tôi có cảm hứng tự thử làm một ứng dụng terminal
Nhúng dữ liệu nhị phân vào mã nguồn là kỹ thuật đã có từ lâu
Trong các dòng
DATAcủa BASIC thập niên 70–80, hay game trên Atari ST và Amiga, kiểu này rất phổ biếnNgay cả trong Java, người ta cũng từng nhét font dạng pixel trực tiếp vào file
.javaTôi cũng nghe nói một số font trong nhân Linux được xử lý theo cách này
Dự án này khá thú vị
Tôi không cần terminal emulator có tab hay quản lý session
WM quản lý cửa sổ và tab, còn tmux xử lý session, scrollback, tìm kiếm, v.v.
Vì vậy các terminal đơn giản như urxvt, st, foot là đã đủ dùng
Ghostty không hợp gu của tôi, nhưng cái này thì đáng để thử
Đã có kế hoạch hỗ trợ OSC, và sẽ tốt hơn nữa nếu có thêm hệ thống plugin đỡ phiền hơn st