你好,我是葛俊。

在“研发流程”和“工程方法”模块中,我主要是从团队的角度和你分享如何提高研发效能,所以很多同学希望我能分享一些工具的使用,来提高自己的效能。所以今天,我准备了一篇关于VIM的文章。在这篇文章中,我会着重带你深入了解VIM的两个特点。因为正是基于这两个特点,VIM可以很好地提高我们的工作效率。至于更多的、具体的VIM使用方法和技巧,我会在接下来的“个人效能”模块中,用另一篇文章专门详细与你介绍。

如果你已经是一个VIM的使用者了,那我希望文中关于VIM原理的讨论,可以帮助你更深入地理解它,进而可以更高效地使用它。而如果你还不是VIM的使用者,那我推荐你学习它的基本方法,并寻找适当的场景去使用它。

其实,向开发者们推荐编辑器,尤其是像VIM这样一个比较容易引起争议的编辑器,是一件有风险的事儿。但,基于我对VIM的了解和它能给开发者带来的巨大好处,我认为这个风险是值得的,相信你也能从中有所收获。

我们下来看看什么是VIM。

什么是VIM?

VIM是一个老牌的编辑器,前身是VI,第1个版本发行于1978年,距离今天已经有41年的历史了。

VIM是VI Improved,是提高版的VI,相对来说比较新,但实际上它的第1个版本也早在1991年就发布,也已经有28年的历史了。

VIM和我们日常使用的编辑器,比如VS Code、Notepad++、Sublime Text等,差别很大,而且上手比较难,新手在使用时常常会手足无措。一个常见的问题是,打开了VIM就不知道怎么退出。比如,有人就曾在Stack Overflow上提问怎么退出VIM,6年以来的阅读量已经接近200万。又比如,我还听到过一个玩笑,问怎样产生一个随机字符串呢,答案是让一个不会使用VIM的人打开VIM并尝试退出。

虽然如此,但在美国对开发人员进行的最喜欢的编辑器的调研中,VIM往往能排进前5名。我个人的看法是,每一个开发者都应该学一些VIM,原因有二:

  1. VIM基于命令行模式的特色,能让文本编辑工作更高效
  2. VIM有极高的跨平台性,可以一次学习然后多处使用,尤其可以作为很多其他IDE的插件使用。

比如,当前我在进行微信小程序的项目开发,使用VS Code作为我主力IDE。在VS Code中,我每天都在使用VIM插件,VIM的命令操作大大提高了我的开发效率。作为开发者,编辑文本是最基本的工作,所以花些时间去了解最基本的VIM操作来提高效率和手指健康,是相当值得的。

在我看来,VIM有两大特点:

  1. 具有独特的命令行模式;
  2. 跨平台非常棒,更能作为插件在很多其他IDE中使用。

而这两个特点,也正是我推荐你学习VIM的最主要原因。

特点一:VIM独特的命令模式使得编辑文档非常高效

非VI系列的编辑器一般只有编辑模式这一种模式,也就是说,敲击任何主体键都会直接修改文件内容。比如,敲击键盘上的e,文件里就添加了e这个字符。这里需要注意的是,键盘的主体键指的是,能显示在文件里的键,包括a-z、数字、字符等。

而VIM有多种模式,其中最主要的是命令模式和编辑模式。命令模式是VIM的默认模式,我们用VIM打开一个文件的时候,默认进入的就是这个模式。在命令模式中,敲击主体键的效果不是直接插入字符,而是执行命令。比如:

另外,在命令模式中输入“:<命令>回车键”,可以执行一些命令行命令以及进行系统配置。比如:

至于我们在其他非VIM编辑器中熟悉的编辑模式,需要在命令模式中敲击某些命令才能进入。比如:

进入编辑模式之后,使用体验就跟其他非VIM的编辑器效果差不多了,也就是说敲击主体键会直接插入字符。完成编辑工作之后,你需要再敲击Esc键返回命令模式。

请注意,在编辑模式时,我们无法退出VIM。你只能在命令模式中使用ZZ、ZQ、:qa!等命令退出VIM。如果你不会使用VIM,然后不小心在命令行窗口中打开了它,没有菜单可以选择,的确很难找到办法退出,所以就有了各种不能退出VIM的笑话。

另外这里需要指出的是,VIM实际上有多个模式,它的官方文档列举了一共7个基本模式和7个附加模式,而我在这篇文章中只做了命令模式和编辑模式两种模式的划分,是一个巨大的简化。事实上,命令模式中包含了常规模式(normal mode)、命令行模式(command-line mode)等,编辑模式则包括了插入模式(insert mode)、替换模式(replace mode)等。我之所以用命令模式和编辑模式的简单区分,一方面可以帮助你快速理解VIM,另一方面也不会影响你对VIM的使用。

总结来说,拥有命令模式是VIM系列编辑器与非VIM系列编辑器的最大差别。那,VIM为什么会有这种特性呢?

这是由VIM的历史决定的。VIM的前身是VI,VI的前身是Ex。Ex是Unix诞生时代的编辑器。那个时候因为计算机技术以及计算机系统资源的局限性,编辑器只能使用命令来编辑文件。所以VIM就一直保留了命令模式。这个命令模式是初学者难以适应VIM的最主要原因,但同时也是VIM能高效编辑文档的关键所在

为什么这样说呢?在一个非VIM的编辑器中,如果要做一个非编辑操作的时候,你需要敲击一个非主体键,或者组合键才能完成;而在VIM的命令模式中,你通常只需要敲击主体键。比如

我们在编辑文件的时候,有大量的非输入操作,比如挪动光标、查找、删除等,所以在非VIM的编辑器里,我们要大量使用非主体建和组合键。而在VIM中,我们可以大量使用主体键,从而大大减少使用键盘主要部分(也叫工作区)之外的特殊键,同时使用组合键的次数也大大减少了。

所以,综合来讲,虽然VIM中的模式切换会带来一些额外按键操作,但次数远远小于它节省的按键次数,总的按键数量明显减少。

接下来,我们通过一个具体的案例对比一下效果吧。我在输入一行代码注释时,希望输入的结果是

// This is making sure that userTotalScore is not null

但写到“not”的时候,我注意到我前面有一个拼写错误,把“making”写成了“mkaing”了

// This is mkaing sure that userTotalScore is not
                                                 ^

现在,我需要修改这个错误,修改之后再回到行尾,补充“ null”写完这句话。以Mac为例,不使用VIM和使用VIM的操作对比如下表:


统计下总次数,如下表所示:


可以看到,在这个场景中,使用VIM可以明显减少按键次数,包括组合键次数和特殊键次数。在真实的编辑场景中,我的经验是减少的按键次数会更多,对文本编辑效率的提高非常明显。

另外,组合键和非主体键这两种按键方式非常容易对手腕和手指造成伤害。其实,我之前是Emacs的重度使用者,但使用了四年之后,我的左手小拇指开始不舒服,这是因为在Emacs中我常常需要用这个手指按住Ctrl键来完成组合键操作。比如,使用Ctrl+f向右移动光标,使用Ctrl-x Ctrl-S保存文件。

为了手指健康,我试着从Emacs向VIM转移。一个月之后,手指不舒服的症状明显减轻了。于是,我逐渐停止了使用Emacs,全面转向VIM。此后,双手再长时间使用键盘工作,也不容易疲劳了。

特点二:VIM是跨平台做得最好的编辑器,没有之一

因为VIM的悠久历史,同时一直在持续更新,所以在各大操作系统上都有适用的VIM版本,你可以到VIM的官网上查看详情。所以,你掌握的VIM技能基本可以用在所有的操作系统上

具体来说,在Unix系统上都有预装VI。因为VIM的命令是向上兼容的,所以你熟悉的VIM的基本功能在VI上仍然可以使用。Linux系统自带的基本都是VIM,比如Ubuntu18.04自带的版本就是VIM8.0。苹果操作系统因为是Unix的一个分支,所以预装有VIM。

Windows上没有预装VIM。不过你可以很方便地安装GVIM,或者直接运行一个免安装的可执行GVIM程序。

在移动端操作系统上,VIM在iOS和Android端都有移植:

VIM跨平台特性的另外一个表现是,很多其他编辑器及IDE都有VI模式,支持最基本的VIM操作。

比如,IntelliJ系列的IDE上有IdeaVim插件、VS Code里有VSCodeVim插件,甚至VIM的老对手Emacs里也有好几个VI插件,最有名的是Viper Mode

我最近半年使用最多的编辑器VS Code,所以我以它为例,与你说明如何在其他编辑器中使用VIM。

VSCodeVim插件的安装很简单,使用默认的VS Code插件安装方法很容易就能搜索到,并一键安装;配置也简单,默认的配置使用体验就非常不错。我在使用VSCode一个月后,对VS Code比较熟悉了,开始试用VSCodeVim插件,之后就再也回不到原生模式了。因为,VIM带来的效能提升,以及给手指带来的舒适感觉实在是太明显了。

VIM的跨平台特性甚至超越了编辑器这个范畴,在一些不是编辑器的软件里面也有VI模式。比如,Chrome浏览器和FireFox浏览器中都有VI插件,用户可以使用VI的快捷键方式来操作。

在我看来,在浏览器上使用VI模式的最大好处是,可以减少鼠标的操作。这一点对我的吸引力不是很大,不过我的另外两个朋友,一直在使用Chrome的VI模式插件Vimnium,反馈都是很好用。如果你非常偏好键盘而不是鼠标的话,推荐你也试试看。

配置方面,VIM的默认配置就基本够用。所以,我一般只在自己的主力开发机上,才会添加一组我的常用配置及插件来提高使用体验,其他不常用机器就保留默认配置。

总的来说,VIM的跨平台做到了极致,因此我在很多地方都能用到积累的VIM经验。VIM肌肉记忆不断强化,一直在帮助我提高工作效率。

小结

在这篇文章中,我着重与你讲述了VIM的命令模式与跨平台特性这两大特点。通过对这两个特点的深入探讨,阐述我认为每个开发人员都应该学一些VIM的理由。

VIM编辑器的命令模式,是与其他非VIM编辑器的最大区别。也正是因为这个特性,使得其入门比较难,令很多新手望而生畏。但也正是因为命令模式,才使得VIM对于个人研发效能的提升帮助非常大。

而跨平台特性,使得我们一旦掌握了VIM技能,就基本可以用在所有的操作系统上,甚至是其他IDE中通过插件使用,从而最大程度地实现经验复用。

其实,除了命令模式和跨平台特性外,VIM还有一些其他好处,比如速度快、免费、可扩展性强等。但是,我认为这两点从根本上把VIM和其他编辑器区别开来了,它们能让我们非常高效、健康的编辑文本。所以说,付出一些成本去学习VIM的基本使用是非常值得的。

有一种说法是,说人的双手在一生中能够按键盘的总次数是一定的,达到这个总次数之后,手指就不能很好地使用键盘工作了。不知道你信不信,反正我信了。

关于VIM的话题,我们今天就讨论到这里了。在“个人效能”模块,我还会与你详细分享如何高效地学习VIM,并分享关于VIM的一些使用方法和技巧,帮你学会、用好VIM这个工具。

思考题

  1. 除了Windows,你见过没有预安装VI的系统吗?那个系统上自带编辑器是什么呢?在这个系统上,你又是如何完成文本编辑工作的呢?
  2. 你见过VIM教徒和Emacs教徒的争吵吗?

感谢你的收听,欢迎你在评论区给我留言分享你的观点,也欢迎你把这篇文章分享给更多的朋友一起阅读。我们下期再见!

评论