- เดโมเทอร์มินัลที่มีฟังก์ชันขั้นต่ำซึ่งสร้างบน libghostty C API โดยทำงานด้วยไฟล์ C เพียงไฟล์เดียวและใช้ การเรนเดอร์ด้วย Raylib
- ออกแบบมาเพื่อยืนยันความสามารถของ libghostty-vt และแสดงตัวอย่าง การสร้างเทอร์มินัลบนกราฟิก 2D แทนการเรนเดอร์ด้วย GPU
- รองรับความสามารถระดับเทอร์มินัลจริง เช่น text reflow, สี 24 บิต, การจัดการ Unicode, โปรโตคอลเมาส์และคีย์บอร์ด
- ฟีเจอร์บางส่วน เช่น Kitty Graphics Protocol และ การตั้งค่าคลิปบอร์ด·ชื่อหน้าต่างผ่าน OSC ยังไม่ถูกพัฒนา และยัง ไม่รองรับ Windows
- ใช้แกนหลักของ libghostty เพื่อเปิดทางให้แอปพลิเคชันต่าง ๆ มี ความยืดหยุ่นในการผสาน GUI หรือ renderer ของตนเอง
ภาพรวมของ Ghostling
- Ghostling เป็นโปรเจ็กต์เดโมเทอร์มินัลที่มีฟังก์ชันขั้นต่ำซึ่งสร้างบน libghostty C API และเป็นตัวอย่างที่ประกอบด้วยไฟล์ C เพียงไฟล์เดียว
- ใช้ Raylib สำหรับจัดการหน้าต่างและการเรนเดอร์ และทำงานด้วยโครงสร้างแบบ single-thread
- เพื่อแสดงความยืดหยุ่นของ libghostty-vt จึงใช้ตัวเรนเดอร์กราฟิก 2D แทนการเรนเดอร์ GPU โดยตรง
- ไม่ใช่เทอร์มินัลสำหรับใช้งานประจำวันแบบสมบูรณ์ แต่เป็น ตัวอย่างการสร้างเทอร์มินัลที่ใช้งานได้ขั้นต่ำ ดังนั้นการตรวจสอบความถูกต้องของโค้ดจึงยังมีข้อจำกัด
แนะนำ Libghostty
- Libghostty คือ ไลบรารี terminal emulation แบบฝังตัว ที่แยกออกมาจากแกนหลักของ Ghostty และมี API สำหรับ C และ Zig
- libghostty-vt เป็นไลบรารี ที่ไม่มี dependency ทำหน้าที่จัดการ สถานะของเทอร์มินัล เช่น การแยกวิเคราะห์ VT sequence, ตำแหน่งเคอร์เซอร์, สไตล์, scrollback
- ไม่มีโค้ดสำหรับการเรนเดอร์หรือการจัดการหน้าต่างรวมอยู่ด้วย และแอปพลิเคชันที่นำไปใช้ต้องพัฒนาเอง
- อ้างอิงจากโค้ดที่ผ่านการพิสูจน์แล้วใน Ghostty GUI โดยมอบ terminal emulation ที่แม่นยำและครบถ้วน, การแยกวิเคราะห์ที่ปรับแต่งด้วย SIMD, การรองรับ Unicode ขั้นสูง, การใช้หน่วยความจำอย่างมีประสิทธิภาพ, และ ความเสถียรจากการทดสอบอย่างกว้างขวาง
ฟีเจอร์หลัก
- รองรับ การปรับขนาดหน้าต่างพร้อม text reflow
- รองรับ สี 24 บิตและพาเลต 256 สี, รวมถึง สไตล์ตัวหนา·ตัวเอียง·กลับสี
- รองรับ Unicode และ grapheme แบบหลาย code point (แต่ยังไม่มี shaping·layout)
- รองรับการป้อนปุ่ม modifier เช่น Shift, Ctrl, Alt, Super
- รองรับ Kitty keyboard protocol, การติดตามเมาส์ (X10, normal, button, any-event), และ รูปแบบการรายงานเมาส์หลายแบบ (SGR, URxvt, UTF8, X10)
- รองรับ ล้อเลื่อนเมาส์และแถบเลื่อนแบบลาก, รวมถึง การรายงานโฟกัส (CSI I / CSI O)
- มีความสามารถด้าน terminal emulation ส่วนใหญ่ในระดับเดียวกับ Ghostty GUI
ฟีเจอร์ที่วางแผนไว้
- ฟีเจอร์ที่ยังไม่ถูกเปิดเผยอย่างสมบูรณ์ใน libghostty-vt
-
Kitty Graphics Protocol
-
รองรับคลิปบอร์ดผ่าน OSC
- การตั้งค่าชื่อหน้าต่างผ่าน OSC
- การรองรับ Windows ทำได้ใน libghostty-vt แต่ใน Ghostling ยังไม่ได้พัฒนา
- รายการนี้จะขยายต่อไปเมื่อพบฟีเจอร์เพิ่มเติมในอนาคต
ฟีเจอร์ที่ไม่มีให้
- libghostty มุ่งเน้นที่แกนหลักของ terminal emulation จึงไม่รวมความสามารถในชั้น GUI
- ไม่มีแท็บ, หลายหน้าต่าง, split view, การจัดการเซสชัน, ไฟล์ตั้งค่า, GUI, UI สำหรับค้นหา ฯลฯ
- ฟีเจอร์เหล่านี้ ต้องให้แอปพลิเคชันที่ใช้ libghostty พัฒนาเองโดยตรง
- Ghostling ตั้งใจตัดความสามารถเหล่านี้ออกเพื่อคงความเป็นตัวอย่างขั้นต่ำ
วิธี build
FAQ
-
เหตุผลที่ใช้ C แทน Zig
-
libghostty-vt มี Zig API ที่สมบูรณ์ แต่ C API ถูกใช้อย่างแพร่หลายกว่าและเข้าถึงได้ง่ายกว่า
- Ghostling เป็นเดโมเพื่อแสดง ตัวอย่างการใช้งาน C API แบบขั้นต่ำ
-
การรองรับภาษาอื่น เช่น Rust
- libghostty-vt สามารถทำงานแบบ zero dependency ผ่าน C API
- ใช้งานได้ในภาษาเกือบทั้งหมดด้วย thin binding เท่านั้น และ official binding เน้นที่ C และ Zig
- คาดหวังให้ชุมชนช่วยพัฒนาและดูแล binding สำหรับภาษาต่าง ๆ
-
Raylib จำเป็นหรือไม่
- ไม่จำเป็น libghostty ไม่ได้จำกัด renderer หรือ GUI framework
- สามารถทำงานได้อย่างอิสระแม้ใน สภาพแวดล้อม WASM
- มี render state API ให้ จึงสามารถผสานกับ renderer ใดก็ได้ เช่น Metal·OpenGL·Raylib
-
เหตุผลที่เลือก CMake และ Raylib
- ไม่ยึดติดกับเทคโนโลยีใดเทคโนโลยีหนึ่ง และ CMake เป็นระบบ build ที่ใช้งานทั่วไปและรองรับอย่างกว้างขวาง
-
Raylib เป็นไลบรารีสำหรับหน้าต่างและการเรนเดอร์ 2D ที่เรียบง่ายและตั้งค่าได้ง่าย
- เป้าหมายของโปรเจ็กต์นี้ไม่ใช่การเลือกเทคโนโลยี แต่คือการแสดง ตัวอย่างการนำ libghostty ไปใช้งาน
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ฉันใช้ libghostty กับ Trolley อยู่
โปรเจ็กต์นี้แพ็ก TUI ให้เป็นแอปเดสก์ท็อป คล้ายกับการเอาเว็บแอปไปห่อด้วย Electron
มันแค่เพิ่มตัว bundle สำหรับ GUI และ CLI เข้าไป แต่กลับทำงานบน Windows ได้สมบูรณ์แบบ
ฉันประทับใจนักพัฒนา Ghostty อย่างมากจริงๆ
น่าจะช่วยให้เข้าใจได้ทันทีว่าแอปเพิ่ม chrome (ส่วนกรอบ UI รอบนอก) อะไรไว้รอบ TUI บ้าง
ไฟล์ C เล็กมากจนอ่านจบได้ในไม่กี่นาที
พอถึงประมาณบรรทัดที่ 5 ฉันก็แปลกใจกับวิธีฝังฟอนต์ด้วย เฮดเดอร์ที่สร้างอัตโนมัติ
ฉันคุ้นกับวิธีใช้ทรัพยากรของ Windows มากกว่า แต่นี่เป็นโครงสร้างที่ใช้โค้ด CMake สร้างอาร์เรย์ไบต์
มันทั้งชวนช็อกนิดๆ และน่าประทับใจ — เหมือนในที่สุดก็เจอวิธีทำ การฝังทรัพยากรไบนารีข้ามแพลตฟอร์ม แล้ว
ด้วยคำสั่ง
cmake -DINPUT=pixel.gif -DOUTPUT=pixel.h -DARRAY_NAME=pixel_gif -P bin2header.cmakeก็สามารถแปลง GIF ขนาด 1x1 พิกเซลให้เป็น C array ได้
ภาพจะถูกใส่ลงไปในเฮดเดอร์ที่สร้างอัตโนมัติเป็นอาร์เรย์ไบต์แบบตรงๆ
#includeได้โดยไม่ต้องแก้ไขวิกิ X PixMap อธิบายโครงสร้างนี้ไว้ค่อนข้างดี
xxdจากแพ็กเกจvimสร้างอาร์เรย์แบบนี้ก็ได้แต่กับทรัพยากรขนาดใหญ่จะไม่มีประสิทธิภาพ — gcc/clang กินหน่วยความจำจนระเบิด
เพราะงั้นฉันเลยใช้ โปรเจ็กต์ LIEF
มันช่วยแทรกทรัพยากรเข้าไปในไบนารี Windows PE, macOS Mach-O, Linux ELF และอ่านกลับออกมาได้
ทำให้ฉันสร้าง ระบบ bundle ทรัพยากรข้ามแพลตฟอร์ม ที่ไม่มีข้อจำกัดด้านขนาดได้
DrawTextExมันเป็นตัวอย่างที่แสดง ความยืดหยุ่นในการแสดงผล ของไลบรารี Ghostty ได้ดี
การเลือกไลบรารีอื่นๆ ก็ดีมากเช่นกัน และมันทำให้ฉันมีแรงบันดาลใจอยากลองสร้างแอปเทอร์มินัลเองบ้าง
การ รวมไบนารีไว้ในซอร์สโค้ด เป็นเทคนิคเก่าแก่มาก
ตั้งแต่ BASIC ยุค 70–80 ที่มีบรรทัด
DATAไปจนถึงเกมบน Atari ST และ Amiga ก็ใช้วิธีนี้กันบ่อยแม้แต่ใน Java ก็เคยมีการใส่ฟอนต์ระดับพิกเซลไว้ในไฟล์
.javaโดยตรงและฉันเคยได้ยินว่าฟอนต์บางส่วนของ Linux kernel ก็จัดการแบบนี้เหมือนกัน
โปรเจ็กต์นี้น่าสนใจดี
ฉันไม่ต้องการฟีเจอร์แท็บหรือการจัดการเซสชันในเทอร์มินัลอีมูเลเตอร์
WM จัดการหน้าต่างและแท็บ ส่วน tmux จัดการเซสชัน สกอลล์แบ็ก การค้นหา และอื่นๆ
ดังนั้นเทอร์มินัลเรียบง่ายอย่าง urxvt, st, foot ก็เพียงพอสำหรับฉันแล้ว
Ghostty ไม่ค่อยตรงกับรสนิยมฉันเท่าไร แต่ตัวนี้น่าจะลองใช้ดูได้สักครั้ง
หวังว่าจะมี รองรับ OSC ตามแผน และถ้าเพิ่ม ระบบปลั๊กอิน ที่ยุ่งยากน้อยกว่า st ได้ก็คงดี