这是对 Christian Tietze 博客上的Emacs 狂欢节 2025 - 06:再一次系列文章的贡献。
多年前作者第一次使用Eshell留下了不好的印象,早期期望它像其他 shell,但结果令人失望,花了很长时间才喜欢上它,后来反思是自己没准备好。现在 Eshell 是 Emacs 体验中不可分割的一部分,但很少以过去使用 shell 的方式使用它,很多过去用 shell 做的事情现在用 Emacs 模式代替了。
过去作者开始 Unix 计算时从命令行开始(自己用ksh
后来用bash
),熟练掌握命令行工具及其复杂语法来支持文件管理、运行程序和系统管理,主要是通过命令行进行文件管理和运行程序。现在对于文件管理,Dired是首选界面,比 shell 更优雅,比如重命名目录中的一堆文件,用 shell 要先生成脚本再执行,用 Dired 只需使缓冲区可写,更改目标文件名然后提交更改,更简单的话还可以使用正则表达式,Dired 支持所有基本的文件管理操作,加上Casual Dired能让这些操作更易发现。运行文件上的简单命令也可以用 Dired,将点移动到包含文件的 Dired 行,输入“!”并在提示符中输入命令,还可以用“?”引用文件名重定向输出。
把文件管理和运行简单命令从 shell 中拿出来后,还剩下什么呢?比如源代码管理(SCM),git
是常用工具,Emacs 有 Magit 和 VC 模式提供更好的体验;运行 Makefile 可以用 Emacs 的compile
,提供 Makefile 中目标的命令补全和错误/警告导航;需要反复运行带有复杂参数的命令可以用 Makefile + compile
作为任务运行器;需要强大的终端仿真,Eshell 不行,最好使用独立的终端模拟器应用,但内置的term
对很多诅咒式工具来说足够了;用管道命令挖掘数据文件,Eshell 是强大的工具,但用错可能会出错,巧妙使用能提供很大价值。
只有知道Elisp,使用 Eshell 才是优势,可以把 Eshell 看作 Elisp 的 REPL ,能临时用 Elisp 函数组合 shell 命令。例如在 Eshell 中可以用 Elisp 表达式替换echo
命令,还可以通过[$扩展](https://www.gnu.org/software/emacs/manual/html_node/eshell/Dollars-Expansion.html)混合 shell 命令和 Elisp,但要注意 Eshell 中的$扩展与其他 shell 不同。如果安装了 ImageMagick,可以用 Elisp 的文件名组件函数通过convert
命令将png
文件转换为jpeg
文件。
混合 shell 命令和 Elisp 的另一个重要意义是能将 Emacs 的缓冲区纳入临时工作流程,shell 命令通常处理文件数据,而 Elisp 把文件视为持久的二级数据形式,缓冲区是 Emacs 中的主要数据类型。对比使用临时文件和可写 Dired 缓冲区的步骤可以看出差异,Eshell 让人以不同方式思考使用提示符,输出可以是 Emacs 缓冲区。
Eshell 强化并奖励让 Emacs 用户只在 Emacs 中工作,常见的 shell 工作流如文件管理、查看文件、SCM、查看手册页、运行 Makefile、远程登录、编辑文件、管理进程、在文件中搜索模式、定位文件等在 Eshell 中都有不同的实现方式。
使用 Eshell 时要注意,盲目使用grep
管道处理大文件会很慢,可以用*
前缀避免,还可以将输出重定向到缓冲区而不是文件。目前不能将 shell 命令输出直接管道到 Elisp 函数,但可以利用 Emacs 的其他工具获取数据洞察。
总结来说,Eshell 主要是 Elisp/Emacs 功能的提示符,有运行类似 shell 命令的次要好处,不应作为实际终端 shell 的替代品,要充分利用 Eshell 需要熟悉 Elisp,它是学习 Elisp 的好方法,将 Eshell 引入 Emacs 之旅很神奇。感谢 Eshell 的所有贡献者。
脚注:[1] 明确这些语言从 Lisp 发展中采用了REPL 的概念,Elisp 是其后代。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。