Emacs 学习笔记

最近有了在终端中SSH远程开发的需求,又想起之前看别人写代码时用Vim或Emacs灵活地在编辑器中定位,羡慕手不离开键盘的效率,于是决定好好学一下Emacs。

为什么选择Emacs

之前由于时不时需要在GNU/Linux里面编辑一些配置(比如配置vps),所以很简单地学了一下Vi的使用方法,但也仅限于会上下左右、会进Insert mode、会按:wq保存退出的水平。但是之前也听说过Emacs,所以我去搜了一下Emacs和Vim的区别和各自的使用场景,大致如下:

  • Vim和Emacs的运行环境不同。原版Vim只提供命令行界面(CLI, Command line interface),而Emacs提供GUI和CLI两种。这也侧面体现出不装插件的状态下Vim更像是一个记事本类的编辑器小工具,而Emacs倾向提供一套软件开发的环境。若在命令行下使用Emacs会有小部分功能缺失:部分快捷键被终端占据、浏览器无法显示图片、Emoji支持由终端提供等。
  • Vim相对Emacs轻量,内置的功能较少:Emacs内置了文件浏览器、Git客户端、终端甚至一个简单的浏览器。所以使用Emacs写代码很大程度上是“开箱即用”的,最多只需要装一些自动补全相关的插件。而Vim只有基本的编辑功能,所以若不自行安装插件功能性就差一些。
  • Vim和Emacs的操作方式不同。Vim使用三种模式,以使用户在大多数时候避免使用组合键。但与此同时在各个模式间切换也增加了时间成本。Emacs则只有编辑模式,组合键的使用非常普遍,使用过程中经常需要按Ctrl/Command键(可以通过按键映射将大小写和Ctrl互换以减轻小指压力)。不过,现在很多人选择使用evil插件来在Emacs中实现Vim的编辑模式,反过来似乎也有。
  • Vim的扩展性不如Emacs。Vim的插件采用Vim Script编写,Emacs的插件采用Emacs Lisp编写。Lisp起源于1958年,是当前广泛使用的编程语言中最老的之一。再加上Emacs的GUI提供的自由度,你可以通过安装插件在Emacs中收发邮件、听音乐甚至剪辑视频。而在语言支持相关的插件方面两者都非常完善了。

看到Emacs有这么多功能,再加上以前对Lisp有所耳闻,最后决定学Emacs。

学习路线

  1. 看官方Tutorial(有中文翻译版)
  2. 打印Reference Card,时不时看一遍。遇到某个键忘记了就速查。
  3. 尝试逐渐将日常开发切换到Emacs上,逐渐形成肌肉记忆

一些知识点

有些知识点Tutorial没有讲到或者讲了但是我没完全理解,在此记录一下。

Buffer和Window

刚看完tutorial的时候一直没搞清楚buffer和window的关系是什么,后面发现关键是Emacs的一个设计思想:数据与UI解绑。我们通常使用Visual Studio Code这类编辑器的时候都是一个正在编辑的文件(数据)对应一个打开的窗口。但是Emacs不是这样。正在编辑还未保存的文件内容和buffer对应,然后一个frame中显示的区域和window对应。