【免费下载链接】ghostel
Terminal emulator powered by libghostty
Ghostel 是 Emacs 的终端模拟器,由 libghostty-vt 引擎驱动。它的 line 模式(line mode)让你像使用M-x shell一样:先在本地缓冲区把整行命令编辑好,按RET才一次性发送到 shell。本文带你快速上手 Ghostel line 模式,体验 Emacs 编辑能力加持的终端输入新方式。
一、Ghostel line 模式是什么?和普通输入有什么不同?
Ghostel 提供了 5 种 eat.el 风格的输入模式,默认是 semi-char 模式——你敲的每个字符都会实时转发给终端,编辑体验受限(比如M-b跳词、C-y粘贴都被 shell 的 readline 抢走)。
line 模式则完全不同:
| 对比项 | semi-char 模式(默认) | line 模式 |
|---|---|---|
| 按键流向 | 逐字符发给终端 | 只在本地缓冲区编辑,不按 RET 绝不发给 shell |
| 编辑能力 | readline 那一套(C-a/C-e/C-w) | 完整的 Emacs 编辑命令 |
| 发送时机 | 每按一个字符就发送 | 整行一次写入,原子性执行 |
| 模式指示 | 无 | 模式线显示:Line标签 |
换句话说,line 模式下当前输入行就是你眼中的"普通 Emacs 缓冲区":kill-word、transpose-words、C-y粘贴、M-b/M-f跳词……全都好使,编辑完按RET整行送达。这就是"像M-x shell一样编辑整行再发送"的核心含义。
💡 原理上,Ghostel 用一对 marker 圈出"正在编辑的输入区",并把它之前全部标为只读,所以你在 scrollback 里翻历史也不会误删终端输出。相关实现见 ghostel-line-mode.el。
二、如何进入 Ghostel line 模式?3 种方式
在任意 Ghostel 终端缓冲区(M-x ghostel打开)中:
- 快捷键:按
C-c C-l,立即进入 line 模式,模式线出现:Line标签,底部提示 "RET sends the whole line; C-c C-j to exit"; - 命令:
M-x ghostel-line-mode回车,效果相同; - 启动即进入:把
ghostel-initial-input-mode设为line,新开的终端第一个 prompt 渲染出来就自动进入 line 模式——重度用户的最快配置方法。
退出则按C-c C-j(会放弃未发送的输入,返回 semi-char 模式)。
三、line 模式核心工作流:本地编辑整行 → RET 一次发送
line 模式的日常使用流程非常顺滑:
- 进入 line 模式后直接打字,字符只留在本地缓冲区,一个字节都不发给 shell;
- 用 Emacs 编辑命令任意修改:
M-b/M-f按词移动,C-a跳回 prompt 行开头;M-DEL删词,C-d删字符(空输入时C-d会发送 EOF);C-y粘贴 kill-ring 内容——注意这里走的是 Emacs 原生 yank,而不是终端的 bracketed paste,粘贴长命令、文件路径特别爽;M-p/M-n浏览 line 模式自带的历史环(默认保留 200 条,见ghostel-line-mode-history-size)。
- 按
RET整行发送给 shell:Ghostel 先把整行一次性写入 PTY,再发送 Return,bash 收到的是原子的一整行,回显并执行; - line 模式在 RET 后保持激活——下一个 prompt 出现时输入区自动跟随迁移,你可以连续用 line 模式敲命令,无需反复切换。
几个实用的细节行为:
- 终端保持 live:你编辑时 shell 输出照样在流,Ghostel 的 snapshot/restore 机制会在每次重绘前暂存你正在编辑的行、重绘后再插回新 prompt 之后,异步输出不会"吃掉"你敲了一半的命令;
- REPL 也支持:没有 shell 集成的 REPL(python3、irb、sqlite3)会用光标位置作为输入边界,
M-p前缀参数(C-u C-c C-l)可以强制进入; - Shift-Enter 换行:
S-RET在输入中插入字面换行,适合区分 submit(Enter)和 newline(Shift-Enter)的多行 prompt 应用; - 光标定位在只读区时,输入会自动"吸附"回输入区末尾,
TAB补全同理。
四、line 模式快捷键速查表
| 按键 | 作用 |
|---|---|
| 普通字符 | 编辑本地输入(绝不逐字符发送) |
RET | 整行发送到 shell,保持 line 模式 |
S-RET | 插入字面换行(多行输入) |
TAB | 在当前输入处补全 |
C-c C-c | 放弃输入并发送 SIGINT,保持 line 模式 |
C-d | 删字符;空输入时发送 EOF |
M-p/M-n | 历史环上一条 / 下一条 |
C-a | 跳到 prompt 行输入开头 |
C-c C-j | 退出到 semi-char 模式(放弃未发送输入) |
TAB 补全:文件名、命令、甚至 git 分支名
line 模式的TAB走的是 Emacs 的 completion-at-point 框架(默认comint-completion-at-point),能补全文件名、PATH里的命令、环境变量,还支持 TRAMP 远程目录跟踪。
如果你装了bash-completion包,ghostel-line-mode-use-bash-completion(默认auto)会自动在标准补全之上叠加 bash 可编程补全——在git checkout后面按TAB,分支名直接列出来,体验拉满。
小贴士:bash 补全子进程首次启动有约 500ms~1s 的开销,把
ghostel-line-mode-bash-completion-prespawn设为t可在进入 line 模式时就提前启动,让第一次补全也是秒开。
五、TUI 无缝衔接:vim、yazi 打开时 line 模式自动暂停
全屏 TUI 需要所有按键原样转发,和 line 模式的"本地缓冲"天然冲突。Ghostel 的处理非常聪明:
- 当你启动 alt-screen 的 TUI(vim、yazi、htop、btop……)时,line 模式自动降级为 semi-char,TUI 拿到全部按键,并提示"退出 TUI 后自动恢复";
- TUI 退出回到 prompt 时,line 模式自动恢复,无需手动切回;
- 如果在 TUI 上直接按
C-c C-l,Ghostel 会"武装"自动恢复——TUI 一退出 line 模式立即生效。
下图就是在 Ghostel 中运行的 btop 系统监控 TUI(运行期间 line 模式会自动暂停、退出后恢复):
再来一张 Ghostel 中运行 yazi 文件浏览器的效果,Kitty 图形协议让图片预览直接嵌入终端:
六、常用定制项:line 模式效率加倍配置
| 变量 | 默认值 | 作用 |
|---|---|---|
ghostel-initial-input-mode | semi-char | 新终端的初始模式,设为line即"启动就是 line 模式" |
ghostel-line-mode-history-size | 200 | 历史环最大条数 |
ghostel-line-mode-completion-at-point-functions | (comint-completion-at-point) | TAB补全函数栈 |
ghostel-line-mode-use-bash-completion | auto | 是否叠加 bash 可编程补全 |
ghostel-line-mode-bash-completion-prespawn | nil | 进入时预启动补全子进程 |
ghostel-line-mode-send-functions | nil | RET发送前的钩子(返回非 nil 可接管发送) |
其中ghostel-line-mode-send-functions是个隐藏大招:任何函数在整行发送前拿到完整输入文本,返回非 nil 即可拦截——比如做命令确认、敏感命令拦截、自动记录操作日志,都只需几行 Elisp。
七、相关源码与文档路径
想深入了解 line 模式实现的同学,可以从这几个入口读起:
- lisp/ghostel-line-mode.el:line 模式全部实现——进入/退出、snapshot/restore、历史环、TAB 补全
- lisp/ghostel-line-mode.el#L181-L200:line 模式键位表
ghostel-line-mode-map - lisp/ghostel-line-mode.el#L704-L741:
RET整行发送的完整逻辑(含 readline 前缀清理) - test/ghostel-line-mode-test.el:line 模式的 ERT 测试,含"重绘不丢输入"的关键用例
- README.org#L596-L653:官方文档的 line 模式章节
- test/ghostel-line-mode-undo-test.el:line 模式下的 undo 行为测试
写在最后
Ghostel line 模式把"终端输入"从 readline 的世界解放出来,交还给 Emacs:整行编辑、完整命令历史、可编程补全、发送钩子,配合 TUI 自动暂停/恢复,日常 shell 输入的效率和安全性都能上一个台阶。打开你的 Ghostel,按一次C-c C-l,就回不去了。
【免费下载链接】ghostel
Terminal emulator powered by libghostty
相关推荐
Ghostel五大输入模式完整指南:semi-char/char/line/emacs/copy一文讲透
Ghostel五大输入模式完整指南:semi char/char/line/emacs/copy一文讲透 Ghostel 是一款由 libghostty vt
如何快速开始使用BusyBox:10分钟搭建精简Linux系统
如何快速开始使用BusyBox:10分钟搭建精简Linux系统 BusyBox是一款集成了数百个常用Linux命令和工具的精简工具集,被誉为"嵌入式Linux的
嵌入式Create.js 本地化实战:如何为多语言用户提供编辑体验
Create.js 本地化实战:如何为多语言用户提供编辑体验 Create.js 是一款强大的内容编辑工具,通过本地化配置可以为全球用户提供无缝的多语言编辑体验
人工智能大模型AI Agent多智能体Agent 框架工具调用RAGMCP Clients
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考