☰
Ghostel line模式实战教程:像M-x shell一样编辑整行再发送,终端输入效率翻倍
2026/10/18 4:01:16 网站建设 项目流程

【免费下载链接】ghostel

Terminal emulator powered by libghostty

项目地址:https://gitcode.com/gh_mirrors/gh/ghostel
点击查看免费下载

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打开)中:

  1. 快捷键:按C-c C-l,立即进入 line 模式,模式线出现:Line标签,底部提示 "RET sends the whole line; C-c C-j to exit";
  2. 命令:M-x ghostel-line-mode回车,效果相同;
  3. 启动即进入:把ghostel-initial-input-mode设为line,新开的终端第一个 prompt 渲染出来就自动进入 line 模式——重度用户的最快配置方法。

退出则按C-c C-j(会放弃未发送的输入,返回 semi-char 模式)。

三、line 模式核心工作流:本地编辑整行 → RET 一次发送

line 模式的日常使用流程非常顺滑:

  1. 进入 line 模式后直接打字,字符只留在本地缓冲区,一个字节都不发给 shell;
  2. 用 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)。
  3. 按RET整行发送给 shell:Ghostel 先把整行一次性写入 PTY,再发送 Return,bash 收到的是原子的一整行,回显并执行;
  4. 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-modesemi-char新终端的初始模式,设为line即"启动就是 line 模式"
ghostel-line-mode-history-size200历史环最大条数
ghostel-line-mode-completion-at-point-functions(comint-completion-at-point)TAB补全函数栈
ghostel-line-mode-use-bash-completionauto是否叠加 bash 可编程补全
ghostel-line-mode-bash-completion-prespawnnil进入时预启动补全子进程
ghostel-line-mode-send-functionsnilRET发送前的钩子(返回非 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

项目地址:https://gitcode.com/gh_mirrors/gh/ghostel
点击查看免费下载

相关推荐

上一篇:swift package reset 完全指南:SwiftPM 缓存与构建目录重置的底层原理与全部参数详解
下一篇:mirrord 调试工具箱:HTTP 响应头注入与延迟诊断实用指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询