返回

文章详情

Emacs 是一个 Lisp 版图

Hacker News2026年7月23日 14:02

如果 Emacs 的默认缓冲区是一个终端仿真器,会发生什么呢?从外部看,它会被视为一个强大的终端,使用 Lisp 作为其脚本语言。也许我们会讨论 iTerm2 与 Emacs,或者 Kitty 与 Emacs,甚至 Bash 与 Emacs。如果默认缓冲区是 Dired,文件管理器呢?历史上可能会产生 Total Commander 与 Emacs,或者 Finder 与 Emacs 的竞争。但历史走上了另一条道路。我们已经知道,如果你启动一个没有任何配置的 Emacs 实例,你看到的是一个缓冲区,其中包含以下信息:;; 此缓冲区用于未保存的文本和 Lisp 评估。;; 要创建文件,请使用‘C-x C-f’访问它,并在其缓冲区输入文本。一个带有嵌入式 Lisp 解释器的记事本。它的天然对手是带有嵌入式解释器(Vimscript)的 Vim。然而,使我们都记住 :q! 的编辑器停留在缓冲区,而 Emacs 随着越来越多软件的扩展,成为了操作系统的接口。我是一个 Emacs 爱好者,也许这让这篇文章失去了一些可信度。然而,我不是来告诉你 GNU 编辑器多么精彩,也不是要说服你使用它。我的目标是解释为什么网络浏览器是它真正的自然对手,以及为什么 Emacs 是一个你可以构建自己工作方式的 Lisp 版图。让我们想象一个完美的工作环境。为了设定舞台,我们来做一个小小的思维实验。假设我想在一个地方处理我所有的情境,包括个人和职业。这样我就能记住我的快捷键,应用我的配置,而不必切换上下文。一切都在同一个窗口下。这是一个问题,因为这意味着要合并没有任何关系但需要协作的程序。例如,一个终端仿真器、一个电子邮件客户端和一个代码编辑器(或 IDE)。通过布局系统,在同一个窗口内,我可以有一个列显示我的电子邮件收件箱,另一个列显示终端,第三个列是我准备写任何需要的 IDE。在这个空间里,我可以轻松撰写 bash 脚本,从终端启动它,并收到结果的电子邮件。所有这些都在同一个窗口,毫不切换上下文,使用相同的快捷键、相同的排版和相同的主题。我甚至可以添加第四列,放一个 Git 客户端以版本控制脚本并将其推送到远程仓库。或者在此之上,第五列放我的最爱 AI 代理,能够阅读我的代码和其余面板。我们刚刚创造了一个接口。但这并不是最有用的部分:这些程序彼此整合,都在自己的作用域中,同时又在一个全局作用域中。这意味着,如果我在代码编辑器中用某个配置启用拼写检查器,它也会在终端、电子邮件客户端(撰写消息时)或写提交时激活。所有的一切都具有相同的交互性和配置。它们不是四个孤立的二进制文件通过管道连接:它们是用相同语言编写、在同一运行时上运行并共享同一事件总线的程序。我们刚刚创造了一个连接器。现在让我们去掉一个不必要的层:bash 脚本。如果我已经在这个窗口中嵌入了一个解释器,我可以创建我自己的脚本。我不需要外部二进制文件。我不再需要离开窗口,也不需接触操作系统。我的所有脚本、原型和工作流程都可以共存。我们刚刚创造了一个栖息地。只剩下一个与运行时有关的问题:明天我会换电脑,或者想从服务器上工作,我没有打算从零开始重建我的环境。我希望我的脚本在任何操作系统和硬件上都能正常工作。一个脚本在 Windows、树莓派或便宜的安卓设备上应当表现相同。我需要整个环境成为一个跨平台的运行时,具备在任何地方都能运行的字节码。我们刚刚创造了一个虚拟机。现在,为了完善这个想法,我们将使用 Lisp 作为脚本语言,并称整个系统为 Emacs。尽管我更愿意叫它别的东西:一个 Lisp 版图。就像一个电子面包板,任何你插入的模块与所有其他模块共享一个总线,唯一的区别是这里的模块用 Lisp 编写。如果在这个过程中你觉得“这听起来很熟悉:标签、应用程序和跨平台虚拟机……那就是我的浏览器”,请牢牢把握这个直觉。我们将在文章结束时再讨论这个问题。Emacs 不是什麼?在到这里之前,我想揭穿一些围绕 Emacs 的神话:它不是一个文本编辑器:它是一个完整的工作环境,具有嵌入式脚本语言、自己的软件和跨平台运行时。编辑器只是这个环境中的一个程序,终端、电子邮件客户端、IRC、文件管理器或网络浏览器(是的,Emacs 自带一个)也是如此。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡