不要复杂化Vim

这是一个各有自家意见的话题,说说你的看法吧

我是本科的时候接触Vim的,当时就沉迷其中无法自拔,想想也可以理解,一个20出头崇尚黑客文化的少年,无意间发现了可以整天在键盘上打字而手不用碰鼠标的方式,多酷啊,写东西的效率提高不说,关键是在别人面前装黑客可以装得更像。于是乎,花大量的时间先记住各种按键,然后花大量时间去网上找Vimrc模版,能集成多少就集成多少,最后花大量时间找各种插件,什么插件看上去牛逼就装。最后抱着“把Vim打造成IDE”的远大理想,在网上到处搜寻相关文章,还到处找人争论吵架,总之最后不把Vim搞成编辑器中的高富帅,高大全,心里总是不甘心的。

当然不是所有的Vimer都是和我当时一样幼稚的,但从我的观察看,类似的Vimer还是不少的。我可以理解为什么这部分Vimer会经历这个过程,但可惜的是,很多人用了很多年,还处在这个阶段,在我看来,那就是陷入了Vim的使用误区了。我在这里谈谈为什么我有这种论断,也希望能帮助年轻或者刚入门的Vimers赶紧跳出这个误区,把时间用在更有意义的地方。

Vim是一个文字编辑器,它的使命是提高文字编辑的效率,完。任何别人帮Vim安排的使命,都不是Vim真正的使命。有的人说Vim能提高软件开发的效率, 有人说Vim能提高系统管理的效率,还有人说Vim能提高你的Unix的理解,我觉得最后就差有人跳出来讲“Vim如何改变一个人的生活”的故事了。

这些说法,在某种意义上你都可以认为是对的,但这不是Vim直接带来的,而是Vim带来的“高效编辑”的积极副作用。比如说,你觉得用Vim开发软件效率高,是因为你用它编辑code的效率高,配合别的开发工具之后,整体效率就高了。这个“别的工具”可以是别的一堆开发工具,也可以是别的一个大型IDE,Vim干Vim的事情,别的工具干别的工具的事情,一点都不冲突。

软件开发需要的工具很多,小到代码自动补全,语法检查,文件和类之间的跳转,大到整体项目代码浏览,调试器,代码版本管理,等等等等。所以无数Vim爱好者在业余时间开发大量的第三方插件,致力于将整个软件开发流程中所有能用到的工具都集成到Vim中去。这样做有问题么?对这些人来说是没问题的,因为他们如果这样做,原因不外乎两点,一是他们不喜欢现有的针对这种工具的调用方式,而是他们有能力用好这个Vim插件。但这就给所有人造成了一个暗示,那就是Vim能做所有IDE能做的事情,Vim可以成为一个IDE,大包大揽。然后无数的初学者在业余时间去寻找大量的第三方插件,不管自己的需求如何,也要先把自己的Vim配置成看起来完整的IDE,然后整天要不就在和插件的bug或者冲突做斗争,要不就是去网上找更好更牛逼的插件,最后自己的.vim/下几十个插件,每天真正用到的也没有几个,还在vimrc里面写了大量的插件相关配置。

这种Vim的使用方式是本末倒置,某种程度上是降低了Vim对编辑效率的提高,一个简单的例子就是vim的启动时间恶化。

如果你觉得你就是这样的Vimer的话,我有两个劝告。第一个劝告是,

不要尝试让Vim做所有你能想到的事,而是尝试让Vim帮助你做你遇到的难事。

这句话听起来很玄乎,你会说,我这些插件都有用啊,解决的都是难事啊,你说这不是难事,那在你眼里什么才是难事?有一个办法可以很简单地帮你判断,对于你的Vim使用情况而言,什么才是真正的难事。你需要遵循下面几步:

简单化你的vimrc,更具体点,就是加上一些基本的功能,比如语法高亮,行号,noncompatible等等。这些设置加起来不会超过20行。
去掉你的所有插件。对,是所有。
开始用Vim进行你的日常工作。遇到什么问题了,先想想Vim自己自带的功能能否解决,Google一下,看一下Helpdoc。如果需要写到Vimrc里面的,就写进去。很多时候你会很惊讶地发现,哦,原来Vim默认就有这么一个功能。
如果是在找不到对应的能很好很容易解决这个问题的自带功能,而且这个问题是你会长期固定会遇到的问题,再去找对应的插件并安装。

按照这几部操作走,过一个月你再看看,你装了哪些插件了?然后再一个一个确认,这些插件你这个月都用过,而且不止一次?这样,你就真正找到能协助Vim解决你难题的插件了。

对于初学者而言,这个过程不仅仅是帮助他们去掉追求Vim的华丽所带来的臃肿,更重要的是,更好帮助他们理解Vim的工作原理,明白为什么有插件,为什么需要装这个插件。

我的第二个劝告是,

不要抵制IDE。

IDE从某些角度上讲是很差的,它们倾向于提供很多无用的功能,拖慢其他关键的使用流程,它们很臃肿,庞大,吃机器。它们都是面向初学者设计的,恨不得吧所有的信息放在你的面前(参见VS和Eclipse),所以你50%以上的屏幕都在显示不关键甚至没有关系的信息。这对于老手而言是对于编写效率的影响。这些我通通都理解。

但这不是IDE的本质。对于IDE而言,虽然你用它的大部分时间都是来编辑代码,但千万别被欺骗了,代码编辑只是IDE的一个小功能。除此之外,它要自动编译,语法检查,部署可执行文件,基于语法的重构,调试,自动生成代码,管理代码版本,等等等等。对于一些领域,比如移动开发,IDE要干的事情就更多了,比如渲染当前的界面文件,管理SDK,等等。这里面有很多事情是Vim没法做的,还有一些是你可能需要花很大精力才能达到并不出色的效果。所以,盲目抵制IDE是没有意义的,只能是给你自己带来损失。

这就又回到了刚才的话题。Vim是一个文本编辑器,这个星球上这好的文本编辑器之一。仅此而已。Vim不是IDE,不管你怎么去改造,Vim都不是IDE。它不面向任何一种特别的语言或者文本类型,它通用于所有的文本。在大部分文本编辑的情况下,你需要集中精力,关注于某个特定的情景,比如当前的代码文件,你还需要快速而精确的操作,不管是跳转还是编辑。这都是Vim能给你的。其他所有的一切,都不是Vim的核心。因为Vim从低层的设计开始就不是为希望像IDE那样服务的。Vim不理解你的代码(YCM很大程度上倒是缓解了这个问题),它也没打算理解的代码。你可以有一些出色的辅助功能,但大部分情况下,传统的IDE更加合适。

对于很多Vimer来说,装上了Taglist,装上了NERDTree,装上了REPL,装上了Syntastic,wow,这是一个完整的IDE!哥们,这不是IDE。它看起来像IDE,但它真的不是IDE。你花了无数精力打造的Vim IDE,最终只是镜中月水中花,假的。

好了,亲爱的读者,如果你看到这里,我估计有两种可能性,一种是你觉得我说的还是有点道理的,还有一种就是觉得这些都是在放屁,你想看看我接下来还会如何接着胡说八道。嗯,对于第二种读者……来,跟着我念10遍:

Vim不是IDE。Unix/Linux才是。

注意,这句话对于第一类读者,或者说非第二类的所有读者都不适用,只对第二类读者适用。为什么?因为到现在还抱着“Vim可以成为IDE”观念的人,基本都是Unix/Linux terminal的死忠用户。他们用,或者写,各种插件,把各种工具集成到Vim,调用得不亦乐乎,并认为这绝对是地球上最高效的工作模式。

嗯,这可能是高效的。但对他们而言,Unix/Linux才是IDE。

我是不是在宣传Vim不如IDE?我觉得不是。我自己就算是一个Vim的忠实用户,我只是不喜欢自己给自己找别扭。我做Go/C的开发,一点也不碰IDE,对于Go这种本身就自带非常出色的开发工具的东西,一个YCM,加一个NERDTree,配合gocode,完全就满足开发需要了。但当我做Android开发的时候,我绝对不会碰Vim,我们都不说界面可视化或者重构这些东西了,就说从Java code跳到对应的xml code,用Vim就能把人急死。相反,我会安装vim编辑模式的插件,在Android Studio/Eclipse里面用上基本的Vim操作。

我们要把Vim的理解简单化。这样才能将Vim用在各种各样的场合,让它帮我们解决它应该解决的问题。这点对于Vim的初学者来说尤其关键。与其浪费时间去证明Vim无所不能,不如去证明,在Vim的帮助下,你无所不能。

http://www.kunli.info/2013/08/13/vim/comment-page-1/#comment-2839