Emacs配置经验谈:如何从放弃到“趁手”

最近终于把Emacs配置成了一个趁手的编辑器,效率超过了之前用的编辑器,回过头看,我认为到现在这样最少且最快的路径是: 熟悉Emacs → 使用spacemacs → 自己写配置 → 自己写插件

熟悉Emacs

首先是下载,Mac下最好的是emacs-mac-port(GitHub - railwaycat/homebrew-emacsmacport: Emacs mac port formulae for the Homebrew package manager)。 然后参照视频教程什么的用一用(比如 http://book.emacs-china.org ),这里主要是通过实际体验,看看Emacs有什么优点(而不是别人说的好或不好),对比下别的编辑器,决定到底用不用Emacs。

在我看来,比起Vim/Sublime/Atom/VSCode,Emacs的界面、自动补全、Tabs等基本功能都是最渣,从编辑器的角度出发几乎一无是处,最坑的是配置的时候经常出bug,结果可能为了节省一个操作几秒钟的时间,花了几十分钟去配置,也就是说从节省时间的角度出发,除非用了好几年,否则也是亏的。 Emacs唯一的优势是在不考虑bug的前提下,配置起来比较方便,不像别的往往要写插件。结果是爱折腾的人往往会选择Emacs,使得Emacs有一些有创意的插件,比如简单的有自动保存,复杂的有并击键,这样即使最终不用Emacs,这些创意依旧能提高你用其它编辑器的效率。

因此使用Emacs前,应先用熟另一个编辑器或者IDE,这样才能知道什么是Emacs特有的/值得学的,而什么不是。用的时候要注意“多用少看”,配置想怎么写都行(之后会删掉),关键是多体验Emacs的功能和插件,而教程什么的略读即可,切忌不要看书。(Emacs相关的书和资料质量很差,浪费时间就算了,更烂的是还可能误导)

使用spacemacs

假如决定要用Emacs,那么就可以开始用spacemacs(http://spacemacs.org)。原装/默认的Emacs是非常难用的,而spacemacs较好的解决了这个问题,它既提高了“起点”,又基本不影响后续的配置,不像其它的StarterKit或者名人的配置,难以在它们的基础上添加自己的配置。

spacemacs提供了一个叫layer的东西,它像插件一样可以安装和删除,简单来说就是插件和配置的组合,比如一个叫ui的layer,就是组合了几个界面相关的插件,外加一堆和界面相关的配置,只要安装这个layer界面就会有较大改善,省去了自己去找插件、装插件再一点点去配置/调试的麻烦。

spacemacs本身则是一堆layer的集合,默认会安装一些基础的layer,你可以选择是否安装其它layer。其中的一个基础layer配置了一个涵盖了所有常用的功能的leader key,省去了查/记快捷键的麻烦。

刚开始正式用Emacs(spacemacs)时不要一上来就自己写配置,一是坑多容易浪费时间,二是不了解自己的需求容易做无用功。比如我在配置自动补全时,好不容易把snippet加到候选补全列表里显示出来,结果发现这样导致选别的补全时可能要多按几次上下键才能选到,其实应该把snippet记住,这样就不需要补全。 所以layer可以多装,哪怕用了以后发现没用,至少对自己的需求更了解了。而配置尽量少写,有什么配置先加到dotspacemacs/user-config,别急着写自己的layer,基本上懂得配置快捷键就够了。

自己写配置

当用熟了spacemacs,对自己的需求比较了解后,就可以开始自己写layer,替换掉不适合的layer,毕竟别人的配置终究只符合别人的需求,想用得趁手还得自己写。先从表层/特定的layer开始,比如某个语言(js),再到底层/通用一点的layer,比如auto-complete,最后是那些“spacemacs-”开头的基础layer。

这个阶段主要是精益求精、把Emacs配置得尽可能“趁手”,但越精越是会遇到各种坑,而填坑的基本思路是: 1.确定这是否是个能填上的坑。 2.能的话就搜相关的配置(google或者别人的配置),从中知道和坑相关的函数和变量等有哪些。 3.describe(SPC h d)这些相关函数/变量,搞清楚它们的作用(不要想当然地认为某个函数会有什么效果),不懂可以试用一下或者google。 4.使用/设置这些函数/变量,不断调试直到实现自己想要的效果。

理论上可以把所有layer都替换成自己写的,只留spacemacs-base,但其实没必要,只要一个layer和你自己的配置不冲突,哪怕其中的大部分插件和配置都用不到也无所谓,虽然增加了点启动和升级时间,但节省了更多花在替换上的时间。

自己写插件

现有的插件和配置能满足的需求是有限的,总有一些功能是目前没有的,想实现就得自己写插件,先写简单的,再写复杂的。其实在Emacs里插件就是配置,只不过独立出来了而已,和普通配置的真正区别在于是否提供了独有的功能,或者同样的功能是否比别的配置都好。

通常写插件的方法是根据插件的类型去查文档,然后照着文档写,然而Emacs并没有像样的文档,也没有模块分类(所有函数都是全局的),这时写插件就得转变一下(和写配置类似): 1.确定这是否是个Emacs能实现的功能。 2.找一下类似的或者相关的插件,从中知道相关函数或者库有哪些。 3.试用这些函数/库,搞清用法、是否有问题。 4.不断调试直到实现。

写插件时需要学一点Elisp,但别多学,需要的时候查一下就行,因为Elisp本身不怎么样,学了也没意义,且相关资料质量很差,实在想学最好去看CommonLisp的资料(虽然也很一般)。

以上就是我目前的经验,欢迎交流或指教。

3 个赞

emacs-mac-port 指的是 Mitsuharu Yamamoto’s Mac port 吧,可以从源代码安装,HomeBrew 和 MacPorts 上都有,清华镜像上有 MacPorts,刚才我用 MacPorts 安装 emacs-mac-app 一共花了 31 秒,也很方便。

对的 这个链接是源代码