1 điểm bởi GN⁺ 4 giờ trước | 3 bình luận | Chia sẻ qua WhatsApp
  • Ghostel là trình giả lập terminal cho Emacs dùng cùng engine libghostty-vt như 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ụ cat 10MB 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
  • Có thể cài qua MELPA, use-package :vc của Emacs 30 trở lên, :load-path, hoặc require thủ công; mở terminal bằng M-x ghostel
  • Nếu chưa có mô-đun native, tùy theo thiết lập ghostel-module-auto-install mà hệ thống sẽ đề xuất tải về hoặc biên dịch từ mã nguồn
    • M-x ghostel-download-module sẽ 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 tag
    • M-x ghostel-module-compile dựng mô-đun bằng zig build
    • Nếu thư mục package có thể bị cài lại, có thể chỉ định ghostel-module-directory sang 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ằng EMACS_INCLUDE_DIR hoặc EMACS_BIN_DIR
    • xterm-ghostty terminfo đã biên dịch được kèm trong etc/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.dllOpenConsole.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òn M-RET là 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-y có chủ đích mới được gửi dưới dạng bracketed paste
  • 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
    • TAB dù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 isearch hay consult-line mặ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-ghostty mặ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 isearchconsult-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-theme sẽ đồ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ằng ghostel-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.nu bổ sung ghostel_cmd và wrapper terminfo SSH outbound
    • bash 3.2 tích hợp sẵn trên macOS bỏ qua ENV dùng cho việc chèn tự động, nên cần dùng bash mới hơn hoặc nạp ghostel.bash thủ công
  • 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ép ghostel-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
  • 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-passwd và 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 trong view-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
  • 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
  • Tiến trình OSC 9;4 truyền các trạng thái remove, set, error, indeterminate, pause và 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, yazi v.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ằng ghostel-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-directory là đườ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ư docker bằng ghostel-tramp-shells
    • login-shell phát hiện shell đăng nhập của người dùng từ xa bằng getent 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
  • Nếu phía từ xa không có terminfo xterm-ghostty, việc mở terminal có thể thất bại, nên ghostel-ssh-install-terminfo sẽ 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
    • ssh chạy từ Ghostel local sẽ chuẩn hóa đích bằng ssh -G, tra cache rồi nếu cần sẽ dùng thêm một kết nối để chạy tic -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-term sang xterm-256color thì 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-compile chạy lệnh trên PTY thực trong khi cung cấp header·footer·highlight lỗi·điều hướng next-error theo kiểu compilation-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-jC-c C-e hoặc C-c C-t
    • ghostel-compile-global-mode gửi các lệnh gọi compile, recompile, project-compilecompilation-start sang Ghostel
    • grep-mode mặc định vẫn giữ cách triển khai hiện có
  • ghostel-eshell-visual-command-mode chạy các visual command của Eshell như vim·htop·less trong buffer Ghostel chuyên dụng thay vì term-mode
  • ghostel-comint-mode xử lý luồng output comint bằng libghostty-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 htop hoặc less
  • ghostel-ime-mode xó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 cat tệ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-vt trê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-filter xử 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
  • 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.zig cậ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ẻ native thì 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
  • Tôi cho rằng lời giải cuối cùng cho giả lập terminal trong Emacs là Ghostel. Với các cửa sổ terminal dùng một lần đơn giản thì dùng Ghostty thật, còn khi làm việc với dự án thì dùng lệnh 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
  • Muốn thử lại Doom Emacs để xem tích hợp tốt đến mức nào. Một trong những lý do lần trước tôi bỏ cuộc là terminal của Emacs không ổn định
    • Tôi cũng muốn thử. vterm vẫ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 hay
      Khi 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ùng dired, thay vì lệnh build thì dùng compile, 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
    • Giả lập terminal trong Emacs đã tiến tới mức gần như hoàn toàn dùng được, vậy mà một số thế hệ công cụ terminal vẫn bị lỗi trong môi trường như vterm, và do vấn đề tính kích thước dòng nên màn hình jj đôi khi lệch hẳn, rất bực
      Cuố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
  • Có vẻ không có chức năng tương đương eat-eshell, nên với tôi khá khó chọn. Tôi quan tâm đến giả lập terminal nhanh hơn, nhưng lại dùng eshell rất nhiều
    Dùng eat-eshell thì 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 buffer eshell, nên với người thường xuyên dùng eshell đây là tính năng thay đổi cuộc chơi
    • Tôi tò mò không biết mục đích dùng riêng eshell là gì, trong khi terminal cũng làm được. Vì không dùng eshell nhiề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

    • Từ trước đến nay Ghostel hoạt động rất tốt với tôi. Tôi gán 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ường
    • Vì khi Magit và các công cụ tương tự parse diff lớn, toàn bộ Emacs có thể bị đơ, nên cuối cùng tôi vẫn duy trì một terminal riêng
    • Trong eshell, có thể thao tác văn bản giống hệt các buffer Emacs khác. Nếu gán vào phím một hàm bọc từ bằng dấu ngoặc kép, nó vẫn hoạt động y như vậy trong eshell, và việc có thể dùng cả evil-mode, xah-fly-keys, ispell là lợi thế quyết định
      Ghostel 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
    • Sẽ rất hay nếu có chế độ Quick-select dựa trên pattern của WezTerm. Từ khi biết tính năng này, tôi gần như không muốn dùng terminal nào khác nữa
    • Tôi đã dùng trong Doom Emacs khá lâu và khá ổn. Tôi tò mò vì sao các chương trình cuộn màn hình như Lazygit hay Reasonix thất bại trong các emulator khác nhưng lại hoạt động trong Ghostel. Muốn biết liệu có xử lý đặc biệt nào trong phần triển khai hay thư viện không
  • Tiêu đề nên có Emacs. Terminal emulator thông thường và terminal emulator cho Emacs là khác nhau

    • Khi chưa biết dự án, liên kết tới https://github.com/dakra/ghostel sẽ hữu ích hơn tài liệu
    • .elphần mở rộng file của Emacs Lisp
  • Gầ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

    • Tôi là co-maintainer của Ghostel. Dù không có cách tái hiện, nếu có thông tin có thể hành động được thì mong bạn đăng issue hoặc gửi bằng cách khác
      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
    :term củ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àng

  • Trong 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 đã chuyển từ vterm sang eat rồi sang Ghostel, và ít nhất cho đến giờ tôi nghĩ Ghostel là tốt nhất
  • 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

    • Không chỉ bằng chuột, bạn còn có thể dùng ghostel-previous-hyperlink hoặc ghostel-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 RET là mở được link đầu tiên; tôi dùng việc này thường xuyên
  • Nhờ 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

    • Tôi tò mò ở đây tích hợp có nghĩa là model trực tiếp thao tác Emacs thông qua server phải không
  • 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 đang dùng Ghostty 1.1.3 trên Gentoo Linux, hiện mở khoảng 20 tab trong mỗi khoảng 12 cửa sổ và chạy hơn 100 instance shell
      Tôi cũng đã chạy ls -lR trong 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

    • MELPA và ELPA không có cách đính kèm file theo từng nền tảng và đều phân phối bằng Git checkout. Nếu muốn đưa vào bản phân phối, sẽ phải đặt binary module cho mọi nền tảng vào repository, tổng cộng hơn 10MB
      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