EMACS-DOCUMENT

=============>集思广益

我为什么从Vim叛逃到了Emacs

我最开始用GNU/Linux时,Vim和Emacs都是接触过的. 当时觉得Vim看起来很直观,而且它的按键也特别有效率; Emacs则看起来不容易学习,而且它的按键也有点反人类. 我通过 在Stack Overflow的这篇帖子 比较了Vim和Emacs的优缺点. 其中有个用户说你永远都不会对你的Emacs配置感到满意,你会不断地调整你的配置,而且你还不能直接用别人的配置. 基于这些考虑,我选择了用Vim,而且成为了Vim的忠实信徒.

然而,随着时间的推移,我逐渐发现我的工作流效率并不高,而且我使用终端,编辑器,IDE的方式也不够高效. 于是我开始寻找解决之法,接着我发现Emacs能解决所有这些问题. 然而,由于我已经很熟悉Vim了,而且也没有那么多时间去修改配置文件,所以我一直在犹豫是否要使用Emacs. 最终,我对工作中的瓶颈已经忍无可忍了,刚好又看到了这个视频, 这个视频完全改变了我对Emacs的看法. 在视频中,演讲者提到Vimer通过 Spacemacs 可以近乎无缝地从Vim迁移到Emacs中来. 于是我试了一下,然后就被迷住了.

下面我会告诉你基于Vim的工作流到底低效在哪里,以及为什么我会使用Emacs. 需要说明的是,我使用的是Spacemacs,它有很多普通Emacs不具备的功能. 而且我在下面的阐述也是基于Spacemacs来说的. 但是理论上,我所说的这些东西是与发行版无关的,任何人都能将之应用到自己的Emacs配置中,只是需要花点时间自己配置而已.

Reasons why I switched

I didn’t have to stop using Vim

是的,严格来说我也不算是切换到Emacs了. 我在Emacs中应用的依然是Vim的那一套按键设置. 有多种途径都能让你在Emacs中使用Vim的那一套按键 (Evil mode, Spacemacs, 也许还有其他的?), 而且在我看来,只有疯子才会长期使用Emacs的原生按键设置呢. ‘Emacs pinky’可不是开玩笑的(不过貌似确实很多人都不把它当成一回事) 在我考虑是否要切换到Emacs那会儿,我的关节疼得很厉害(不是Vim的锅),所以对我来说,一款编辑器是否符合人体工程学是很重要的考量因素. Spacemacs不仅保留了Vim的那一套高效按键设置,还添加了颇多强大的功能.

Copying/yanking and paste from one window into another

在Spacemacs中使用Vim按键真实太爽了. 你不仅可以用Vim按键写代码,你可以在Emacs的任何地方都使用Vim按键,包括编辑shell. 真是难以想象的舒爽. 举个例子,假设你输出一条shell命令时,本来想输的是

rm /home/user/folder1/folder2/folder3/folder4/folder5/some-file.txt

结果错误地输成了

rn /home/user/folder1/folder1/folder3/folder4/folder5/some-file.txt

这里有两个错误, rm 写成了 rn, folder2 写成了 folder1. 若你是在普通的终端模拟器上操作,则需要先按 上箭头 取回输错的命令,然后用 左箭头Ctrl-Home 将光标移到行首,修改 rnrm, 再按 右箭头 到第二个 folder1 处进行修改.

而在Emacs下就没那么复杂了,你只需要取回上一条错误的命令,然后按下 0 跳到行首,将 rn 改为 rm, 在用 / 搜索到第二个数字 1 处(也可以按 f1f1 跳转过去),用 r 命令将它修改正确.

用Vim的方式操作终端,用Emacs就是这么任性.

我之前用Vim时,使用 'Terminator' 作为我的终端模拟器, 我常常需要开4,5个窗口来打开各式各样的shell和文件. 当我需要把一条命令在终端与文件之间相互拷贝时,需要先用鼠标选中要拷贝的文本,然后按下 Ctrl-Shift-c 将文本拷贝到粘贴板,在切到新窗口,按下 Ctrl-Shift-v 将文本从粘贴板粘贴回来. 而用spacemacs,一切都变得非常简单. 你只需要定位到shell所在的window,然后按下 yy 复制你想要的行,然后切回代码所在的window按 p 进行粘贴. 而且在Spacemacs中切换window本身也很容易,按下 SPC-N 就能切换到第N个window了. 所有这些操作无需鼠标就能搞定了.

Trying to use Vim as an IDE

有一阵子,我使用Vim来编辑代码,但是在 RStudio 或 PyCharm 这样的IDE中调试代码. 虽说这些IDE也支持Vim按键,但是要在代码,终端,IDE之间不断切来切去也挺烦的. 而且我常常在一个项目中要用到多种编程语言,这样就需要打开多个特定语言的IDE,简直不能再烦了. 有鉴于此, 我尝试过用 NerdTreeAirline 等插件将Vim打造成一款IDE来用. 然而我从来没有成功地在Vim调试过(网上有人说搞定了,但是他们的解决方法在我这就是不行).

有人可能会争论说,Emacs也不是个全功能的IDE啊,不过对我来说,它已经足够好用了. 比如,借助 Emacs Speaks Statistics (ESS) package可以让Emacs变身成一个R IDE. 我可以编辑代码,一行行地调试代码,使用 R-dired 来查看变量,甚至输出终端命令,所有这些都能在一个frame中搞定. 它比那些IDE定制性更强. Emacs可不仅仅是个编辑器而已,它甚至远远超出了IDE的范畴,有些人甚至把它看成是一个操作系统!

Duplicating my setup

我希望在多台机器上保持相同的工作方式. 而且我对我的配置也非常的挑剔. 要把我的Vim配置复制到新机器简直就是个噩梦:我需要安装Vim,将 .vimrc 从Github上clone下来,然后创建一个软连接成为 ~/.vimrc, 然后还需要下载那些我喜欢的Vim主题,安装 Vundle,然后用 Vundle 安装一堆的插件.

对Emacs,情况就简单多了(不过还是需要一些手工操作); 我只需要安装好Emacs,从Github上clone下来 .spacemacs,然后创建一个软链接,成为 ~/.spacemacs. 然后启动Emacs, 就OK了,Emacs会自动为我安装好所有的东西,包括主题. 我不需要手工安装像 Vundle 这样的包管理器,不需要手工下载主题文件(当然,我承认可以用shell脚本来实现自动化,但是依然比Emacs要麻烦) 总体来说,安装Emacs插件要方便得多.

Philosophical approach

有些人不喜欢Free Software Foundation(FSF)的那种理念(FSF的创立者和主管是Richard Stallman,他恰好就是Emacs的创造者), 但是我是很赞同FSF所提倡的那种精神的. 我一再强调,我是一个理想主义的学者. 然而令人讽刺的是,虽然大多数学者都在公立机构中任职,但我很少见有学者参与到自由软件的开发(使用Emacs不算)中来. 也就是说,Emacs所代表的FSF及其理念和我作为学则的理念是吻合的(我使用Arch Linux可能违背了FSF的意愿,但是它确实要比ubuntu好用)

Community

Vim/Emacs之争非常的激烈, 但是就我看来,Emacs用于要更有激情一些. 全国各地都有大量的Emacs聚会,人们分享自己的配置,演示有用的技巧. 也许Vim也有类似的聚会吧,但是感觉没有Emacs那么常见. Vim是一款非常有用的工具,而Emacs是一种生活方式.

Vim doesn’t have Tetris

Emacs可以玩俄罗斯方块而Vim不能玩. 争论至此休.

这当然只是个玩笑了, 不过若你和我以前一样,总是围绕着终端,编辑器和IDE转的话,那么我现在要告诉你一个关于Emacs的巨大秘密 - 你可以用它来所有的事情. 下面列出一些我在Emacs中能做而Vim不能做的事情:

  • 使用终端(借助于 eshell)
  • 查看天气情况(使用 forecast.io/dark sky API)
  • Google搜 (使用 helm-google)
  • 收发email
  • 写学术论文(使用 org-mode)
  • 跟踪我的待办列表和日程安排(使用 org-mode)

与在终端中运行Vim打开文件来编辑不同, Emacs从不退出, 用Emacs打开的文件会在各个buffer中显示. 有些人会抱怨Emacs的启动速度好慢,不过对我来说不是什么问题. 我的工作是以Emacs为中心的,我几乎从不关它.

Org mode

Org-mode绝对是个神器. 有些人使用Emacs的目的就是为了用org-mode, 甚至有很多非程序员也在用. 我最开始是通过这个 视频 来学习用org-mode来写作的, 不过 这些 视频 都是学习org-mode好起点.

Org-mode可以用来写作,编写大纲,管理日程,等等其他好多工作. 事实上,这篇文章就是用Spacemacs/org-mode来写得,然后再导成html.

Emacs is fun to learn

我只有实在没办法的情况下才会去学习Vimscript,大多数的使用的Vimscript都是从网上拷贝过来的. 我对写Vimscript感到很反感. 而Emacs就不一样了. 配置Emacs的过程很有趣. 我甚至对学习Emacs-Lisp跃跃欲试,我觉得学习Emacs-Lisp要比学习Vimscript有意义的多. 学习Emacs总能给我带来新的惊喜,我也一直在尝试用它来改进我的工作流程.

Conclusion

从Vim转换到Emacs后, 我总结出了一条结论: Vim并不是一个具体的编辑器,它其实指的是一系列的按键. 你当然可以把它当成一个编辑器来用(而且我偶尔也还会用一下),但Vim的最大贡献是它的按键设置,它的这套按键设置可以说是最好的一套方案,我现在已经完全离不开这套方案了(我甚至在浏览器中都使用这套按键).

Emacs严格来说也不能算是一个编辑器. 我越用就Emacs,就越觉得它实际上就是个操作系统. 你可以把它当成是编辑器,IDE,终端,email客户端,字处理器,日程安排软件,代办事件列表,甚至是life organizer. Spacemacs的motto说的好:"最好的编辑器既不是Emacs也不是Vim,而是两者合一!". Emacs与Vim两者本身是不相斥的. 事实上,他们双剑合璧,无敌于世.

不过,Spacemacs/Emacs也不是说就完美了, 还是有少许障碍的:

  • 我至今尚未发现一款完全满意的Emacs终端;也可能我理想中的终端根本就尚不存在. Eshell能满足我95%的需求(它也是我最常用的终端),可惜缺少IO重定向功能. 当我需要用到IO重定向功能时,我只能用terminator来代替. 当使用ansiterm和multiterm时,缺少Vim按键让我很苦恼,总体来说,这些模拟器都挺难用的.
  • 我还不太会用org-agenda,因此目前我主要用Google calendar来安排任务.
  • Email时常以HTML为内容(而我并不知道如何让Emacs渲染这些HTML),所以我经常要用web版的客户端.
  • 在Emacs中使用Mongo Shell (MongoDB) , Psql (PostgreSQL) 这一类的交互式shell经常会有一些问题,而且有些这类项目已经不再维护了.
  • 使用Emacs的人不多,因此当要与人合作时就比较麻烦了. 需要花额外的时间来将之转换成符合工业标准的格式. 例如,我经常要跟同事分享手稿,而Emacs与工业标准的字处理程序(我不会告诉你是哪个程序的)之间的转换并不理想. 有鉴于此,现在我要把手稿发给同事前都需要先把org文件转换成libreOffice文档(这个转换效果还不错),再发给他们. 我听说网上有人已经解决这个问题了,但是我还不知道怎么搞定它.
  • Emacs作为web浏览器还不够理想.

我觉得所有这些问题终会被解决的. 总体来说,我对现在基于Emacs的工作流程更加满意. 如果你有一些关于使用Emacs的建议的话,欢迎告诉我!