Emacs走马观花

33次阅读

共计 4172 个字符,预计需要花费 11 分钟才能阅读完成。

本文通过与 VSCode 作对比,来简单地介绍 Emacs 的基本功能、特点,以及一些插件。本文所说的 Emacs 指的是 GNU Emacs,下文简称 Emacs。

基本概念

  • Emacs 是一个文本编辑器,就像 VSCode 那样。它可以用来写代码、Markdown,以及其它任何纯文本;
  • 在 Emacs 中打开的每个文件都有一个“主模式”(major mode),就像在 VSCode 中每个文件都可以设置一种语言模式;
  • 除了主模式,在 Emacs 中还可以同时启用多个“次模式”(minor mode)。每一个次模式都可以提供自己的个性化功能;
  • 可以用一门叫 ELisp 的编程语言为 Emacs 开发插件,扩展新功能。有许多现成的插件可以安装使用。

与 VSCode 对比

接下来通过与 VSCode 作对比,来直观地感受一下 Emacs 的基本功能。

外观

Emacs 的官网上有一张应用截图

第一眼看起来和 VSCode 还是非常不一样的

默认的 Emacs 界面上也会有菜单栏、工具栏,以及底下的状态栏(在 Emacs 中其实这一行叫做 mode line),这些元素在 VSCode 上也可以找到。VSCode 一般给人的印象还有侧边栏、资源管理器视图,以及 minimap 视图。Emacs 的默认底色是白色,而 VSCode 则是黑色。

键盘操作

Emacs 有着丰富的快捷键(在 Emacs 中称之为 key binding),但一些常见的功能的快捷键与 VSCode 等其它软件并不相同,如下表所示()

EmacsVSCode
新建文件⌃x ⌃f⌘n
打开文件或目录⌃x ⌃f⌘o
保存文件⌃x ⌃s⌘s
另存为⌃x ⌃w⇧⌘s
撤销⌃x u⌘z
剪切⌃w⌘x
复制⌥w⌘c
粘贴⌃y⌘v
查找⌃s⌘f

在上表中,表示 control 键、表示 Mac 上的 command 键、表示 shift 键,表示 Mac 上的 option 键。此外,在 Emacs 中还可以使用 control 键搭配 pnbf 来上下左右移动光标,不需要移动手臂便可以在编辑的文件中到处移动,提高效率。VSCode 也可以使用 Emacs 风格的快捷键,如下图所示

文件管理

VSCode 自带美观大方的标签页功能,此外还可以将编辑器横向及纵向拆分,如下图所示

Emacs 默认是没有标签页的功能的,但也支持切割编辑器,比如在下图中,就将编辑器分为左右两部分,并且左侧还被分为了上下两部分,这三个区域可以展示相同或不同的三个文件。

默认的编程语言支持

VSCode 支持非常多的编程语言,点击窗口右下角的语言模式便可以看到这份清单

Emacs 虽然没有这么一份清单,但支持的语言的数量也是不遑多让的。不过仅仅是默认的 Emacs 的话,对编程语言的支持没有 VSCode 那么开箱即用。例如,比起 Emacs,VSCode 默认对 JavaScript 的支持就很好,不仅仅有语法高亮、自动补全,并且还有基于变量类型、函数定义,以及导入的模块等信息实现的智能补全,而 Emacs 只有平凡的基于文本的语法高亮和自动补全罢了。

搜索功能

除了按下 ⌘f 在文件内搜索之外,VSCode 左侧工具栏中有一个名为搜索的入口,可以实现在打开的项目的所有文件中搜索特定内容的功能,并且还能用于替换。Emacs 尽管没有这么一个 GUI 入口,但提供了 grep 命令来做到同样的事情。

在 Emacs 中按下 ⌥x 后输入 grep 并按回车,便会在 minibuffer 中等待使用者的进一步输入

显然,这是直接调用了同名的命令行程序 grep 来实现搜索的,控制选项比 VSCode 的搜索功能要丰富许多。

集成 git

git 可以说已经成为了日常开发中不可或缺的一个工具,如果能够在编辑器内方便地调用 git 的话会大大提高效率。VSCode 通过左侧工具栏的源代码管理入口提供了这个功能,在 Emacs 中则是通过一个叫做 VC dir 的主模式提供这个功能。

在 Emacs 中按下快捷键⌃x v d,然后输入使用 git 管理的项目的目录地址,便会打开一个新的编辑区域

当处于这个模式下时,会有一些新的快捷键可以用,比如将光标移动到显示 edited 的行上按下等号键,可以打开另一个编辑区域查看该文件的修改内容;按下 m 键可以选中光标所在行的文件,然后按 v 键打开一个新的编辑区域来填写 commit message,写完之后按下 ⌃c ⌃c 提交(即调用 git commit 命令);最后按下 q 键可以退出 VC dir 模式的编辑区域。

集成终端

在 VSCode 中通过选中顶部菜单的“查看”,再点击“集成终端”,便可以打开命令行,然后像平时在其它的终端模拟器中那样使用命令。Emacs 中也可以打开终端,方法是按下快捷键 ⌥x 然后输入 eshell 并回车,然后 Emacs 便会在当前窗口中打开一个名为 *eshell* 的编辑区域,显示命令行提示符和闪烁的光标,并等待使用者的进一步交互。

有意思的是,这不是一个真正的命令行程序。比如在 *eshell* 中输入 which pwd,输出结果是eshell/pwd is a compiled Lisp function in‘em-dirs.el’.。也就是说,eshell 中的某一些命令是 Emacs 重新实现的;此外,在 *eshell* 中可以运行 Emacs 的扩展语言——ELisp。比如输入 (+ 1 1) 并按下回车,会输出 2。

扩展能力

VSCode 有一个插件市场

Emacs 也有一个,不过得承认这个网页确实没有 VSCode 阵营的吸引人

在 Emacs 中按下 ⌥x 后输入 package-install 回车,Emacs 会等待用户输入要安装的插件的名字——可以按下 键(Mac 上的 tab 键)让 Emacs 尝试自动补全。确认名字无误后再按回车便可以安装使用了——但一般还需要做一些微调。

一些我喜欢的特性和插件

Emacs 目前是我日常开发的主力工具,有不少特性和插件是我比较喜欢的,挑着介绍一下。

颜色主题

Emacs 也可以安装颜色主题来改变外观。我比较喜欢的一款主题是 gruvbox-light-soft,只需要在 Emacs 的配置文件中写上(load-theme 'gruvbox-light-soft t) 即可启用。在这个主题的仓库主页可以看到一些效果图。

纯键盘选中一片区域

在 Emacs 中可以用单击鼠标右键的方式来选中一片区域。当按下鼠标右键的时候,从光标所在的位置开始,到鼠标点击的位置结束的内容便会被选中。但我个人更喜欢纯键盘的操作,首先是在要选中的内容的起点按下快捷键 ⌃@,这时候 Emacs 会在 minibuffer 中打印一条Mark set 的消息。然后移动光标——用方向键还是用一系列的快捷键,甚至直接跳转到某一行也可以——到待选中的内容的终点。这时候加在起点和终点间的内容便会被选中,它们会有特殊的背景色,如下动图所示

因为按 ⌃@ 实在是太别扭了,所以我将这个快捷键修改为了 ⌥␣。如果更喜欢鼠标操作的话,也可以像在 VSCode 中那样,在终点按住shift 键再单击鼠标左键。

矩形编辑

在 VSCode 中按住 shiftoption键,再单击鼠标右键并拖动就可以选中一片矩形的区域,在 Emacs 中也支持这样的矩形编辑的功能。像下图这样,先定位到要选中为矩形区域的左上角按下 ⌃@,再移动光标到目标矩形区域的右下角,最后按下快捷键⌃x r k 即可。

快速跳转

Emacs 本身支持跳转到指定的某一行,只需要按下快捷键 ⌥g ⌥g 然后输入行号并回车即可。但我一般是不显示行号的,所以这个功能其实比较少用。我使用一个名为 avy 的插件来增强跳转功能,主要用的是它提供的 avy-goto-line 函数。依照这个插件的文档,我为这个函数配置了快捷键⌥g f,因此当我想要快速地跳转到屏幕上可见的区域中、离光标所在位置稍微有点远的行时,我便按下这个快捷键,然后按照提示按下相应的英文字母键既可,具体效果参见下面的演示

发出 HTTP 请求

VSCode 中有一个叫做 REST Client 的插件,Emacs 中则是有一个叫做 restclient.el 的主模式。借助于 restclient.el 便可以直接在一个文本文件中写好自己要发出的 HTTP 请求的内容,然后一键触发。之前我是用 Insomnia 这个工具的,尽管它很强大,但很多时候我不需要那么强大的功能,而且 Insomnia 消耗内存比较多,于是我便回到 restclient.el 上了。restclient.el的效果大致如下图所示

增强的 git 集成功能

尽管 Emacs 自带了 VC dir 这个主模式,但我更喜欢用 magit 这个插件,尤其是它的 magit-discard 功能,可以在查看代码的差异的过程中方便地舍弃一些不必要的修改(例如添加一行 console.log 的调用)。例如下图,通过按下 n 将光标移动到某一片修改上再按下 k 键,Emacs 便会询问使用者是否要“丢弃”这一块改动。如果按下y,那么这一块被选中的区域的内容便会恢复到 git 当中未修改的状态。

增强的文件内搜索功能

Emacs 默认的搜索使用的是 search-forward 函数,插件 swiper 提供的功能更强大——不仅可以是字符串的完全匹配,也可以基于正则表达式来搜索,并且展示效果更直观,如下图所示

代码片段工具

VSCode 自带了一个“用户代码片段”的功能(通过顶部菜单“Code”,再选中“首选项”可以看到),可以用来定义一些短语,这些短语会在被选中的时候展开为完整的内容。Emacs 有一个名为 yasnippet 的插件也提供了类似的功能,但定义代码片段的语法不同。并且,yasnippet支持在短语的定义中嵌入 ELisp 代码,扩展性远远高于只能使用字符串及占位符的 VSCode 的等价功能。

其它

Emacs 还有许多有意思的插件,比如 dimmer.el,可以让当前没有获得焦点的窗口显示得黯淡一点;ledger-mode,可以用 Emacs 来记账。这里就不一一列举了,各位有兴趣的话可以自己摸索 Emacs,相信会遇到自己喜欢的插件的。

总结

比起家大业大的 VSCode,Emacs 算不上是开箱即用。它没有 VSCode 那么友好的界面和平易近人的操作方式,人气也没有 VSCode 那么旺,当遇到问题的时候可能没那么好求助到人,并且学习曲线(小众的预设快捷键、冷门的扩展语言)也比较高。但 Emacs 的扩展能力很强,现有的插件已经很丰富了,可以满足大部分的需求,遇到问题也可以到有模有样的论坛求助。如果喜欢折腾的话,Emacs 会是一个不错的选择,至少我自己用得很开心。

阅读原文

正文完
 0