3 คะแนน โดย GN⁺ 2026-03-21 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เดโมเทอร์มินัลที่มีฟังก์ชันขั้นต่ำซึ่งสร้างบน 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

  • ข้อกำหนดที่จำเป็น: CMake 3.19 ขึ้นไป, C compiler, และ Zig 0.15.x ใน PATH
  • หากยังไม่ได้ติดตั้ง Raylib ระบบจะดาวน์โหลดให้อัตโนมัติผ่าน FetchContent ของ CMake
  • ขั้นตอน build พื้นฐาน
    cmake -B build -G Ninja  
    cmake --build build  
    ./build/ghostling  
    
  • ข้อควรระวัง: build แบบ debug จะช้ามากเนื่องจากมีการตรวจสอบความปลอดภัย จึงไม่เหมาะกับการ benchmark
  • Release build
    cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release  
    cmake --build build  
    
  • หลังตั้งค่าเริ่มต้นแล้ว สามารถรันเพียง cmake --build 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 ความคิดเห็น

 
GN⁺ 2026-03-21
ความคิดเห็นจาก Hacker News
  • ฉันใช้ libghostty กับ Trolley อยู่
    โปรเจ็กต์นี้แพ็ก TUI ให้เป็นแอปเดสก์ท็อป คล้ายกับการเอาเว็บแอปไปห่อด้วย Electron
    มันแค่เพิ่มตัว bundle สำหรับ GUI และ CLI เข้าไป แต่กลับทำงานบน Windows ได้สมบูรณ์แบบ
    ฉันประทับใจนักพัฒนา Ghostty อย่างมากจริงๆ

    • ถ้ามี ภาพหน้าจอ สักภาพใน GitHub README ของคุณก็น่าจะดี
      น่าจะช่วยให้เข้าใจได้ทันทีว่าแอปเพิ่ม chrome (ส่วนกรอบ UI รอบนอก) อะไรไว้รอบ TUI บ้าง
  • ไฟล์ C เล็กมากจนอ่านจบได้ในไม่กี่นาที
    พอถึงประมาณบรรทัดที่ 5 ฉันก็แปลกใจกับวิธีฝังฟอนต์ด้วย เฮดเดอร์ที่สร้างอัตโนมัติ
    ฉันคุ้นกับวิธีใช้ทรัพยากรของ Windows มากกว่า แต่นี่เป็นโครงสร้างที่ใช้โค้ด CMake สร้างอาร์เรย์ไบต์
    มันทั้งชวนช็อกนิดๆ และน่าประทับใจ — เหมือนในที่สุดก็เจอวิธีทำ การฝังทรัพยากรไบนารีข้ามแพลตฟอร์ม แล้ว

    • ขอแชร์สคริปต์ buildที่ใช้ตรงนี้
      ด้วยคำสั่ง cmake -DINPUT=pixel.gif -DOUTPUT=pixel.h -DARRAY_NAME=pixel_gif -P bin2header.cmake
      ก็สามารถแปลง GIF ขนาด 1x1 พิกเซลให้เป็น C array ได้
      ภาพจะถูกใส่ลงไปในเฮดเดอร์ที่สร้างอัตโนมัติเป็นอาร์เรย์ไบต์แบบตรงๆ
    • เรื่องน่าสนใจคือ บิตแมป XPM เดิมทีถูกออกแบบมาให้ #include ได้โดยไม่ต้องแก้ไข
      วิกิ X PixMap อธิบายโครงสร้างนี้ไว้ค่อนข้างดี
    • จะใช้คำสั่ง xxd จากแพ็กเกจ vim สร้างอาร์เรย์แบบนี้ก็ได้
      แต่กับทรัพยากรขนาดใหญ่จะไม่มีประสิทธิภาพ — gcc/clang กินหน่วยความจำจนระเบิด
      เพราะงั้นฉันเลยใช้ โปรเจ็กต์ LIEF
      มันช่วยแทรกทรัพยากรเข้าไปในไบนารี Windows PE, macOS Mach-O, Linux ELF และอ่านกลับออกมาได้
      ทำให้ฉันสร้าง ระบบ bundle ทรัพยากรข้ามแพลตฟอร์ม ที่ไม่มีข้อจำกัดด้านขนาดได้
    • ในฐานะโปรแกรมเมอร์ Windows ฉันรู้สึกว่าน่าสนใจที่ได้เห็นการเรียก DrawTextEx
      มันเป็นตัวอย่างที่แสดง ความยืดหยุ่นในการแสดงผล ของไลบรารี Ghostty ได้ดี
      การเลือกไลบรารีอื่นๆ ก็ดีมากเช่นกัน และมันทำให้ฉันมีแรงบันดาลใจอยากลองสร้างแอปเทอร์มินัลเองบ้าง
    • ฉันไม่ค่อยเห็นด้วยกับคำว่า “ในที่สุดก็เจอแล้ว”
      การ รวมไบนารีไว้ในซอร์สโค้ด เป็นเทคนิคเก่าแก่มาก
      ตั้งแต่ BASIC ยุค 70–80 ที่มีบรรทัด DATA ไปจนถึงเกมบน Atari ST และ Amiga ก็ใช้วิธีนี้กันบ่อย
      แม้แต่ใน Java ก็เคยมีการใส่ฟอนต์ระดับพิกเซลไว้ในไฟล์ .java โดยตรง
      และฉันเคยได้ยินว่าฟอนต์บางส่วนของ Linux kernel ก็จัดการแบบนี้เหมือนกัน
  • โปรเจ็กต์นี้น่าสนใจดี
    ฉันไม่ต้องการฟีเจอร์แท็บหรือการจัดการเซสชันในเทอร์มินัลอีมูเลเตอร์
    WM จัดการหน้าต่างและแท็บ ส่วน tmux จัดการเซสชัน สกอลล์แบ็ก การค้นหา และอื่นๆ
    ดังนั้นเทอร์มินัลเรียบง่ายอย่าง urxvt, st, foot ก็เพียงพอสำหรับฉันแล้ว
    Ghostty ไม่ค่อยตรงกับรสนิยมฉันเท่าไร แต่ตัวนี้น่าจะลองใช้ดูได้สักครั้ง
    หวังว่าจะมี รองรับ OSC ตามแผน และถ้าเพิ่ม ระบบปลั๊กอิน ที่ยุ่งยากน้อยกว่า st ได้ก็คงดี