Files
CategoryResourceRepost/极客时间专栏/研发效率破局之道/个人效能/特别放送 | 每个开发人员都应该学一些VIM.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

148 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<audio id="audio" title="特别放送 | 每个开发人员都应该学一些VIM" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/cb/17/cb75b544b4933aac7befa74731fb5f17.mp3"></audio>
你好,我是葛俊。
在“研发流程”和“工程方法”模块中我主要是从团队的角度和你分享如何提高研发效能所以很多同学希望我能分享一些工具的使用来提高自己的效能。所以今天我准备了一篇关于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](https://stackoverflow.com/questions/11828270/how-do-i-exit-the-vim-editor)上提问怎么退出VIM6年以来的阅读量已经接近200万。又比如我还听到过一个玩笑问怎样产生一个随机字符串呢答案是让一个不会使用VIM的人打开VIM并尝试退出。
虽然如此但在美国对开发人员进行的最喜欢的编辑器的调研中VIM往往能排进前5名。我个人的看法是每一个开发者都应该学一些VIM原因有二
1. VIM基于命令行模式的特色能**让文本编辑工作更高效**
1. VIM有极高的跨平台性**可以一次学习然后多处使用尤其可以作为很多其他IDE的插件使用。**
比如当前我在进行微信小程序的项目开发使用VS Code作为我主力IDE。在VS Code中我每天都在使用VIM插件VIM的命令操作大大提高了我的开发效率。作为开发者编辑文本是最基本的工作所以花些时间去了解最基本的VIM操作来提高效率和手指健康是相当值得的。
在我看来VIM有两大特点
1. 具有独特的命令行模式;
1. 跨平台非常棒更能作为插件在很多其他IDE中使用。
而这两个特点也正是我推荐你学习VIM的最主要原因。
## 特点一VIM独特的命令模式使得编辑文档非常高效
非VI系列的编辑器一般只有编辑模式这一种模式也就是说敲击任何主体键都会直接修改文件内容。比如敲击键盘上的e文件里就添加了e这个字符。这里需要注意的是键盘的**主体键**指的是能显示在文件里的键包括a-z、数字、字符等。
而VIM有多种模式其中最主要的是命令模式和编辑模式。命令模式是VIM的默认模式我们用VIM打开一个文件的时候默认进入的就是这个模式。在命令模式中敲击主体键的效果不是直接插入字符而是执行命令。比如
- 敲击字母e表示将光标向右移动到当前单词最后一个字符
- 敲击符号*,表示在当前文件搜索光标所在的单词。
另外,在命令模式中输入“:&lt;命令&gt;回车键”,可以执行一些命令行命令以及进行系统配置。比如:
- 输入:q!表示不保存文件并退出VIM
- 输入:set hlsearch表示打开搜索高亮。
至于我们在其他非VIM编辑器中熟悉的编辑模式需要在命令模式中敲击某些命令才能进入。比如
- 敲击i表示在当前位置进入编辑模式
- 敲击O表示在本行上面添加一个空行并进入编辑模式。
进入编辑模式之后使用体验就跟其他非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的前身是VIVI的前身是Ex。Ex是Unix诞生时代的编辑器。那个时候因为计算机技术以及计算机系统资源的局限性编辑器只能使用命令来编辑文件。所以VIM就一直保留了命令模式。**这个命令模式是初学者难以适应VIM的最主要原因但同时也是VIM能高效编辑文档的关键所在**。
为什么这样说呢在一个非VIM的编辑器中如果要做一个非编辑操作的时候你需要敲击一个非主体键或者组合键才能完成而在VIM的命令模式中你通常只需要敲击主体键。比如
<img src="https://static001.geekbang.org/resource/image/46/ee/4621ad994d6a424b0ca33648a6b1d7ee.jpg" alt="">
我们在编辑文件的时候有大量的非输入操作比如挪动光标、查找、删除等所以在非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的操作对比如下表
<img src="https://static001.geekbang.org/resource/image/8c/88/8cf8ad75bd83c536898c816971c2c788.jpg" alt=""><br>
统计下总次数,如下表所示:
<img src="https://static001.geekbang.org/resource/image/4d/3a/4d9cd2d035140d8f61451f3d5b70e23a.jpg" alt=""><br>
可以看到,在这个场景中**使用VIM可以明显减少按键次数包括组合键次数和特殊键次数。**在真实的编辑场景中,我的经验是减少的按键次数会更多,对文本编辑效率的提高非常明显。
另外组合键和非主体键这两种按键方式非常容易对手腕和手指造成伤害。其实我之前是Emacs的重度使用者但使用了四年之后我的左手小拇指开始不舒服这是因为在Emacs中我常常需要用这个手指按住Ctrl键来完成组合键操作。比如使用Ctrl+f向右移动光标使用Ctrl-x Ctrl-S保存文件。
为了手指健康我试着从Emacs向VIM转移。一个月之后手指不舒服的症状明显减轻了。于是我逐渐停止了使用Emacs全面转向VIM。此后双手再长时间使用键盘工作也不容易疲劳了。
## 特点二VIM是跨平台做得最好的编辑器没有之一
因为VIM的悠久历史同时一直在持续更新所以在各大操作系统上都有适用的VIM版本你可以到[VIM的官网](https://www.vim.org/download.php)上查看详情。所以你掌握的VIM技能**基本可以用在所有的操作系统上**。
具体来说在Unix系统上都有预装VI。因为VIM的命令是向上兼容的所以你熟悉的VIM的基本功能在VI上仍然可以使用。Linux系统自带的基本都是VIM比如Ubuntu18.04自带的版本就是VIM8.0。苹果操作系统因为是Unix的一个分支所以预装有VIM。
Windows上没有预装VIM。不过你可以很方便地安装GVIM或者直接运行一个免安装的可执行GVIM程序。
在移动端操作系统上VIM在iOS和Android端都有移植
- iOS上面比较好用的叫iVIM。我在iPad中进行一些重量级文本编辑的时候就会使用iVIM。具体的使用方法是将需要编辑的文本拷贝到VIM里面编辑好了之后再拷出来使用体验也还不错。
- Android上的VIM移植得比较多比如DroidVim就还不错。
VIM跨平台特性的另外一个表现是**很多其他编辑器及IDE都有VI模式**支持最基本的VIM操作。
比如IntelliJ系列的IDE上有[IdeaVim插件](https://www.jetbrains.com/help/idea/using-product-as-the-vim-editor.html)、VS Code里有[VSCodeVim插件](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim)甚至VIM的老对手Emacs里也有好几个VI插件最有名的是[Viper Mode](https://www.emacswiki.org/emacs/ViperMode)。
我最近半年使用最多的编辑器VS Code所以我以它为例与你说明如何在其他编辑器中使用VIM。
VSCodeVim插件的安装很简单使用默认的VS Code插件安装方法很容易就能搜索到并一键安装配置也简单默认的配置使用体验就非常不错。我在使用VSCode一个月后对VS Code比较熟悉了开始试用VSCodeVim插件之后就再也回不到原生模式了。因为VIM带来的效能提升以及给手指带来的舒适感觉实在是太明显了。
VIM的跨平台特性甚至超越了编辑器这个范畴**在一些不是编辑器的软件里面也有VI模式**。比如Chrome浏览器和FireFox浏览器中都有VI插件用户可以使用VI的快捷键方式来操作。
在我看来在浏览器上使用VI模式的最大好处是可以减少鼠标的操作。这一点对我的吸引力不是很大不过我的另外两个朋友一直在使用Chrome的VI模式插件[Vimnium](https://vimium.github.io/),反馈都是很好用。如果你非常偏好键盘而不是鼠标的话,推荐你也试试看。
在**配置**方面VIM的默认配置就基本够用。所以我一般只在自己的主力开发机上才会添加一组我的常用配置及插件来提高使用体验其他不常用机器就保留默认配置。
总的来说VIM的跨平台做到了极致因此我在很多地方都能用到积累的VIM经验。VIM肌肉记忆不断强化一直在帮助我提高工作效率。
## 小结
在这篇文章中我着重与你讲述了VIM的命令模式与跨平台特性这两大特点。通过对这两个特点的深入探讨阐述我认为每个开发人员都应该学一些VIM的理由。
VIM编辑器的命令模式是与其他非VIM编辑器的最大区别。也正是因为这个特性使得其入门比较难令很多新手望而生畏。但也正是因为命令模式才使得VIM对于个人研发效能的提升帮助非常大。
而跨平台特性使得我们一旦掌握了VIM技能就基本可以用在所有的操作系统上甚至是其他IDE中通过插件使用从而最大程度地实现经验复用。
其实除了命令模式和跨平台特性外VIM还有一些其他好处比如速度快、免费、可扩展性强等。但是我认为这两点从根本上把VIM和其他编辑器区别开来了它们能让我们非常高效、健康的编辑文本。所以说付出一些成本去学习VIM的基本使用是非常值得的。
有一种说法是,说人的双手在一生中能够按键盘的总次数是一定的,达到这个总次数之后,手指就不能很好地使用键盘工作了。不知道你信不信,反正我信了。
关于VIM的话题我们今天就讨论到这里了。在“个人效能”模块我还会与你详细分享如何高效地学习VIM并分享关于VIM的一些使用方法和技巧帮你学会、用好VIM这个工具。
## 思考题
1. 除了Windows你见过没有预安装VI的系统吗那个系统上自带编辑器是什么呢在这个系统上你又是如何完成文本编辑工作的呢
1. 你见过VIM教徒和Emacs教徒的争吵吗
感谢你的收听,欢迎你在评论区给我留言分享你的观点,也欢迎你把这篇文章分享给更多的朋友一起阅读。我们下期再见!