Ghostel.el - trình giả lập terminal cho Emacs dựa trên libghostty
(dakra.github.io)- Ghostel là trình giả lập terminal cho Emacs dùng cùng engine
libghostty-vtnhư Ghostty; mô-đun native Zig đảm nhiệm trạng thái terminal, render và I/O PTY cục bộ, còn Elisp quản lý keymap, buffer, lệnh và tiến trình từ xa - Hỗ trợ giao thức bàn phím và đồ họa Kitty, siêu liên kết OSC 8, truy vấn màu OSC 4/10/11, đầu ra đồng bộ DEC 2026 và 5 chế độ nhập liệu; đồng thời tự động áp dụng tích hợp shell cho bash, zsh, fish và nushell cục bộ
- Hỗ trợ Emacs 28.1 trở lên cùng macOS, Linux, FreeBSD và Windows native; khi dùng lần đầu có thể tự động tải mô-đun dựng sẵn theo từng nền tảng nên cài đặt thông thường không cần toolchain Zig
- Trong benchmark xử lý đầu ra 1MB trên Apple M4 Max và Emacs 32.0.50, với ASCII thông thường, Ghostel đạt 75MB/s, vterm 18MB/s, eat 6.2MB/s; PTY native xử lý tác vụ
cat10MB trong khoảng 110ms - Cung cấp terminal từ xa qua TRAMP, bảo vệ nhập mật khẩu, ảnh inline Kitty, cùng tích hợp với compile, Eshell, Comint, Evil và bộ gõ, nhưng với đích từ xa và xử lý ảnh thì có giới hạn về nền tảng và giao thức
Cấu trúc và cài đặt
- Ghostel lấy cảm hứng từ thiết kế 2 lớp của emacs-libvterm, nhưng dùng engine VT hiện đại của Ghostty thay vì libvterm
- Mô-đun Zig xử lý trạng thái terminal, render, mã hóa phím, PTY cục bộ và đọc nền
- Elisp phụ trách keymap, buffer, lệnh, tích hợp project và tiến trình từ xa qua TRAMP
- Yêu cầu là Emacs 28.1 trở lên có hỗ trợ dynamic module, cùng macOS, Linux, FreeBSD hoặc Windows native
- Binary dựng sẵn được cung cấp cho
aarch64-macos,x86_64-macos,x86_64-linux,aarch64-linux,x86_64-freebsd,x86_64-windows,aarch64-windows - Với nền tảng khác hoặc tự dựng từ mã nguồn thì cần Zig 0.15.2
- Binary dựng sẵn được cung cấp cho
- Có thể cài qua MELPA,
use-package :vccủa Emacs 30 trở lên,:load-path, hoặcrequirethủ công; mở terminal bằngM-x ghostel - Nếu chưa có mô-đun native, tùy theo thiết lập
ghostel-module-auto-installmà hệ thống sẽ đề xuất tải về hoặc biên dịch từ mã nguồnM-x ghostel-download-modulesẽ lấy binary được hỗ trợ tối thiểu; nếu truyền đối số tiền tố thì có thể chọn release tagM-x ghostel-module-compiledựng mô-đun bằngzig build- Nếu thư mục package có thể bị cài lại, có thể chỉ định
ghostel-module-directorysang vị trí riêng
- Bản dựng từ mã nguồn bao gồm
vendor/emacs-module.hđã được tạo sẵn nên thông thường không cần header Emacs cục bộ; có thể đổi vị trí header bằngEMACS_INCLUDE_DIRhoặcEMACS_BIN_DIRxterm-ghosttyterminfo đã biên dịch được kèm trongetc/terminfo/, ở định dạng tương thích giữa BSD và ncurses
Hỗ trợ Windows
- Trên Emacs Windows native, terminal cục bộ chạy bằng ConPTY; kiến trúc của DLL mô-đun phải khớp với kiến trúc Emacs chứ không phải Windows
- Cùng với mô-đun dựng sẵn, hệ thống sẽ tải các tệp hỗ trợ
conpty.dllvàOpenConsole.exe; nếu thiếu các tệp này thì sẽ dùng API ConPTY tích hợp của Windows thay thế - Các bản dựng Emacs tùy biến đặc biệt như CRT tĩnh chỉ được hỗ trợ theo hướng cố gắng tối đa
- Terminal TRAMP trên Windows chỉ hỗ trợ đích từ xa POSIX, PTY nằm trên host từ xa, và hiện chưa hỗ trợ đổi kích thước cửa sổ động
5 chế độ nhập liệu
- Chế độ semi-char mặc định gửi hầu hết phím tới terminal nhưng giữ lại các ngoại lệ như
C-c,C-x,C-u,C-h,M-x,M-:,C-\cho Emacs- Cung cấp các phím để gửi interrupt, suspend, EOF, bracketed paste, xóa scrollback, và di chuyển giữa prompt cùng siêu liên kết
- Chế độ char gửi mọi phím tới terminal nên phù hợp với TUI tự dùng
C-x,M-x,C-h; chỉ cònM-RETlà phím thoát - Chế độ Emacs tiếp tục nhận đầu ra terminal nhưng chuyển buffer sang chỉ đọc để cho phép điều hướng Emacs tiêu chuẩn như
isearch,occur, đánh dấu và sao chép- Nhập liệu thông thường sẽ không được chuyển tới shell; chỉ thao tác dán
C-ycó chủ đích mới được gửi dưới dạng bracketed paste
- Nhập liệu thông thường sẽ không được chuyển tới shell; chỉ thao tác dán
- Chế độ copy dừng cập nhật terminal để có thể chọn, điều hướng và sao chép ổn định
- Trong văn bản đã sao chép, các dấu xuống dòng sinh ra do soft wrap sẽ bị loại bỏ
- Với mặc định
ghostel-readonly-fast-exit=t, sau khi nhập ký tự hoặc sao chép sẽ tự động quay lại phiên terminal bình thường
- Chế độ line không gửi phím ngay tới shell mà cho phép chỉnh một dòng trong buffer Emacs rồi gửi toàn bộ khi nhấn
RET- Ngay cả khi đầu ra bất đồng bộ hoặc prompt mới xuất hiện, phần nhập đang soạn vẫn được giữ bằng snapshot rồi chèn lại
- Nếu có OSC 133 thì dùng ranh giới prompt; nếu không thì tìm ranh giới bằng
ghostel-prompt-regexp - Khi TUI toàn màn hình khởi chạy, hệ thống chuyển sang chế độ semi-char rồi quay lại chế độ line sau khi TUI thoát
TABdùng hoàn tất kiểu comint và tùy chọn bash programmable completion
- Kéo chuột, nhấp nhiều lần, kích hoạt mark, hoặc rời khỏi vị trí nhập hiện tại bằng
isearchhayconsult-linemặc định sẽ chuyển sang chế độ copy để bảo vệ lựa chọn và vị trí- Nếu TUI đã bật theo dõi chuột DEC thì sự kiện chuột trong chế độ nhập sẽ được chuyển tới chương trình đó
- Có thể thay đổi hành vi chuyển bằng
ghostel-mouse-drag-input-mode,ghostel-mark-activation-input-mode,ghostel-point-leave-input-mode
Tính năng terminal và render
- Thông qua libghostty-vt, hỗ trợ mô phỏng VT đầy đủ, 256 màu và màu 24-bit, alternate screen, nhiều kiểu và màu gạch chân, đậm, nghiêng, mờ, gạch ngang, đảo màu, cùng bốn kiểu con trỏ và nhấp nháy
TERM=xterm-ghosttymặc định và terminfo đi kèm thông báo cho ứng dụng về các tính năng như đầu ra đồng bộ DEC 2026, bàn phím Kitty, true color, gạch chân màu và báo cáo focus- Qua truy vấn OSC 4/10/11, TUI có thể lấy bảng màu cùng màu foreground/background từ màu face của Emacs
- Clipboard OSC 52 được hỗ trợ nhưng mặc định bị tắt, nên terminfo đi kèm không quảng bá tính năng
Ms
- Scrollback mặc định là 5MB, khoảng 5.000 dòng, được materialize thành buffer Emacs nên có thể tìm bằng
isearchvàconsult-line - Ngoài siêu liên kết OSC 8, còn phát hiện URL HTTP·HTTPS thông thường và đường dẫn tệp dạng
/path/file.el:42để biến thành liên kết có thể nhấp - Hỗ trợ bộ mã hóa phím Ghostty và giao thức bàn phím Kitty, sự kiện chuột SGR, sự kiện focus DEC 1004, kéo thả đường dẫn tệp và văn bản
- Renderer bỏ qua các dòng không đổi, gom cập nhật theo timer và điều chỉnh tốc độ khung hình một cách thích ứng
- Echo PTY đến ngay sau khi gõ phím sẽ bỏ qua timer mặc định 33ms để render tức thì
ghostel-sync-themesẽ đồng bộ lại bảng màu theo theme Emacs
- 16 màu ANSI là các face Emacs kế thừa từ
term-color-*, và có thể đặt font, cỡ chữ, foreground, background riêng cho terminal bằngghostel-default
Tích hợp shell và gọi Emacs
- Với bash·zsh·fish·nushell, tự động cấu hình theo dõi thư mục OSC 7, di chuyển dấu nhắc OSC 133, theo dõi tiêu đề OSC 2 và
ghostel_cmd- Tích hợp shell riêng của nushell cung cấp OSC 7·133·2, còn
ghostel.nubổ sungghostel_cmdvà wrapper terminfo SSH outbound - bash 3.2 tích hợp sẵn trên macOS bỏ qua
ENVdùng cho việc chèn tự động, nên cần dùng bash mới hơn hoặc nạpghostel.bashthủ công
- Tích hợp shell riêng của nushell cung cấp OSC 7·133·2, còn
ghostel_cmd, dùng để gọi Elisp từ shell, sử dụng mở rộng OSC 52;e chuyên dụng và chỉ thực thi các hàm có trong danh sách cho phépghostel-eval-cmds- Các hàm được cho phép mặc định là
find-file,find-file-other-window,dired,dired-other-window,message
- Các hàm được cho phép mặc định là
- Bookmark Emacs lưu thư mục làm việc của terminal và tên buffer
- Nếu đã có buffer hiện hữu thì tái sử dụng, nếu không thì khởi động shell mới trong thư mục đã lưu
- Không lưu scrollback và nội dung phiên
Mật khẩu·clipboard·thông báo
- Khi phát hiện lời nhắc nhập mật khẩu như
sudo,ssh,gpg,passwd, nó sẽ mởread-passwdvà gửi trực tiếp câu trả lời vào PTY, nên dữ liệu nhập sẽ không lưu lại trongview-lossage, recent key ring hay keyboard macro- Ở local, xác nhận canonical mode và việc tắt echo bằng
tcgetattr - Chỉ ở shell từ xa mới dùng phát hiện thay thế bằng biểu thức chính quy để giảm false positive với TUI raw-mode cục bộ
- Sau khi truyền xong, chuỗi mật khẩu được xử lý ngay bằng
clear-string - Có thể thêm các nguồn như auth-source, KeePass, pass vào
ghostel-password-prompt-functions
- Ở local, xác nhận canonical mode và việc tắt echo bằng
- Khi bật OSC 52 một cách rõ ràng, chương trình từ xa có thể đặt Emacs kill ring và clipboard hệ thống, còn thao tác dán được gửi bằng bracketed paste
- Thông báo OSC 9 và OSC 777 được chuyển tới
ghostel-notification-function- Handler mặc định sẽ dùng alert nếu đã cài, nếu không thì thay bằng
messageở vùng echo
- Handler mặc định sẽ dùng alert nếu đã cài, nếu không thì thay bằng
- Tiến trình OSC 9;4 truyền các trạng thái
remove,set,error,indeterminate,pausevà giá trị từ 0~100- Cung cấp chỉ báo văn bản mặc định và chỉ báo hoạt ảnh dựa trên spinner.el
Ảnh inline của Kitty
- Hỗ trợ đặt trực tiếp và đặt bằng Unicode-placeholder U+10EEEE của Kitty graphics protocol, cho phép render ảnh từ
timg,kitty +kitten icat,yaziv.v. - PNG được xử lý bằng bộ giải mã stb tích hợp, còn dữ liệu RGB·RGBA·Gray·GrayAlpha được chuyển sang PPM trong native module, nên không cần ImageMagick
- Phản hồi các truy vấn kích thước CSI 14·16·18
t, và có thể đặt tỷ lệ pixel vật lý bằngghostel-cell-pixel-scale - Xử lý ảnh có các giới hạn sau
- Alpha channel không được compositing mà bị loại bỏ, nên không phù hợp với viền bán trong suốt
- Không hỗ trợ cắt một phần bằng Kitty source-rect và sẽ trả về lỗi tường minh
- Nhiều placement ảo trong cùng một buffer dùng chung một lần render, và lần truyền gần nhất được ưu tiên
- Mặc định chỉ cho phép inline base64, còn file·temporary file·shared memory phải được bật rõ ràng vì lý do an toàn
- Giới hạn lưu trữ đồ họa mặc định cho mỗi terminal là 320MiB
TRAMP và terminfo từ xa
- Nếu
default-directorylà đường dẫn TRAMP thì shell sẽ chạy trên host POSIX tương ứng, và có thể chỉ định các phương thức TRAMP kiểu SSH cùng shell nhưdockerbằngghostel-tramp-shellslogin-shellphát hiện shell đăng nhập của người dùng từ xa bằnggetent passwd- Theo dõi thư mục OSC 7 giữ nguyên phương thức, người dùng và tiền tố multi-hop hiện có của TRAMP
- Đích từ xa Windows không được hỗ trợ trong đường dẫn shell·tty POSIX này
- Tích hợp shell từ xa mặc định không được chèn, và có hai cách triển khai
- Với
ghostel-tramp-shell-integration=t, script tạm được truyền đi và dọn dẹp khi thoát - Với host cố định, có thể cài trực tiếp script
etc/shell/và tùy chọn cả terminfo
- Với
- Nếu phía từ xa không có terminfo
xterm-ghostty, việc mở terminal có thể thất bại, nênghostel-ssh-install-terminfosẽ xử lý cài đặt- Khi chạy qua TRAMP, terminfo được truyền vào thư mục tạm qua kết nối hiện có và bị xóa khi thoát
sshchạy từ Ghostel local sẽ chuẩn hóa đích bằngssh -G, tra cache rồi nếu cần sẽ dùng thêm một kết nối để chạytic -x -- Hash terminfo local được đưa vào khóa cache nên sẽ tự vô hiệu khi libghostty được cập nhật, nhưng không phát hiện được terminfo đã bị thay đổi riêng ở phía từ xa
- Với
ssh HOST cmd, các lệnh gọi tùy chọn không có host, hoặc khi local không cóinfocmp, việc cài đặt sẽ bị bỏ qua
- Nếu không muốn chỉnh sửa host từ xa, có thể tắt tự động cài đặt và tự cài terminfo; đổi
ghostel-termsangxterm-256colorthì không cần cấu hình liên quan, nhưng cũng mất luôn đường dẫn tăng tốc synchronized output riêng cho Ghostty
Tính năng mở rộng của Emacs
- evil-ghostel đồng bộ trạng thái insert·normal của Evil với con trỏ terminal
- Hỗ trợ di chuyển, chèn, xóa, thay đổi, thay thế, bracketed paste, readline undo và hình dạng con trỏ theo từng trạng thái
- Không ảnh hưởng tới vim·less·htop trong alternate screen
ghostel-compilechạy lệnh trên PTY thực trong khi cung cấp header·footer·highlight lỗi·điều hướngnext-errortheo kiểucompilation-mode- Mặc định là chế độ duyệt chỉ đọc, còn nếu đưa prefix argument thì sẽ truyền input tương tác
- Ngay cả khi đang chạy, vẫn có thể chuyển giữa input tương tác và điều hướng biên dịch bằng
C-c C-jvàC-c C-ehoặcC-c C-t ghostel-compile-global-modegửi các lệnh gọicompile,recompile,project-compilevàcompilation-startsang Ghostelgrep-modemặc định vẫn giữ cách triển khai hiện có
ghostel-eshell-visual-command-modechạy các visual command của Eshell như vim·htop·less trong buffer Ghostel chuyên dụng thay vìterm-modeghostel-comint-modexử lý luồng output comint bằnglibghostty-vt, cung cấp true color, nhiều kiểu gạch chân, liên kết OSC 8 và cập nhật thư mục OSC 7- Vì không phải terminal hoàn chỉnh nên không hỗ trợ đặt con trỏ, alternate screen hay vẽ lại toàn màn hình, và không phù hợp với
htophoặcless
- Vì không phải terminal hoàn chỉnh nên không hỗ trợ đặt con trỏ, alternate screen hay vẽ lại toàn màn hình, và không phù hợp với
ghostel-ime-modexóa kết quả của bộ gõ Elisp chèn ký tự trực tiếp vào buffer như Hangul rồi truyền vào PTY dưới dạng UTF-8- Trong lúc đang kết hợp Quail, việc render được trì hoãn để buffer không ghi đè chuỗi đang soạn
Hiệu năng
- Kết quả khi gửi 1MB qua pipe tiến trình thực trên Apple M4 Max và Emacs 32.0.50, đồng thời giữ khoảng 1.000 dòng scrollback, như sau
- ASCII thông thường: Ghostel 75MB/s, Ghostel tắt phát hiện liên kết 76MB/s, vterm 18MB/s, eat 6,2MB/s, term tích hợp 7,2MB/s
- Đầu ra có nhiều URL: Ghostel 36MB/s, Ghostel tắt phát hiện liên kết 78MB/s, vterm 15MB/s, eat 4,5MB/s, term 5,9MB/s
- Phát hiện URL·đường dẫn tệp chạy trên bộ hẹn giờ hợp nhất bên ngoài đường đi vẽ lại nên gần như không tốn chi phí với đầu ra thông thường, nhưng với đầu ra dày đặc liên kết thì thông lượng giảm khoảng một nửa
- Để so sánh công bằng, các số liệu trên dùng đường đi tiến trình Emacs; native PTY cục bộ mặc định nhanh hơn khoảng 2 lần trong các đợt dump dung lượng lớn liên tục vì luồng nền Zig đọc đầu ra
- Trung vị của 5 lần
cattệp 10MB là Ghostel native khoảng 110ms, Ghostel Emacs PTY khoảng 220ms, vterm khoảng 550ms, eat khoảng 1,8 giây- vterm và eat chiếm luồng chính của Emacs một cách đồng bộ trong lúc truyền, còn Ghostel native PTY phân tích ở nền nên UI vẫn tiếp tục phản hồi
M-x ghostel-debug-typing-latencyđo giá trị nhỏ nhất, trung vị, p99 và lớn nhất của độ trễ PTY·rendering·tổng thể theo từng phím
Khác biệt với vterm·eat
- vterm dùng native module libvterm viết bằng C, còn eat được viết hoàn toàn bằng Elisp nên có thể portable mà không cần build, đổi lại thông lượng thấp hơn
- Chỉ Ghostel hỗ trợ đầy đủ bàn phím·đồ họa Kitty, năm kiểu gạch dưới, OSC 8, OSC 4/10/11, thông báo OSC 9·777, tiến trình OSC 9;4 và DEC 2026
- eat hỗ trợ ảnh Sixel nhưng không hỗ trợ ảnh Kitty, còn vterm không hỗ trợ cả hai giao thức ảnh
- Ghostel và eat chuyển tiếp sự kiện chuột SGR tới TUI, còn vterm dùng thao tác nhấp để di chuyển con trỏ của Emacs
- Ghostel và eat cung cấp line mode, còn vterm thì không
- Ghostel cung cấp cả copy mode nơi đầu ra dừng lại và Emacs mode nơi đầu ra vẫn tiếp tục
- vterm cung cấp copy mode kiểu đóng băng, còn Emacs mode chỉ đọc của eat vẫn tiếp tục được cập nhật
- Ghostel tự động chèn shell integration, còn vterm và eat yêu cầu nạp script thủ công
- Ghostel tự động phát hiện password prompt, eat chỉ cung cấp lệnh gửi thủ công, còn vterm không chặn riêng phần nhập liệu
Kiến trúc nội bộ
- Với buffer cục bộ, mặc định Zig mở PTY và tạo tiến trình con, sau đó chuyển đầu ra vào
libghostty-vttrên luồng nền- Nếu cần callback OSC hoặc vẽ lại, nó gửi sự kiện Lisp qua pipe Emacs để
ghostel--events-filterxử lý - Đầu ra khối lượng lớn không đi qua bộ lọc tiến trình Emacs theo từng byte
- Nếu cần callback OSC hoặc vẽ lại, nó gửi sự kiện Lisp qua pipe Emacs để
- Với buffer TRAMP, tiến trình Emacs nhận đầu ra và chuyển đồng bộ vào cùng mô hình terminal để giữ nguyên việc sinh tiến trình từ xa và file handler
- Đầu vào bàn phím đi qua bộ mã hóa libghostty rồi được ghi ngay vào PTY; đầu ra đi qua trình phân tích VT và bước invalidation, nếu là echo tương tác thì cập nhật ngay, nếu không thì
Renderer.zigcập nhật các hàng đã thay đổi trong bộ hẹn giờ hợp nhất - Việc render terminal sửa đổi buffer Emacs thông qua thay thế hàng, vẽ lại toàn bộ, đổi kích thước và reflow, thêm·xóa scrollback, nên renderer chịu trách nhiệm bảo toàn point·mark·vị trí cửa sổ
- Elisp quyết định chính sách và ý định của người dùng, như có chuyển đến viewport đang hoạt động sau khi nhập hay giữ trạng thái điều hướng trong từng mode
- Nên tránh hiệu chỉnh thay đổi của renderer bằng các heuristic trước/sau redraw trong Elisp vì sẽ khó phân biệt nguyên nhân là người dùng cuộn, hiệu chỉnh redisplay, thay đổi kích thước hay ghi lại nội dung
Kiểm thử và giấy phép
- Kiểm thử dựa trên ERT; các bài kiểm thử Elisp có thể chạy mà không cần mô-đun Zig, còn các bài kiểm thử gắn thẻ
nativethì cần mô-đun đã build- Có các mục tiêu Makefile cho Zig unit test, full test, kiểm thử phần mở rộng Evil và benchmark nhanh
- Lỗi, yêu cầu tính năng và pull request được tiếp nhận tại kho GitHub; với các vấn đề render cần có lệnh tái hiện, escape sequence, phiên bản Emacs và thông tin nền tảng
- Có thể thu thập sự kiện chẩn đoán bằng
M-x ghostel-debug-info - Ghostel là phần mềm tự do được phát hành theo GNU GPL v3 trở lên
3 bình luận
Có vẻ như không gõ được tiếng Hàn.
Dù nhấn
Ctrl-\thì có vẻ bộ gõ đã chuyển sang tiếng Hàn, nhưng thực tế dường như vẫn chỉ nhập được tiếng Anh.Hơi đáng tiếc.
Các ý kiến trên Lobste.rs
ghostel-projectđể mở Ghostel gắn với dự án đóNếu đã có instance dành cho dự án, nó sẽ chuyển ngay sang instance đó, nên việc qua lại giữa các terminal rất nhanh
vtermvẫn có những điểm chưa vừa ý, nhưng việc có thể dùng nguyên các lệnh của editor ngay trong terminal thật sự rất hayKhi nói đến trình giả lập terminal trong Emacs, câu trả lời thường gặp là thay vì
cd/mv/ls/cp/rm/mkdr/...thì dùngdired, thay vì lệnh build thì dùngcompile, vậy cần terminal làm gì. Nhưng dù không làm tác vụ phức tạp, terminal vẫn có cảm giác quen thuộc và linh hoạt hơnĐặc biệt nếu có hướng dẫn về cách giảm phụ thuộc vào terminal trong Doom Emacs thì tôi muốn làm theo thử. Cách lướt nhanh qua dự án bằng cấu hình nâng cao lúc nào cũng gây ấn tượng
vterm, và do vấn đề tính kích thước dòng nên màn hìnhjjđôi khi lệch hẳn, rất bựcCuối cùng vẫn phải mở Ghostty bên cạnh, nhưng tôi hy vọng một ngày nào đó mọi công cụ sẽ hoạt động đúng bên trong Emacs
eshellrất nhiềuDùng
eat-eshellthì các chương trình cần giả lập terminal như công cụ build, Podman CLI và cả ứng dụng TUI đều chạy trực tiếp trong buffereshell, nên với người thường xuyên dùngeshellđây là tính năng thay đổi cuộc chơieshelllà gì, trong khi terminal cũng làm được. Vì không dùngeshellnhiều nên tôi thường có cảm giác mình đang bỏ lỡ mục đích của nóÝ kiến trên Hacker News
Tôi là maintainer của Ghostel. Tôi và baokaola định đăng Show HN vào tuần tới, nhưng có ai đó đã gửi link trước
Nếu muốn xem nhanh, repository GitHub sẽ tiện hơn: https://github.com/dakra/ghostel
Ghostel là terminal emulator cho Emacs dựa trên libghostty-vt, và phần so sánh tính năng với vterm và eat có thể xem tại https://dakra.github.io/ghostel/#ghostel-vs-vterm. Cũng có tài liệu so sánh hiệu năng và độ chính xác bằng hình ảnh: https://gist.github.com/dakra/4a0b76ebcf5d52338e134864378465...
Cá nhân tôi đã thay thế không chỉ vterm/eat mà cả các terminal bên ngoài như kitty và Ghostty. Khi xử lý văn bản terminal như một buffer Emacs thông thường, rất nhiều khả năng mở rộng mà các terminal khác không có sẽ mở ra. Ngay cả thao tác đơn giản như tìm trong scrollback rồi di chuyển chỉ bằng bàn phím, chọn một đoạn văn và sao chép cũng tự nhiên và nhanh hơn nhiều với người dùng Emacs
Nếu sau khi thử Ghostel mà bạn vẫn giữ terminal bên ngoài, tôi tò mò liệu đó là do thiếu tính năng, hay vì bạn muốn chạy một số process bên ngoài Emacs. Chúng tôi cũng phản hồi tích cực trên GitHub, nên nếu có vấn đề hãy mở issue
f1để chuyển giữa semi-character mode và copy mode, và trước khi chạy lệnh tôi tự hỏi “Nếu Emacs chết hoặc bị buộc thoát thì có ổn không?”. Nếu không ổn thì tôi chạy trong terminal thông thườngGhostel chưa được tích hợp ở cùng mức đó, và các extension như evil-ghostel-mode cũng có giới hạn. Tôi tò mò liệu có kế hoạch cải thiện việc này không, hay đây là hạn chế phải chấp nhận về mặt kiến trúc; nếu có một tính năng tương ứng với eat-eshell-mode thì sẽ rất tuyệt
Tiêu đề nên có Emacs. Terminal emulator thông thường và terminal emulator cho Emacs là khác nhau
.ellà phần mở rộng file của Emacs LispGần đây tôi chuyển từ vterm sang Ghostel và nhìn chung tốt hơn nhiều. Nó nhanh hơn thấy rõ, đến mức các app TUI hào nhoáng cập nhật toàn bộ terminal ở mỗi frame cũng chạy đúng, xử lý input ổn định hơn và ELisp API cũng tốt
Tuy vậy từng có lúc terminal không xóa sạch đúng cách khiến rác còn lại phía trên prompt hiện tại, hoặc bị treo hoàn toàn khiến tôi phải đóng buffer rồi khởi động lại. Đủ tốt để dùng hằng ngày và triển vọng sáng sủa, nhưng để trở thành sản phẩm chín muồi thì vẫn cần thêm sửa lỗi và hoàn thiện các chi tiết cuối
Hiện tượng rác còn lại ở phía trên màn hình có thể là https://github.com/dakra/ghostel/issues/495, và đã được sửa trong phiên bản mới nhất, nhưng cũng có khả năng là lỗi khác. Phần khó là nhân bản dữ liệu nội bộ của libghostty-vt vào buffer Emacs và chỉ thay thế các phần cần thiết. Chúng tôi có kiểm thử dựa trên thuộc tính để kiểm chứng rộng việc này, nhưng thỉnh thoảng vấn đề vẫn lọt qua
Trong bản phát hành mới nhất hiện tại, xử lý vòng đời đã được cải thiện nên một số vấn đề có thể đã được giải quyết cùng lúc. Vì vẫn còn ở giai đoạn đầu, chúng tôi sẽ dần dần tinh chỉnh thêm
Sẽ tốt nếu có các ví dụ thực tế về cách dùng hiệu quả các chế độ input khác nhau. Terminal muốn nhận mọi phím bấm, còn editor cũng muốn dùng phím cho lệnh riêng, nên terminal tích hợp trong editor nhất thiết cần các mode để chuyển quyền sở hữu bàn phím
:termcủa Neovim chỉ có hai mode, nên nếu không hiểu vì sao Ghostel lại có tới năm mode thì dễ bị hiểu lầm là thiết kế quá mức. Thực ra nó phức tạp vì giải quyết nhiều vấn đề hơn, và các mode bổ sung là công cụ tùy chọn cho những tác vụ mà nvim không xử lý. Tuy nhiên, cách tận dụng hiệu quả lợi thế này trong thực tế vẫn chưa đủ rõ ràngTrong lúc gặp khó khăn khi dùng vterm, tôi thử Ghostel và thấy rất tuyệt, có lẽ nó sẽ trở thành terminal chính của tôi
Tôi đã dùng hơn một tháng, và đặc biệt thích tính năng click vào tham chiếu code trong phần tóm tắt của Codex để mở trực tiếp trong buffer Emacs
ghostel-previous-hyperlinkhoặcghostel-next-hyperlinkđể di chuyển nhanh giữa các hyperlink vừa được hiển thịrepeat-mode map cũng được cài đặt, nên nếu output có ba URL hoặc link file, chỉ cần
C-c C-p p p RETlà mở được link đầu tiên; tôi dùng việc này thường xuyênNhờ tích hợp Ghostel và Claude Code, thời lượng dùng Emacs của tôi tăng mạnh, và giờ Emacs trở thành hub trung tâm cho công việc
Khi mở khoảng 10 terminal trong vài cửa sổ, Ghostty hầu như crash mỗi đêm. Vì vậy tôi không thể dùng Ghostty đúng nghĩa, và cũng không muốn nhúng nó vào công cụ dùng hằng ngày của mình
Tôi cũng đã chạy
ls -lRtrong nhiều shell nhất có thể trên một filesystem có hàng triệu file, nhưng không gặp vấn đề hay crash nào. Trong vài tháng sử dụng nặng cả ngày mỗi ngày, tôi chưa từng thấy crash hay hành vi đáng ngờCó vẻ nhiều khả năng đó là bug của một phiên bản Ghostty cụ thể, hoặc là tương tác đặc biệt với phần mềm khác như driver GPU. Ở đây tôi dùng GPU NVIDIA
Có nói rằng “native module là binary được build sẵn và sẽ tự động tải xuống khi dùng lần đầu”, nên tôi tò mò vì sao không đưa vào package phân phối
jinx, một package phổ biến dùng native module của Emacs, cũng cung cấp cách compile khi dùng lần đầu giống vterm. Vì vậy để hỗ trợ cài đặt thân thiện với người dùng trong package Emacs, trên thực tế chỉ còn cách tải xuống hoặc compile ở lần chạy đầu tiên