本文通过与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等其它软件并不相同,如下表所示
Emacs | VSCode | |
---|---|---|
新建文件 | ⌃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尝试自动补全。确认名字无误后再按回车便可以安装使用了——但一般还需要做一些微调。
炫酷的特性和插件
除了上面与VSCode对比的一些基本操作以外,Emacs还有自身的一些特色功能,更有世上的众多优秀程序员为Emacs贡献了不胜枚举的优秀插件,它们极大地扩展了Emacs的能力,提升了文字编辑这项活动的效率,甚至超越了文字编辑。
内置的功能
颜色主题
Emacs也可以安装颜色主题来改变外观。我比较喜欢的一款主题是gruvbox-light-soft
,只需要在Emacs的配置文件中写上(load-theme 'gruvbox-light-soft t)
即可启用。在这个主题的仓库主页可以看到一些效果图。
将当前行居中或置顶
Emacs可以用纯键盘的操作,将光标当前所在的行移到窗口的中间来显示。我特别喜欢这个功能,之前用VSCode时候一直想找这个功能的等价物,可惜没找着。在Emacs中,按下一次control+l
,光标所在的行就会移动到窗口的中间;按下第二次,则移动到窗口的顶部展示;再按一次,会去到窗口的底部。如果再按一次,那么就跟第一次一样回到窗口的中间。每当Emacs正在编辑的内容已经去到屏幕上较低的位置时,我便会用这个功能校正一下。
比起用鼠标拖动滚动条或者用滚轮来滚动,我更喜欢这种表意更清晰的方式。
纯键盘选中一片区域
在Emacs中可以用单击鼠标右键的方式来选中一片区域。当按下鼠标右键的时候,从光标所在的位置开始,到鼠标点击的位置结束的内容便会被选中。但我个人更喜欢纯键盘的操作,首先是在要选中的内容的起点按下快捷键⌃@
,这时候Emacs会在minibuffer中打印一条Mark set
的消息。然后移动光标——用方向键还是用一系列的快捷键,甚至直接跳转到某一行也可以——到待选中的内容的终点。这时候加在起点和终点间的内容便会被选中,它们会有特殊的背景色,如下动图所示
因为按⌃@
实在是太别扭了,所以我将这个快捷键修改为了⌥␣
。如果更喜欢鼠标操作的话,也可以像在VSCode中那样,在终点按住shift
键再单击鼠标左键。
矩形编辑
在VSCode中按住shift
和option
键,再单击鼠标右键并拖动就可以选中一片矩形的区域,在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会是一个不错的选择,至少我自己用得很开心。