Vim, 不仅仅是一个编辑器

Vim是什么

Vim,一款被称之为编辑器之神的上古神器,从出生到现在已经有27年了。程序员普遍是喜新厌旧的,在这个存在着一票有着现代化的UI,各种智能操作的编辑器,IDE的时代,Vim看上去就像是早就应该被抛弃的IE6,但为什么一款这么古老的编辑器却依然有一批坚定地拥护者呢?要回答这个问题,我们必须知道,Vim是什么?
Vim是什么,相信绝大多数听过的人的第一反应都是黑黑的终端下的一个编辑器。是的,Vim是一款广泛应用在类UNIX系统下的文本编辑器,是基于更古老的一款编辑器VI发展而来的。Vim和其他的编辑器最大的差别就在于它的编辑方式。几乎所有其他的编辑器,都或多或少地依赖鼠标操作,但Vim可以说是完全抛弃了鼠标。为了达到离开鼠标的目的,Vim发展出了一套独特的按键操作,这让众多的新手纷纷放弃。在StackOverflow上,关于如何退出Vim的回答有一百万的浏览量。就这样一款让新手退出Vim可以用来生成随机字符串的的按键规则,才是Vim的精髓之所在。Vim发展到现在,早已不仅仅是一款编辑器,它更多的是代表了一套可以摆脱鼠标的按键规则。在文本编辑领域,目前几乎所有的主流编辑器都直接获间接提供了对这一套按键规则的支持;在主流的浏览器上,都可以安装提供这一套按键规则的插件;还有诸如Ranger等CLI程序,均可以使用Vim的按键规则。

为什么学Vim

那我们为什么要学习Vim呢?首先我们必须纠正几个错误的观念。

  • 用Vim很有逼格。很多新手都觉得在终端下操作是一件很炫酷的事,如果用Vim在终端下写代码,那就更炫酷了。于是这些人为了更有逼格,开始盲目地学习Vim。然而其中的绝大部分人,被Vim可怕的学习曲线吓到了,在仅仅知道如何退出Vim后变带着反人类的怨念离开了。Vim在部分人心中已经成了装逼的象征。带着这样的心理去学习Vim的人,是永远也无法感受Vim的魅力的。Vim只是一套按键规则,并没有什么技术含量,Vim用的熟练的人,无他,唯手熟尔。
  • 使用Vim可以提高开发效率。如果说在上古时期,和其他文本编辑器做对比,Vim或许真的有提高开发效率的作用。但在IDE越来越智能化的现在,尤其是像Visual Studio和Android Studio这些大型IDE的出现和完善,单单使用Vim反而会降低开发效率。首先,在开发中编码其实只占其中的一部分。而在编码中,编辑又只占其中一部分,思考,调试实际上花费的时间可能会更多。整个软件开周期,真正花在编辑器上的时间所占比例其实并不高。而在除代码编辑外的其他方面,IDE则体现出极大的优势。相对于Visual Studio的调试功能,Android Studio的项目管理,Vim可以说是简陋甚至是残缺了。因此不要妄想使用Vim可以提高多少开发效率,这也不应该是我们学习Vim的动力。
  • Vim通过插件可以达到IDE的水平。不可否认,Vim的可扩展性十分强大,自由的配置和众多的插件大大提高了Vim的可定制性。但不得不承认,近几年类似与Atom,VSCode等编辑器的插件要比Vim的插件发展速度迅猛的多,而且IDE在代码调试,性能分析等方面的优势是Vim目前难以实现的,更别提VS,AS等大型IDE目前也支持大量的插件来进行扩展。

因此,如果你是抱着上面这三个观念来学习使用Vim,抱歉,Vim并非适合你的工具。学习Vim的真正目的应该是以下几点。

  • 通用的一套按键规则。正如上文所说,Vim的精髓在于一套无需鼠标的按键规则,这套按键规则源于Vim编辑器,但如今已不仅限于Vim编辑器。众多的编辑器,IDE都可以使用Vim的按键规则来进行代码的编辑。掌握了这一套按键规则,我们可以省下大量的编辑器或IDE的学习联系时间。我们可以在VSCode中使用dd删除一行代码,也可以在Android Studio中使用同样的命令实现完全一样的效果。
  • 高度的可定制化。Vim提供了强大的扩展接口,我们可以定制几乎一切。我们可以调整按键,添加自己的命令组合,通过多种语言编写Vim的插件。很多初学者习惯直接照搬他人的Vim配置,虽然这样前期可能会方便很多,但每个人都有自己的按键习惯,操作方式,没有哪一套配置是可以满足所有人的口味的。Vim是一个需要积累的编辑器,只有搭配出最适合自己的一套配置,才能用得更舒服。
  • 极低的环境依赖性。很多IDE都有平台,甚至是配置的限制。Visual Studio过于庞大,安装一次都需要一上午,Android Studio对内存的占用“可能”间接导致了内存条的涨价。IDE的笨重和平台依赖性导致我们很多时候不得不选择Vim。Vim几乎可以运行在所有平台,而且Vim对配置的要求极低。而且由于终端编辑器的特性,我们只需要一个终端,我们就可以进行开发,我甚至尝试过在手机上使用Vim(Termux)。对于需要基于进行Linux开发的人来说,Vim可能是仅有的几个选择。

Vim修炼秘籍

Vim的学习曲线是极其可怕的。相对于其他编辑器或IDE,Vim的入门门槛相当高。根据个人的学习使用经历,下面将分为几个阶段来分享一下如何修炼Vim。

第一阶段

学习Vim基本按键规则。很多人学习Vim的一个误区是尚未掌握Vim的精髓便去折腾各种配置,插件。最终折腾的心力交瘁,含恨脱坑。一开始就去折腾这些往往是拣了芝麻丢了西瓜,因为Vim的按键规则才是具有普适性的核心。
和其他编辑器或IDE不同,学习Vim的第一个阶段对于绝大部分新手来说是最痛苦的。因为我们必须抛弃以往的操作习惯,最直接的莫过于移动光标。绝大部分人最习惯的都是使用鼠标获键盘上的上下左右键来进行光标移动,而Vim则是看上去毫无理由的hjkl键,对新手来说可以称之为反人类了。大批的新手死在了第一阶段,选择从入门到放弃。
在这个阶段,我比较推荐的是Vim自带的Vimtutor帮助程序。简短,边学边练,是一个相当适合新手的工具。但切忌走马观花,草草浏览一遍就过了,必须要熟悉里面提到的每一个知识点,并进行一定次数的训练。在日后的不断使用中,这些操作都将形成肌肉记忆。

第二阶段

学习Vim的高级用法和基本配置。这里强烈推荐Practical Vim(中译名《Vim使用技巧》)这本书。在掌握Vim的基本按键规则后,这本书可以帮助我们深入了解Vim,掌握Vim的使用技巧。大部分技巧都会针对使用例子讲解如何使用Vim更快更好地处理。建议对于每一个例子,可以先自己去思考如何实现,然后再根据书中的说明,动手操作。这样我们可以更好地理解为何书中的处理称之为技巧。
同时,这个阶段可以慢慢去进行一些Vim选项的个性化配置,这些配置往往可以被其他编辑器或IDE支持,也是具有一定的普适性,目前我接触过的IDE中,Visual Studio,Android Studio和QtCreator都是支持加载Vim的基本配置文件的。
对于绝大部分并不经常直接使用Vim编辑器的人来说,完成第二阶段就已经足够了。但如果你经常需要使用Vim编辑器进行开发,我们还需要对Vim进行更多地打磨。

第三阶段

完善Vim编辑器。在经过前两个阶段的学习,我们已经基本掌握了Vim的用法。但一个未添加任何扩展的Vim要运用到实际开发中是不够的。我们需要借助插件来扩展Vim的功能。在选择插件时,我们必须记住,贵精不贵多,过多鸡肋的插件反而会拖慢Vim的速度。但如何挑选插件,这里有几点可供参考。

  1. 参考他人的配置,但不可盲目复制。对于一些使用较长时间vim的人来说,他们的插件往往已经经过多次的筛选调整,十分具有参考价值。这里推荐几个比较出名的Vim配置。
  1. 不选择无人维护的。由于Vim的时间跨度很大,不少插件已经年久失修,无人维护了。这些插件往往对新的特性缺乏支持,性能或兼容性上有所欠缺
  2. 善于搜索

找到合适的插件后,是需要学习和配置的。为什么我不推荐直接使用他人现成的配置,除了不一定适合外,由于直接照搬他人的配置,很多插件的配置和使用难以真正掌握,我们难以针对性的进行配置,无法了解到某个功能具体是由哪个插件提供的。当我们选择使用一个插件,至少应当读一下插件在Github上的README,了解下有哪些配置和默认参数,并进行一些适合自己的调整。
对于插件配置管理,我强烈建议不要把所有的配置项都往.vimrc这一个文件中放,这会导致你的vimrc腐烂,失去控制最终无法维护。善于使用source命令,保持配置文件的整洁,对于Vim的配置管理至关重要。

第四阶段

编写你自己的插件。当现有的插件已经无法满足我们的需求的时候,我们可能需要自己动手编写插件了。vim提供了多种语言的支持,包括VimScript,Python,Lua等,我们可以使用任何一种我们熟悉的语言来对Vim进行扩展。

个人经验

以下是我学习使用Vim两年多以来的一些个人经验。

  • 坚持再坚持,一日不脱坑,就离目标更近一点。
  • 学习Vim基本功时切忌走马观花,过一遍教程,浏览一下书籍便过了。一定要反复练习,不求达到肌肉记忆,至少也得大脑长期记忆。
  • 刻意练习。一种效果往往可以通过多种操作实现,比较差异,刻意练习更好地那种