浅谈 Vim

从初次接触 Vim 到现在也有三四年了,已经不记得最初是怎么发现 Vim 了,可能是在折腾自己的服务器的时候?印象中在大三上计算材料学的课折腾 Ubuntu 搭建从头计算法环境的时候已经能够 :wq! 了。哈哈,那就是14年的时候了。

最近在正式的工作中,算是真的把 Vim 融入到核心工作流里面了。于是决定把相关知识体系化一波。此文作为开端吧。

什么是 Vim —— 我在四年使用后的理解

原生的 Vim 是一个静态文本编辑器,所以我主要以静态文本的编辑的观点来看待它,基于这个出发点来使用 Vim 和它的插件体系。

Vim 是模式编辑的代表。Normal, Command, Insert, Visual 等模式给相同按钮赋予了不同的含义,借助这样的理念,Vim 把使用者从鼠标交互中解放出来,从而更加容易达到编辑状态下的心流状态。

作为一个轻松盲打,日常使用五笔的人士,Vim 带来的编辑体验是最好的。盲打解除了视线在键盘和屏幕之间频繁切换打断思路的麻烦,五笔解除了 99% 的情况下的寻找要输入的字而导致的思路中断的麻烦,而 Vim 则继续解除了右手键盘和鼠标切换、寻找光标、甚至是右手移动到方向键上面所造成的思维干扰。

所以,对我来说,盲打 + 五笔 + Vim,让我写代码、写注释非常流畅和舒服,想到哪里基本上就能写到哪里。输入和操作的速度基本上跟思维速度。这些是离不开 Vim 提供的强大的输入模式的。Vim 可以说是这一套操作流的核心之一。

不过,Vim 还是不太适合 debug。做定义跳转之类的工作时,配置比较麻烦,很难开箱即用。但是如果配置好了,又会非常灵活。在使用开箱即用的编辑器时,补全一般是很好的,但是一旦这个补全不能满足要求,那自己比较难调整这种编辑器来满足自己的补全需要。Vim 正好相反,完整的库补全之类的功能需要配置一波,而且补全方案多,挑选起来也费时,但是如果配置好了,那么想把哪些文件作为补全的来源,就可以直接去指定。

然后,Vim 是发展的。传统的 Vim 已经发展到 Vim 8。而更加创新的版本,则有重写了的 NeoVim,基于 Electron 的 NyaoVim (基于 Electron 意味着我们可以使用一切 Web 技术到 Vim 中,这样行内的图片预览,多媒体的分割窗口,都不再是梦想),还有 Mac 上原生的 MacVim, VimR,还有另一类 Web 实现 Oni。另外呢,各个主流编辑器中总能看到 Vim 模式插件。

可以看到,现在想要使用 Vim,选择已经很多了。而且 Vim 也已经不止纯文本编辑器这一种载体,它可以基于 Web,基于原生技术,或者以插件形式出现。这给了我们很多选择。

总之,我觉得 Vim 是一个值得入手的高级工具箱。它的编辑理念是它的精华所在。编辑器圣战没有必要打,毕竟各种编辑器各有所长,联合使用的效果是最好的。比如说,目前我让 Vim, Visual Studio, IDEA, Sublime Text, VS Code 各司其职:Vim 负责高阶编辑和终端编辑,比如涉及宏的、列编辑器、复杂的对齐;VS 看代码、做跳转、自动补全,大量写的时候开 Vim 插件;IDEA 和 VS 差不多,只是 VS 负责 C#,IDEA 负责 Lua;Sublime Text 快速打开小文件; VS Code 写笔记、文章,因为它的预览之类的做的最好。

我最喜欢的 Vim 功能不完全列表

  • 列编辑
  • 录制宏,然后使用宏
  • mark
  • register
  • w, b, %, f, t, 0, ^, $ 位置跳转。基本上与光标和方向键说再见。这是达到编辑心流的重要前提。其重要性不亚于盲打、五笔之于快速打字。
  • 限定区域之后 s/before/after/gc 进行搜索替换
  • 配合一些插件后,可以自增编号列
  • Tabularize 可以对齐注释,格式洁癖必备。
  • 分屏 :vs, :sp
  • 可以在 Visual Studio, Visual Code, Sublime Text, IDEA 等各种编辑器中启用 Vim 模式,虽然不如原生 Vim 强大,但是也非常好用了。
  • 各种功能定制、主题定制。编辑器可以变成我想要的样子,我想要的功能可以自己加。

一些比较赞同的评价

你可以理解成是一堆乐高积木,你可以随意拼凑成各种玩具。用的时间越长,你自己写的这些小脚本,小工具越多,越有种玩我的世界的感觉,我的世界画面好差啊,但很多人爱玩。玩其他 RPG 道理也是一样的,有人喜欢收集各种宝贝自己练武器,打磨装备,有人懒得搞直接商店买武器。几年下来,我自己密密麻麻的自己写了上百个各样功能的小脚本,时间越长越顺手,工作流能不断进化。

作者:韦易笑
链接:https://www.zhihu.com/question/60296892/answer/175402140
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Vim经常需要分为左右两屏写东西,左边的窗口是参考的内容,右边的窗口是实际正在编写的文本。比如你正在重构,或者模仿别人代码写点什么,或者想看看自己即将调用的接口的代码,都会需要开一个新窗口边参考边写。然后当你想让左边的窗口往下滚动几行,继续看接下来更多的参考文本时,你要先退出右边的编辑模式,切到左边窗口,滚屏,在回来进入编辑模式;或者使用鼠标,总之还是要费点神的。我做了两个快捷键 ALT-U / ALT-D 可以让旁边的参考窗口上下滚屏:

noremap <M-u> <C-w>p<C-u><C-w>p
noremap <M-d> <C-w>p<C-d><C-w>p

我就不用切来切去了,再优化成一个函数,就可以不用退出插入模式,直接在原有窗口里 ALT-U, ALT-D 来给另外一边上下滚屏了。重构或者仿照别人代码写点什么,或者查看自己老代码的时候比以前方便多了,如此整个工作流就得到了一次进化。

上面讲的两个小功能,我就写了几行 vimscript就了事了,给大JB或者 atom之类写插件的话,起步就是好几百行代码,七八个文件要编辑,普通用户基本没精力积累。

作者:韦易笑
链接:https://www.zhihu.com/question/60296892/answer/175402140
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

参考

  1. 学好Vim能给我带来什么?