- Demo terminal dengan fungsi minimum berbasis libghostty C API, berjalan menggunakan satu file C dan rendering Raylib
- Dirancang untuk memverifikasi kemampuan libghostty-vt, serta menunjukkan implementasi terminal berbasis grafis 2D alih-alih rendering GPU
- Mendukung fitur setingkat terminal sungguhan seperti text reflow, warna 24-bit, pemrosesan Unicode, serta protokol mouse dan keyboard
- Beberapa fitur seperti Kitty Graphics Protocol dan pengaturan clipboard serta judul via OSC masih belum diimplementasikan, dan dukungan Windows juga belum disertakan
- Memanfaatkan inti libghostty untuk memberi ekstensibilitas agar berbagai aplikasi dapat menggabungkan GUI atau renderer mereka sendiri
Ikhtisar Ghostling
- Ghostling adalah proyek demo terminal dengan fungsi minimum berbasis libghostty C API, berupa contoh yang terdiri dari satu file C
- Menggunakan Raylib untuk pengelolaan jendela dan rendering, serta berjalan dengan arsitektur single-thread
- Menggunakan renderer grafis 2D alih-alih rendering GPU langsung untuk menunjukkan fleksibilitas libghostty-vt
- Bukan terminal harian yang sepenuhnya lengkap, melainkan contoh implementasi terminal minimum viable, sehingga verifikasi ketepatan kode masih terbatas
Pengenalan Libghostty
- Libghostty adalah library emulasi terminal embedded yang diekstrak dari inti Ghostty, menyediakan API C dan Zig
- libghostty-vt adalah library tanpa dependensi, yang menangani manajemen status terminal seperti parsing urutan VT, posisi kursor, style, dan scrollback
- Tidak menyertakan kode rendering atau pengelolaan jendela; aplikasi yang menggunakannya harus mengimplementasikan bagian tersebut sendiri
- Berdasarkan kode yang telah tervalidasi di Ghostty GUI, library ini menawarkan emulasi terminal yang akurat dan lengkap, parsing yang dioptimalkan dengan SIMD, dukungan Unicode tingkat lanjut, penggunaan memori yang efisien, serta stabilitas berbasis pengujian yang luas
Fitur utama
- Mendukung pengubahan ukuran jendela termasuk text reflow
- Mendukung warna 24-bit dan palet 256 warna, serta style bold, italic, dan inverse
- Mendukung Unicode dan grapheme multi-codepoint (namun tanpa shaping atau layout)
- Menangani input tombol modifier seperti Shift, Ctrl, Alt, Super
- Mendukung Kitty keyboard protocol, pelacakan mouse (X10, normal, button, any-event), serta berbagai format pelaporan mouse (SGR, URxvt, UTF8, X10)
- Mendukung scroll wheel dan scrollbar drag, serta pelaporan fokus (CSI I / CSI O)
- Mencakup sebagian besar fitur emulasi terminal pada level yang sama dengan Ghostty GUI
Fitur yang direncanakan
- Fitur yang masih belum sepenuhnya diekspos di libghostty-vt
-
Kitty Graphics Protocol
-
Dukungan clipboard OSC
- Pengaturan judul OSC
- Dukungan Windows dimungkinkan di libghostty-vt, tetapi masih belum diimplementasikan di Ghostling
- Daftar ini akan terus diperluas saat fitur tambahan ditemukan di masa mendatang
Fitur yang tidak disediakan
- Karena libghostty berfokus pada inti emulasi terminal, fitur lapisan GUI tidak disertakan
- Tab, multi-window, split screen, manajemen sesi, file konfigurasi, GUI, UI pencarian, dan sebagainya tidak termasuk
- Fitur-fitur tersebut harus diimplementasikan langsung oleh aplikasi yang menggunakan libghostty
- Ghostling sengaja mengecualikan fitur-fitur ini agar tetap menjadi contoh minimum
Cara build
FAQ
-
Alasan menggunakan C alih-alih Zig
-
libghostty-vt** menyediakan API Zig yang lengkap, tetapi** API C lebih luas digunakan dan lebih mudah diakses
- Ghostling adalah demo untuk menunjukkan contoh penggunaan minimum C API
-
Dukungan bahasa lain seperti Rust
- libghostty-vt dapat berjalan tanpa dependensi melalui C API
- Dapat digunakan di sebagian besar bahasa hanya dengan binding tipis, dan binding resmi berfokus pada C dan Zig
- Diharapkan komunitas akan mengembangkan dan memelihara binding untuk berbagai bahasa
-
Apakah Raylib wajib
- Tidak wajib. libghostty tidak membatasi renderer maupun framework GUI
- Dapat berjalan secara mandiri bahkan di lingkungan WASM
- Menyediakan render state API, sehingga bisa digabungkan dengan renderer apa pun seperti Metal, OpenGL, atau Raylib
-
Alasan memilih CMake dan Raylib
- Tidak terikat pada teknologi tertentu, dan CMake adalah sistem build serbaguna dengan dukungan luas
-
Raylib** adalah library jendela dan rendering 2D yang sederhana dan mudah dikonfigurasi**
- Tujuan proyek ini bukan pada pilihan teknologinya, melainkan untuk menunjukkan contoh pemanfaatan libghostty
1 komentar
Komentar Hacker News
Saya memakai libghostty di Trolley
Proyek ini mengemas TUI menjadi aplikasi desktop, mirip seperti membungkus web app dengan Electron
Hanya dengan menambahkan bundler GUI dan CLI, ini bisa berjalan sempurna di Windows
Saya benar-benar kagum pada para pengembang Ghostty
Rasanya itu akan langsung membantu memahami chrome (bingkai UI) seperti apa yang ditambahkan aplikasi di sekitar TUI
File C-nya kecil, jadi saya bisa membaca semuanya dalam beberapa menit
Sekitar baris ke-5, saya terkejut melihat pendekatan unik yang menyematkan font sebagai header yang dibuat otomatis
Saya terbiasa dengan cara resource Windows, tetapi ini memakai kode CMake untuk membuat array byte
Agak mengejutkan sekaligus mengesankan — rasanya seperti akhirnya menemukan solusi untuk penyematan resource biner lintas platform
Dengan perintah
cmake -DINPUT=pixel.gif -DOUTPUT=pixel.h -DARRAY_NAME=pixel_gif -P bin2header.cmake,saya bisa mengubah GIF 1x1 piksel menjadi array C
Header yang dihasilkan otomatis akan berisi gambar tersebut sebagai array byte mentah
#includetanpa modifikasiWiki X PixMap menjelaskan strukturnya dengan baik
xxddari paketvimTetapi itu tidak efisien untuk resource besar — gcc/clang bisa mengalami ledakan penggunaan memori
Karena itu saya memakai proyek LIEF
Ini memungkinkan penyisipan dan pembacaan kembali resource pada biner Windows PE, macOS Mach-O, dan Linux ELF
Berkat itu, saya bisa membangun sistem bundling resource lintas platform tanpa batas ukuran
DrawTextExItu adalah sampel yang menunjukkan daya ekspresif pustaka Ghostty dengan baik
Pilihan pustaka lainnya juga sangat bagus, dan ini memberi saya inspirasi untuk mencoba membuat aplikasi terminal sendiri
Menyertakan biner di dalam source code adalah teknik lama
Di baris
DATABASIC era 70-an dan 80-an, atau di game Atari ST dan Amiga, cara seperti ini sudah umumDi Java juga pernah ada font tingkat piksel yang langsung dimasukkan ke file
.javaSaya juga pernah dengar beberapa font di kernel Linux ditangani dengan cara seperti ini
Proyek ini menarik
Saya tidak butuh fitur tab atau manajemen sesi di terminal emulator
WM mengelola jendela dan tab, dan tmux menangani sesi, scrollback, pencarian, dan sebagainya
Jadi terminal sederhana seperti urxvt, st, atau foot sudah cukup bagi saya
Ghostty bukan selera saya, tetapi yang ini layak dicoba
Dukungan OSC sudah direncanakan, dan akan bagus jika ada sistem plugin yang tidak serepot st