0%

带你见识一下传说中的Emacs

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

基本概念

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

与VSCode对比

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

外观

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

Emacs的官网截图

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

VSCode的官网截图

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

键盘操作

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

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

在上表中,C-x表示先按住control键再按x键,M-w表示先按住alt键再按w键;表示Mac上的command键、表示shift键。此外,在Emacs中还可以使用C-pC-nnC-b,以及C-f键来往上、下、左、右四个方向移动光标,不需要移动手臂便可以在编辑的文件中到处移动,提高效率。VSCode也可以使用Emacs风格的快捷键,如下图所示

文件管理

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

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

默认的编程语言支持

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

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

搜索功能

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

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

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

集成git

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

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

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

集成终端

在VSCode中通过选中顶部菜单的“查看”,再点击“集成终端”,便可以打开命令行,然后像平时在其它的终端模拟器中那样使用命令。Emacs中也可以打开终端,方法是按下快捷键M-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中按下M-x后输入package-install回车,Emacs会等待用户输入要安装的插件的名字——可以按下键(Mac上的tab键)让Emacs尝试自动补全。确认名字无误后再按回车便可以安装使用了——但一般还需要做一些微调。

炫酷的特性和插件

除了上面与VSCode对比的一些基本操作以外,Emacs还有自身的一些特色功能,更有世上的众多优秀程序员为Emacs贡献了不胜枚举的优秀插件,它们极大地扩展了Emacs的能力,提升了文字编辑这项活动的效率,甚至超越了文字编辑。

内置的功能

颜色主题

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

将当前行居中或置顶

Emacs可以用纯键盘的操作,将光标当前所在的行移到窗口的中间来显示。我特别喜欢这个功能,之前用VSCode时候一直想找这个功能的等价物,可惜没找着。在Emacs中,按下一次control+l,光标所在的行就会移动到窗口的中间;按下第二次,则移动到窗口的顶部展示;再按一次,会去到窗口的底部。如果再按一次,那么就跟第一次一样回到窗口的中间。每当Emacs正在编辑的内容已经去到屏幕上较低的位置时,我便会用这个功能校正一下。

比起用鼠标拖动滚动条或者用滚轮来滚动,我更喜欢这种表意更清晰的方式。

纯键盘选中一片区域

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

因为按C-@实在是太别扭了,所以我将这个快捷键修改为了M-SPC(先按住alt键再按下空格键)。如果更喜欢鼠标操作的话,也可以像在VSCode中那样,在终点按住shift键再单击鼠标左键。

矩形编辑

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

惊艳的插件

快速跳转

Emacs本身支持跳转到指定的某一行,只需要按下快捷键M-g M-g然后输入行号并回车即可。但我一般是不显示行号的,所以这个功能其实比较少用。我使用一个名为avy的插件来增强跳转功能,主要用的是它提供的avy-goto-line函数。依照这个插件的文档,我为这个函数配置了快捷键M-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会是一个不错的选择,至少我自己用得很开心。

Liutos wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
你的一点心意,我的十分动力。