3 điểm bởi GN⁺ 2025-09-24 | 3 bình luận | Chia sẻ qua WhatsApp
  • libghostty đang được phát triển như một thư viện giả lập terminal nhúng có thể dùng trong bất kỳ ứng dụng nào
  • Thành phần đầu tiên, libghostty-vt, là API không có phụ thuộc nào, được tối ưu cho việc phân tích cú pháp và duy trì trạng thái
  • Dự án ra đời כדי giải quyết độ phức tạp của giả lập terminal và vấn đề phải triển khai lặp đi lặp lại, hướng tới đa nền tảng và tính di động cao
  • Trong tương lai, dự kiến sẽ mở rộng thêm các thư viện cho xử lý đầu vào bàn phím, kết xuất GPU, tích hợp nhiều framework
  • Hiện tại Zig API đã có thể thử nghiệm, và C API cũng sẽ sớm được công bố; dự án đang tích cực lắng nghe phản hồi từ người dùng

Giới thiệu và bối cảnh phát triển libghostty

  • libghostty là một dự án thư viện được thiết kế để nhúng khả năng giả lập terminal hiện đại, nhanh và đầy đủ vào mọi ứng dụng
  • Hiện nay, rất nhiều chương trình либо tự triển khai terminal emulator theo cách riêng, либо chỉ xây dựng riêng những chức năng terminal rất hạn chế
  • Những triển khai giả lập terminal được phát triển riêng lẻ như vậy thường là các codebase ad-hoc, dùng một lần, không xử lý đầy đủ ngoại lệ và độ phức tạp, nên hay gặp các vấn đề về thiếu hoàn chỉnh, lỗi và suy giảm hiệu năng
  • Với đa số lập trình viên, việc triển khai giả lập terminal không phải là nghiệp vụ cốt lõi, nên tồn tại nhu cầu về một giải pháp chung có khả năng tái sử dụng cao
  • libghostty cung cấp C API đa nền tảng được thiết kế với số phụ thuộc tối thiểu, qua đó cho phép nhiều ứng dụng tận dụng khả năng giả lập terminal ổn định và nhanh chóng

libghostty-vt: khởi đầu của thư viện đầu tiên

  • libghostty-vt là thư viện hoàn toàn không có phụ thuộc (thậm chí không cần cả libc), cung cấp API cho việc phân tích terminal sequence và duy trì trạng thái terminal như vị trí con trỏ, kiểu dáng, xuống dòng
  • Việc phân tích các terminal sequence này không chỉ là chức năng cốt lõi của terminal emulator, mà còn là thành phần bắt buộc cho các trang chỉ cần đầu ra có định dạng đơn giản như GitHub Actions, log build của Vercel, v.v.
  • Việc phân tích cú pháp terminal protocol nhìn bề ngoài có vẻ đơn giản, nhưng độ khó triển khai thực tế rất cao; trên thực tế đã có trường hợp nhiều implementation như Jediterm gặp vấn đề trong xử lý một số sequence
  • Một số lập trình viên chỉ dừng ở cách phân tích đơn giản các ANSI sequence, nhưng do nhu cầu xử lý kiểu dáng phức tạp (như nhiều cách biểu diễn RGB khác nhau) và yêu cầu tương thích đầy đủ, một parser tinh vi là điều bắt buộc
  • libghostty-vt được tách ra từ phần lõi đã được kiểm chứng của Ghostty, sở hữu phân tích cú pháp tối ưu bằng SIMD, hỗ trợ Unicode xuất sắc, cấu trúc bộ nhớ nâng cao, khả năng tương thích giao thức rộng (Kitty Graphics, Tmux Control Mode, v.v.)
  • Thư viện được cung cấp dưới dạng C API zero-dependency trong một tệp duy nhất, nên có thể dễ dàng nhúng vào mọi ngôn ngữ và môi trường phổ thông; ưu tiên hỗ trợ macOS, Linux (x86_64, aarch64) và sẽ dần mở rộng sang Windows, hệ nhúng, WASM, v.v.
  • Mức độ hỗ trợ mục tiêu còn có thể toàn diện hơn cả Ghostty GUI

libghostty sẽ mở rộng về dài hạn

  • Sau libghostty-vt, dự kiến sẽ lần lượt ra mắt thêm các nhóm thư viện cung cấp chức năng như xử lý đầu vào (mã hóa bàn phím, v.v.), kết xuất GPU (OpenGL, Metal), GTK widgetSwift framework
  • Các phần mở rộng chức năng này sẽ được tổ chức theo từng mô-đun để giảm thiểu phụ thuộc, kích thước mã nguồn và độ phức tạp bảo trì

Tình hình phát triển libghostty-vt

  • Một PR (pull request) gần đây để đưa libghostty-vt ra bên ngoài dưới dạng mô-đun Zig đã được merge, nên lập trình viên Zig có thể dùng ngay
  • C API hiện đang trong quá trình định nghĩa và sẽ sớm được cung cấp để thử nghiệm (logic lõi vốn đã là mã nguồn được kiểm chứng, được dùng trong Ghostty suốt nhiều năm)
  • Ứng dụng Ghostty trên macOS cũng sử dụng C API nội bộ, nhưng phần header nội bộ hiện tại không phù hợp để công khai ra bên ngoài và sử dụng phổ thông, nên một C API hoàn toàn mới đang được thiết kế
  • libghostty được quản lý phiên bản tách biệt với ứng dụng Ghostty, hiện ở giai đoạn alpha và kỳ vọng sớm được đón nhận cũng như có sự tham gia của các nhà phát triển language binding
  • Mục tiêu là phát hành bản release đầu tiên có gắn tag trong vòng 6 tháng tới

Kêu gọi phản hồi từ người dùng

  • Vì hiện tại đang ở giai đoạn thiết kế API, đây là thời điểm mà ý kiến và phản hồi từ người dùng thực tế đặc biệt quan trọng
  • Ngoài Ghostty, nhiều thành viên cộng đồng khác cũng đang phát triển các dự án dựa trên libghostty, và dự án mong muốn có thêm nhiều người tham gia
  • Nếu có ý tưởng ứng dụng hay nhu cầu nào với dự án, người dùng có thể trao đổi trực tiếp với nhà phát triển qua Discord của Ghostty hoặc email
  • libghostty hiện là phiên bản alpha nên API vẫn chưa ổn định, nhưng logic lõi đã được kiểm chứng thực tế và có độ ổn định cao

Triển vọng và tác động trong tương lai

  • Dựa trên việc ứng dụng Ghostty đã đạt được độ ổn định, giờ đây dự án có thể tiến tới mục tiêu lớn hơn là libghostty
  • Nếu libghostty được sử dụng rộng rãi trong nhiều ứng dụng khác nhau, nó có thể tạo ra tác động và sức lan tỏa hệ sinh thái lớn hơn nhiều so với chỉ một ứng dụng Ghostty đơn lẻ
  • Khi việc sử dụng libghostty tăng lên, bản thân Ghostty cũng sẽ có thêm nhiều tính năng phong phú hơn và độ ổn định cao hơn
  • Ghostty và libghostty sẽ phát triển theo hướng bổ trợ lẫn nhau, mang lại lợi ích cho cả nhà phát triển lẫn người dùng

3 bình luận

 
yshrust 2025-09-24

Tôi đã dùng từ 1.0, và ngoài việc không có cuộn và tìm kiếm thì nhìn chung tôi khá hài lòng haha. Trước đây tôi dùng iTerm, nhưng giờ đã ổn định với nó rồi.

 
GN⁺ 2025-09-24
Ý kiến trên Hacker News
  • Thật huyền thoại khi thấy người này sau khi đã khởi nghiệp, đưa công ty lên sàn, rồi bán với giá hàng tỷ đô vẫn quay lại thế giới lập trình

    • Theo tôi, Hashimoto không chỉ là thiên tài mà còn có năng lực trừu tượng hóa phi thường: mô-đun hóa hệ thống và giao diện đến mức tối đa, giảm thiểu sự ràng buộc lẫn nhau đến cực điểm. Cảm giác như anh ấy là người thực hành đúng tinh thần Simple Made Easy mà Rich Hickey từng nói tới. Phần mềm của anh ấy cho cảm giác được thiết kế theo cách gần như buộc phải hoạt động đúng. Và tôi vừa thử Ghostty lần đầu, trước đây với iTerm2 và theme Zsh/Powerlevel10k tôi luôn thấy hơi trễ khi render, còn trên ghostty thì phản hồi gần như tức thì

    • Vừa thật sự ngưỡng mộ, vừa thấy như một cuộc đời trong mơ. Có được của cải rồi tiếp tục sáng tạo chỉ vì bản thân dự án, ở trong hoàn cảnh không phải thỏa hiệp về chất lượng vì tiền. Điều đó làm tôi nhớ tới một câu nói cũ của Knuth

      Để hàng nghìn nhà khoa học máy tính được tự do làm điều họ muốn chính là thứ thúc đẩy sự tiến bộ của học thuật

      Rõ ràng những dự án được làm bằng tình yêu đang ngày càng đạt thành công lớn hơn. Điều đó cho thấy nếu không bị ám ảnh bởi tiền bạc thì có thể tạo ra kết quả tốt hơn. Mặt khác, điều này cũng khiến ta phải nhìn lại cấu trúc xã hội và toàn bộ nền kinh tế, vì để tận hưởng kiểu cuộc sống này thì trước hết vẫn cần có một mức vốn nào đó. Như Knuth nói, nếu chỉ có thêm chút thời gian thôi, có lẽ ai cũng có thể tạo ra kết quả tốt hơn, nhưng vì lúc nào cũng gấp gáp nên ta phải hy sinh quá nhiều. Và giống như một câu nói khác của ông

      Nếu cố tối ưu hóa mọi thứ thì bạn sẽ không bao giờ có thể hạnh phúc

      Đến đây tôi bắt đầu tự hỏi: liệu chúng ta có thực sự đang trả công xứng đáng cho những người giải quyết vấn đề tốt và làm cho cuộc sống dễ dàng hơn không, hay chỉ đang tăng điểm số trong một trò chơi vô nghĩa? Làm thế nào để tạo ra nhiều huyền thoại hơn? Làm sao để xây dựng một xã hội nơi người ta có thể sống theo đam mê như Mitchell mà không phải mang gánh nặng đi giải thích giá trị của chất lượng với hội đồng quản trị?

    • Tôi đã từng gặp anh ấy ngoài đời, đúng là một người rất ấm áp và tử tế. Tôi đã ăn trưa cùng anh ấy ở một hội nghị khi còn ở Kiip trước thời Hashicorp. Mitchell đúng là một hacker thực thụ. Có thể cảm nhận được anh ấy thật lòng yêu mọi thứ liên quan đến máy tính. Đặc biệt ở các hội nghị về hệ thống phân tán, anh ấy cực kỳ tập trung. Tôi có cảm giác anh ấy làm gì rồi cũng sẽ thành công. Từ khi biết đến và dùng Ghostty, tôi vẫn đang rất hài lòng và tiếp tục sử dụng

    • Và giờ người này còn đang đắm mình vào cả việc phát triển phần mềm tty, một mảng thực sự rất “fan cuồng” trong cả stack công nghệ Unix

    • Tôi dùng ghostty mỗi ngày mà đến giờ mới biết người tạo ra nó là Mitchell Hashimoto, đúng là một trải nghiệm rất tuyệt

  • Ghostty thật sự rất tuyệt, tôi rất mong chờ một terminal emulator omni-platform thực thụ có thể mở rộng sang cả di động. Việc Ghostty được viết bằng Zig cũng rất thú vị. Đây là chương trình viết bằng Zig đầu tiên mà tôi dùng thường xuyên, và cấu trúc repository của nó làm tôi thấy vui vì giống hệt phong cách Golang https://github.com/ghostty-org/ghostty

    • (Không giống layout của Go đâu) Mà như vậy lại là điểm tốt, cấu trúc thư mục kiểu pkg/ src/ của Go thực ra không phải là một cấu trúc hay lắm
  • Tôi rất muốn thật sự thích Ghostty nhưng vẫn có vài điểm đáng tiếc

    • Chưa hỗ trợ tìm kiếm bằng ⌘F
    • Không có cách chỉ dùng bàn phím để chọn/copy đầu ra trước đó hoặc một chuỗi cụ thể
    • Phím ⌘. không gửi CTRL-C (đây là tính năng người dùng Mac thường mong đợi)
    • Việc render font vẫn chưa mượt bằng Terminal.app, tôi đã thử chỉnh bằng font-thicken-strength nhưng vẫn chưa thể giống 100%. Có vẻ do đặc tính render của Metal nên hoặc là không thể, hoặc là rất khó. Với người nhìn văn bản cả ngày thì đây là điểm cực kỳ quan trọng
    • Có thể cấu hình để nhấn ⌘. sẽ gửi CTRL-C
      keybind = "cmd+.=text:\x03"
      
      Thảo luận liên quan: https://news.ycombinator.com/item?id=42889411
    • Sắp được hỗ trợ: https://ghostty.org/docs/install/release-notes/1-2-0#roadmap
    • Tìm kiếm trong scrollback dự kiến sẽ có ở bản 1.3 nhưng có lẽ còn mất khoảng 6 tháng nữa. Ghostty gần đây cũng đang phát triển rất nhanh nên release note 1.2 cũng đáng để xem
    • Nhìn điểm upvote/downvote dao động mạnh, có vẻ bài tôi viết đã gây hiểu lầm. Thực ra khái niệm cross-platform nhưng triển khai GUI native theo từng vendor là quá tuyệt. Tôi rất vui vì dự án này thực sự tồn tại, chỉ là cá nhân tôi thấy nó vẫn chưa hoàn hảo. Dù vậy tôi vẫn đang kỳ vọng và theo dõi
    • Điểm thứ hai (chọn đầu ra trước đó bằng bàn phím) là lý do chính khiến tôi vẫn tiếp tục dùng WezTerm
  • Sự nhiệt huyết và mức độ chú ý đến chi tiết mà Mitchell dành cho trải nghiệm lập trình viên thật sự đáng kinh ngạc. Tôi vẫn còn nhớ rõ cảm giác ấn tượng khi lần đầu dùng Vagrant ở Santa Monica năm 2011. Tôi chưa từng nghĩ mình sẽ thay iTerm2, nhưng gặp Ghostty là mê ngay

  • Dạo này tôi dùng ghostty hằng ngày. Mới chuyển sang gần đây. Trên macOS, tôi map caps lock thành cmd nên cmd+c cũng hoạt động tốt. Mặc định của nó được thiết lập rất thông minh, và ngoài việc tùy biến không quá dễ thì tôi đều hài lòng. Theme Gruvbox light cũng rất đẹp. Bản thân việc nó được viết bằng Zig đã quá ngầu rồi, nên nếu ai thắc mắc Zig đã đủ sẵn sàng cho sử dụng thực tế chưa thì ghostty chính là câu trả lời. Có vẻ tôi sẽ không quay lại terminal khác nữa, trải nghiệm thật sự rất hài lòng. Tham khảo thêm: kết hợp ghostty với aerospace thì trên Mac gần như có thể tạo ra một môi trường hoàn hảo chỉ với bàn phím

    • Tôi muốn hỏi vì sao nên dùng ghostty (từ góc nhìn của người hiện đang dùng Terminal.app làm chính)
    • Clickhouse, Bun cũng là những dự án cực kỳ ấn tượng
  • Tôi đang dùng ghostty trên chiếc AirMac, là máy Mac anh trai để lại khi trước còn lập trình. Tôi thật sự biết ơn vì ghostty quá tốt. Có thể chỉ là chuyện nhỏ, nhưng việc không phụ thuộc vào libc bằng cách nào đó lại khiến tôi thấy khá đáng quý

  • Biểu đồ histogram phân tích tần suất của visidata không render đúng, một số ô hiện ra thành hình vuông, còn phần còn lại hiện thành dấu hỏi trong hình thoi, nên vì vấn đề này mà tôi vẫn chưa thể rời iTerm. Tôi cũng không biết nên tìm bằng từ khóa nào để giải quyết nên càng khó xử

    • Có thể các codepoint đó bị thiếu trong font chính và font dự phòng. Nếu là người dùng ghostty, tôi khuyên nên kiểm tra xem trong iTerm2 các glyph đó đang hiển thị bằng font nào, rồi tìm xem ghostty có thiết lập phù hợp không
  • Tôi vẫn đang theo dõi Ghostty với hy vọng text reflow của nó (đặc biệt là cả phần scrollback) có thể được giải quyết cả trong terminal dựa trên Neovim. Tôi rất mừng khi Ghostty mang thêm đổi mới vào môi trường terminal https://github.com/neovim/neovim/issues/33155

    • Không biết bạn có phải là power user của terminal trong neovim không. Trước đây tôi đã thử đổi workflow từ kiểu tmux chạy neovim sang để neovim trực tiếp quản lý terminal. Tôi nghĩ như vậy sẽ tiện hơn vì file chỉ cần mở trong một buffer duy nhất. Trước đây khi mở file ở pane nào đó thì nhiều lúc nó đã được mở sẵn trong một instance neovim khác, nên tôi mới thử thay đổi như vậy. Trong lúc thử nghiệm, tôi không cảm nhận thấy vấn đề reflow nào đặc biệt có thể được giải quyết nếu chuyển sang libghostty, mà ngược lại tôi còn thấy khó thích nghi với chính sự thay đổi về mô hình hơn. Với tư cách là người rất mê terminal tích hợp của neovim, tôi muốn nghe trải nghiệm thực tế về việc áp dụng libghostty sẽ cải thiện điều gì
  • Tôi thật sự muốn dùng ghostty nhưng vì chưa có hỗ trợ cmd+f nên vẫn chưa thử, tuy vậy tôi rất mong chờ dự án này tiếp tục phát triển

    • Có trong roadmap
      https://ghostty.org/docs/install/release-notes/1-2-0#roadmap
    • Có thể dùng một phím như cmd+shift+f để mở toàn bộ buffer trong trình soạn thảo văn bản mặc định rồi tìm kiếm ở đó. Nhiều người đã xoay xở bằng cách này, tôi cũng vậy; đây là phương án thay thế khá thực dụng cho tới khi có tính năng tìm kiếm scrollback tích hợp
    • Tôi thắc mắc vì sao tính năng này không được thêm vào từ sớm, vì tìm kiếm lịch sử trong terminal là thứ thiết yếu, hay có lý do phức tạp nào đó chăng? Thực ra chính Mitchell đã tự mở issue này từ 2 năm trước
      https://github.com/ghostty-org/ghostty/issues/189
    • Nhiều người than phiền vì không có tìm kiếm lịch sử như cmd+f, nhưng bản thân tôi dù có thể dùng cũng chưa từng dùng lần nào. Nếu ai có thể giải thích workflow khi dùng tính năng đó thì sẽ rất hay, vì tôi tự hỏi liệu mình có đang bỏ lỡ điều gì lớn không
    • Cũng có thể chạy tmux bên trong rồi map cmd+f sang copy-mode + /