← 返回信息流
AI 资讯Hacker News·3 小时前

Ghostel.el发布:libghostty驱动的终端模拟器

原标题:Ghostel.el: Terminal emulator powered by libghostty

速览

Ghostel.el是专为Emacs设计的终端模拟器插件,底层采用libghostty库以实现高性能和现代终端特性。该项目旨在提升Emacs用户的内置终端体验,提供更流畅的操作和更好的兼容性。虽然属于工具类项目,但展示了Emacs生态对现代终端技术的整合趋势。

AI 深度解读

背景

Ghostel.el 是一款为 Emacs 打造的终端模拟器,底层引擎是 libghostty-vt——即 Ghostty 终端所使用的 VT 引擎。Emacs 生态中已有 emacs-libvterm 这样的终端方案,但 libvterm 不支持 Kitty 键盘协议、图形协议、OSC 8 超链接、OSC 4/10/11 颜色查询、同步输出(DEC 2026)等现代特性。Ghostel 借鉴了 emacs-libvterm 的“两层架构”(底层原生模块 + 上层 Elisp),但将 VT 引擎替换为更现代化的 Ghostty 引擎,从而补齐了这些缺失的能力。

该项目的原生模块用 Zig 编写,负责终端状态、渲染和本地 PTY I/O;Elisp 层管理 keymap、buffer、命令以及远程进程集成。原生模块会在首次使用时自动下载预编译的二进制文件,普通用户无需搭建编译工具链。

核心内容

快速上手

Ghostel 推荐通过 use-package 安装,例如:

(use-package ghostel
  :bind (("C-x m" . ghostel)
         :map ghostel-semi-char-mode-map
         ("C-s" . consult-line)
         ("M-<backspace>" . ghostel-backward-kill-word)
         ("M-p" . (lambda () (interactive) (ghostel-send-key "p" "ctrl")))
         ("M-n" . (lambda () (interactive) (ghostel-send-key "n" "ctrl")))
         :map project-prefix-map
         ("m" . ghostel-project)
         ("M" . ghostel-project-list-buffers))
  :config
  ;; 自定义 C-k 行为
  (defun ghostel-send-C-k-and-kill () ...)
  (add-to-list 'project-switch-commands '(ghostel-project "Ghostel") t)
  (add-to-list 'project-switch-commands '(ghostel-project-list-buffers "Ghostel buffers") t)
  (add-to-list 'ghostel-eval-cmds '("magit-status-setup-buffer" magit-status-setup-buffer)))

若使用 evil,可安装 evil-ghostel 扩展。

Shell 集成

对于本地 bash、zsh、fish 会话,目录追踪和提示导航默认开启。用户可在 shell 中调用 Emacs 函数,需先将函数名加入 ghostel-eval-cmds 白名单,然后在 shell 配置文件中定义别名:

if [[ "$INSIDE_EMACS" = 'ghostel' ]]; then
  e() { ghostel_cmd find-file-other-window "$@"; }
  dow() { ghostel_cmd dired-other-window "$@"; }
  gst() { ghostel_cmd magit-status-setup-buffer "$(pwd)"; }
fi

输入模式

Ghostel 提供五种 eat.el 风格的输入模式:

  • semi-char 模式(默认):除少数保留键(如 M-xC-c)外,几乎所有按键都转发到终端。
  • char 模式:所有按键直接发往终端,按 M-RET 退出。
  • line 模式:类似 M-x shell,缓冲区为正常 Emacs 缓冲区,按 RET 才将整行发送到终端。
  • emacs 模式:临时将缓冲区变为正常 Emacs 缓冲区,可导航、查看、复制文本,输出仍在持续。
  • copy 模式:与 emacs 模式类似,但终端输出被冻结,防止选择时内容滚动。两个只读模式默认启用 ghostel-readonly-fast-exit(默认 t),在复制或输入任意字符时自动退出,实现无缝过渡。

功能与特性

  • 终端模拟:基于 Ghostty VT 引擎,支持现代终端标准。
  • 进程模型:原生模块管理本地 PTY I/O,Elisp 处理远程(TRAMP)等。
  • 书签:可保存和跳转到终端中的标记位置。
  • 链接与文件检测:自动识别 URL 和文件路径,支持超链接跳转。
  • 剪贴板:与 Emacs kill-ring 集成。
  • 输入:支持 Kitty 键盘协议。
  • 密码提示检测:自动识别密码输入,防止落入 shell 历史。
  • Shell 集成:目录追踪、提示导航、调用 Emacs 函数。
  • 渲染:支持丰富下划线样式、OSC 8 超链接、OSC 4/10/11 颜色查询、同步输出(DEC 2026)。
  • 内联图像:支持 Kitty 图形协议,可在终端中显示图片。
  • 从 shell 调用 Elisp:通过 ghostel_cmd 执行已白名单的 Elisp 命令。
  • 通知与进度:支持终端通知和进度指示。
  • 调色板:可通过 OSC 查询和设置颜色。

系统要求与安装

  • Emacs 28.1+,需支持动态模块。
  • 支持 macOS、Linux、FreeBSD、原生 Windows(需 ConPTY)。
  • 预编译二进制适用于:aarch64-macos、x86_64-macos、x86_64-linux、aarch64-linux、x86_64-freebsd、x86_64-windows、aarch64-windows。
  • 若需从源码构建,需 Zig 0.15.2。

安装方式包括 MELPA、:vc(Emacs 30+)、:load-path 或手动加载。原生模块的自动下载 / 编译受 ghostel-module-auto-install 控制(默认为 ask),也可手动触发 ghostel-download-moduleghostel-module-compile

架构

Ghostel 采用与 emacs-libvterm 相同的双层架构:底层为 Zig 编写的动态模块(处理终端状态、渲染、PTY I/O),上层为 Elisp(处理 keymap、buffer、命令、远程集成)。这使得 Elisp 可以专注于编辑器集成,而性能敏感部分由原生代码承担。

与 vterm 和 eat 的对比

Ghostel 在功能上超越了 emacs-libvterm,因为它使用了 Ghostty 的现代 VT 引擎,支持 libvterm 所缺乏的 Kitty 协议、OSC 8 超链接、颜色查询、同步输出等。这些特性在 eat.el 中部分已有,但 Ghostel 通过原生模块提供了更流畅的终端模拟体验和更广泛的协议支持。

关键要点

  • 引擎升级:Ghostel 基于 Ghostty 的 VT 引擎(libghostty-vt),而非老旧的 libvterm,从而原生支持 Kitty 键盘/图形协议、OSC 8 超链接、颜色查询、同步输出等现代终端特性。
  • 双层架构:底层 Zig 原生模块处理性能敏感任务,上层 Elisp 处理 Emacs 集成,兼顾效率与扩展性。
  • 自动原生模块:首次使用时自动下载预编译二进制,无需用户手动编译(除非需要定制平台)。
  • 五种输入模式:semi-char、char、line、emacs、copy 模式,适应不同使用习惯,且只读模式支持智能自动退出。
  • Shell 集成:支持目录追踪、提示导航、从 shell 调用 Emacs 命令(需白名单),兼容 bash、zsh、fish。
  • 跨平台:支持 macOS(Apple Silicon / Intel)、Linux、FreeBSD、原生 Windows(ConPTY)。
  • 与 vterm 兼容:保持类似的配置接口和项目布局,方便 vterm 用户迁移。
  • 严格许可:使用 GPL-3.0 或更高版本许可。

意义与影响

Ghostel 填补了 Emacs 终端模拟器在现代化协议支持方面的空白。emacs-libvterm 长期无法支持 Kitty 图形协议、OSC 8 超链接和丰富的下划线样式,而 Ghostel 直接复用 Ghostty

查看原文 →dakra.github.io