我为什么从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
将光标移到行首,修改 rn
为 rm
, 再按 右箭头
到第二个 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,简直不能再烦了.
有鉴于此, 我尝试过用 NerdTree
和 Airline
等插件将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
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的建议的话,欢迎告诉我!