Vim 的哲学(二)

935 查看

学会用不同的角度去看待和理解这个世界,你收获的永远会比你想象的更多。

上回我分享了如何掌握基础移动的心得体会,而对于很重要的模式却只是一带而过,这其实是有原因的。过去我有过几次教新手 Vim 的经历,按照惯常的方式先告诉他们模式切换,然后再讲基础移动。然而我发现一旦他们掌握了模式转换,他们就会迫不及待的开始输入,紧接着就会因为方向控制的别扭而倍感受挫,人就是这样,谁都不喜欢在别人面前表现的很笨拙不是么?

所以我决定换个策略,利用游戏与交互教程帮助他们在轻松有趣的环境下先建立起信心,等他们回到真实环境的时候就不会有挫折感了。这很有效!其实学习这件事情大抵都是如此,入门时期的挫折遭遇很容易丧失兴趣和信心,甚至导致此生都不再愿意去碰一下。缘分的建立不就是在合适的时间地点以合适的方式产生联系吗?

现在我想你已经在不知不觉中建立起了微妙的联系,接下来我们开始了解模式。

常规模式(Normal Mode)与插入模式(Insert Mode)

这俩模式是最常用的,对于模式我们现在抛出两个疑问:模式是干什么的呢?为什么要有模式呢?

模式是干什么的呢?

大体上我们可以把“打字”这件事情分成两个部分,一个是输入,从无到有的过程;另一个是编辑,对已存在的文字进行复合操作,包括:复制,剪切,移动,修改,删除,格式化等等。

大部分的编辑器都只有一种模式,以上两部分的操作合并在一起进行,这就是为什么会有菜单和按钮的原因,而对于文字的范围选择也需要额外的方法来辅助,比如快捷键和鼠标操作等。无论是什么样的情况我们都不得不迫使大脑在思考(输入)和寻找(编辑)中不停转换,即使你不在意这一点,始终有一些操作你是无法流水化的。比如说:在光标随意停留在某处的时候,你能闭着眼睛用鼠标点击到某个功能吗?Vim 就可以。换言之一旦你掌握了 Vim之后,所有的操作——强调一遍:所有的操作都可以不用寻找,不用鼠标等工具辅助,你可以全副身心投入在你的主要目标上。

嗯?你说你全部用快捷键?呵呵,那文字选择呢?再快的快捷键也无法胜过 Vim 选择任意目标的速度。

好了,让我们回到正题。从现在开始你要记住两件事情:

  1. 一旦你想要在屏幕里写点什么,就按下 i 键进入输入模式,它的含义是:Insert(插入);
  2. 一旦你需要停下来——不管是你想要进行编辑或是你脑袋卡壳了要思考一下,总之只要你不再输入了,就离开插入模式返回常规模式。记住:你在 Vim 里的常态是常规模式,而不是输入模式。

关于返回模式的方法,常见的有三种,你可以现在就做出你的常规选择,我会讲出需要你考虑的要素:

  1. 使用 ESC 键:这是最通用的方法,它唯一的缺点就是距离标准键位较远,然而由于它的位置在左上角,所以你也可以做一些强化练习来准确的找到它。记住:不要看键盘去找,要形成肌肉记忆!也有很多人偏好修改 ESC 键位,比如说把它转移到 CapsLock,即大写锁定键上去,这是可取的,并且也十分有效,然而我不推荐这么做。因为修改键位相对来说麻烦一些,在某些场景会让你颇感不便。比如说你去客户那里安装服务器,遇到的几乎都是标准键盘,不光是在 Vim 下让你难受,其他的地方也是如此,因为 ESC 太常用了,而且没有第二替代键。

  2. 使用 Ctrl-[ 组合键:它的功能和 ESC 完全等价,只是组合键稍微困难一些。这里的窍门是 Ctrl 键的位置,我会把它重新映射到 CapsLock 键上去。这样一来两手的小指稍微移动就可以完成,稍加训练即可熟练掌握。这也是我不推荐 ESC 的第二个原因,至于之前提到过的键位映射带来的后遗症,不要紧,键盘上都有不止一个的 Ctrl 键,你根本无需调整键位。

  3. 使用 Ctrl-c 组合键:看起来它似乎比 Ctrl-[ 更容易一些,但是它们的含义有很大的差别。在终端下 Ctrl-c 的意思是“中断”,基本上它会中止所有正在运行的命令,当然它也可以在 Vim 里带我们中断一切操作返回默认的常规模式。但是 Vim 有一些操作其实是依赖正常的返回方法的,也就是 ESC 或者 Ctrl-[,使用 Ctrl-c 会导致这样的功能无法被有效触发(有不少插件依赖这些触发功能,所以要小心莫名其妙的问题)。总而言之这是最不推荐的方法,除非你心里很有数,并且能在正确的时候使用前面两种方法。

返回模式太重要了,所以你一定要谨慎选择适合你条件的方式并把它练至纯熟,否则一旦养成习惯之后想要改变就得付出不小的代价(相信我,我就是 Ctrl-c 的受害者 T_T,我也是不久前才明白 Ctrl-c 的问题的,这还要感谢本站的 @依云……,不好意思当时我还相当自信呢)。哪怕你接触 Vim 的头几天就只练习插入模式和常规模式的转换我也认为是值得的。

不少人在选择第二种方式时遇到的最大阻碍就是无法盲打,[ 的位置无法准确的找到。那我的建议是找不到就放弃吧,无论如何不要让自己养成总看键盘的坏毛病。特别是程序员,在这一行干久了,找到 [ 的位置应该不是什么难事,而盲打更是你需要掌握的基本能力,如果你还能使用标准指法那就太赞了!反正这一关你迟早是要过的。我刚刚习惯了全键盘盲打,正在朝着 80词/分钟的目标迈进,回头有时间我也可以写点这方面的心得体会——哦!你看我就是一个坏例子,我学习 Vim 的时候完全不会盲打呢!(但是我能战胜自己,所以你也可以,对吧?)

另外,以上三种并非全部的可能性,我还见过许多种技巧,但总结起来无非就是在插入模式下设定新的键位映射。此时此刻我不打算教授这方面的东西,贪多嚼不烂,还记得我们的口号吗?保持简单。

为什么要有模式呢?

以上其实已经讲述了一些原因,但真正的价值还在于接下来要讲到的 Vim 哲学。

人们对待“输入”和“编辑”这两件事情的态度和分析是不同的。

输入是流线式的,同时带有很强的节奏感。比如你聊天打字的时候,或者撰写文章的时候,你总是会在段落的末尾停顿一下,因为你需要思考,理顺逻辑,组织语言;在思维不流畅的时候,你甚至会写一句停一句,然后反复编辑。写程序更胜于此,我们思考的时间远远比真正输入的时间要长的多。你看,这些停顿就好像乐谱里的休止符,它们梳理着音乐的节奏,提醒你何时换气,何时调整情绪,多么自然。

然而编辑是碎片式的,且毫无规律可循,也无从预见。在编辑时最大的障碍就是位置的跳转和任意的选择。我们希望首先能够尽可能在输入和编辑之间流畅的转换,其次希望能够简化编辑时的各种操作。鼠标与快捷键的操作治标不治本,它们没能从根本上解决这个问题。

在 Vim 的世界里,模式转换对应着你的节奏感。写东西写到爽的时候你一定能体会到这种妙不可言的节奏感,模式转换帮助你建立和强化你的节奏感。请不要为模式转换做出的按键操作感到多余,因为用不了多久它们就会变成你的下意识操作。就好像歌手要练习呼吸一样自然而然。你会因为写作时一时停顿下意识的转笔感到多余吗?你完全不会注意到,这是你的本能反应,提醒你你需要节奏。

在 Vim 的世界里,一切都是对象(好熟悉的一句话啊……)。一个字符是一个对象,一个词是若干字符组成的对象所以它也是对象,一句话是若干个词组成的对象所以它还是对象,一段话、一个代码块,甚至整篇文章,只要是逻辑上可以划分的部分都可以视为对象。因此你不必靠鼠标/快捷键的选择来建立你要处理的对象(这样你总得人为的锁定区域边界)取而代之的是合乎逻辑的语义化指令操作。

比如说,当你在常规模式下输入 caw 的时候,它的意思是:改写一个词(change a word)。
再例如,当你在常规模式下输入 d3k 的时候,它的意思是:向上删除 3 行(delete 3 upwards),k 是上,你已经习惯了吧?

你根本不必考虑具体的边界在何处,对于人脑来说判断逻辑事物的界限本就是一瞬间的事情,手动做出选择难道不是一种退化吗?你要做的就是告诉 Vim 你要对哪个目标做出何种编辑动作,就像说话一样简单。OK,这样一来的确有很多指令需要你掌握,但就像上面的例子所演示的那样,绝大部分的指令都是语义化的,一旦建立起思维与指令之间的联系,那便顺理成章了。

于是在做出指令的时候总是需要返回常规模式就很容易理解了,因为编辑操作打断了输入的节奏,你只是很自然的切换了你的节奏而已。这就是为什么我希望你记住只要你不再输入就返回常规模式的原因,其背后蕴含的哲学就是:保持节奏。

我有过好多年的音乐生涯,音乐教会了我许多事情,其中一件事就是节奏的重要性。我乐队的鼓手曾经说过:

速度快不一定节奏稳,但是节奏只要稳了,速度就一定能上去。若是一个鼓手空有速度和技术但却不够稳,无法掌控节奏的话,他就毁了。

这是真理。追求技巧和速度是所有野心勃勃的新手们共有的特征,然而极少人能够说服自己先建立起一个稳定的技术基础,速度和技巧是水到渠成的事情。或许这就是这个世界大师总是少数人物的缘故吧。

Vim 的模式转换就是一种帮你建立起坚实基础的有效手段,它不是凭空臆造的,而是取道于人们的生理习惯并加以符号化。它足够简单,但却在多年以来被证明行之有效。我不会教你如何获得惊人的速度和超凡的技巧,因为这些东西你自然而然都会得到,前提就是:保持节奏,保持简单。

预告

到现在为止,似乎我讲的干货不够多哦。不过不要担心,前期需要强调和理解的哲学已经足够了,你也有了充裕的时间来消化它们,并且把基础移动和模式转化掌握于心(你做到了是吧?)。下一讲我们开始奉献干货,先从一套基本的 Vim 配置开始。