Vim 真的那么难吗?

1,110 阅读7分钟

如果玩过知乎都会被那些大 V 洗脑说 Vim 好用,Vim 牛逼,也是因为这个原因才开始用 Vim 的,也想着总有一天会变成 Vim 高级玩家。

那这篇文章会教你怎么用 Vim 么?会,但是我不想像官方手册去说,只想提供一个学习 Vim 的学习方法和基本的指令。我更希望这篇文章做到的是 “授人以渔”。我不想写这种像 Vim 官方手册那种文章,因为复制粘贴所有指令过来,你也不会记多少的,更不会记住。

使用场景

在说基本指令前,我想说下我现在是怎么用 Vim 的。现在网上有很多文章都是教你怎么配置好一个好看的 Vim 环境,装各种 Plugin,主题,配色什么的。我在 Mac 上也装过,像下面这样的。

有高亮么?有。有自动补全么?有。好用么?不好用,难用得一B。当然如果用 SSH 你可以在服务器搞成这个样子,毕竟服务器只能用命令行嘛。

所以现在我的编程环境都是 JetBarins IDE + Vim Emulator。

可以在 Tool 下可以打开 Vim 模拟器。

我希望入门 Vim 的人,除非你在服务器上工作,否则不要用命令行或者 Vim 的编辑器,因为舒服地开发才是王道。那 Vim 不舒服呀,不,有了 Vim 再加上 JetBrains 的提供的 IDE 会让效率更快,可以基本不怎么用触控板了。

模式

Vim 模拟器开启后你可能会遇到下面几种模式:

Normal 模式:开启 Vim 模拟器后立马进入的模式。在这个模式下我们可以输入指令(后面会说)来插入,删除,移动,或者做其它操作。

Insert 模式:Normal 模式下按 i 就可以进入 Insert 模式,也就是没有 Vim 模拟器时候的样子,一般这个模式下就是纯写代码啦。

Visual 模式:Normal 模式下按 v 或者 V 就可以进入 Visual 模式,这个时候可以让你选中代码。

为什么会有这么多的模式呢?直接写代码,或者说只要 Insert 模式不就好了?想象一下,如果你没有鼠标,你怎么去选中代码块呢?所以有了 Visual 模式,然后正常的想法应该是我按某个键就可以通过按上下左右来选中了吧?但是如果只有 Insert 模式,你按这个键只是相当于在写代码,所以要一个 Normal 模式来告诉 Vim 现在我不是在写代码,我在做别的事(选中,删除等)。

基本指令

这些指令都是常用的,不常用的一般用不到,用到了再查就好了,不用去纠结要不要学完所有指令,背好再去用。因为,等你背好了你还是不会用,而且发现直接用上的人早就玩顺那些基本指令了。

上下左右

Normal, Visual 模式下

上:j 下:k 左:h 右:l

怎么记:

左右容易记,因为 h 在最左边,l 在最右边。

上下也容易记,因为 j 键下面有个突出的地方用来标记键盘位置的,而这个突出的东西是在下面的,所以向下,那么 k 就是向上了。然后每次将手指放在 j 键上的时候直接放在突出的地方,而放在 k 键上的手指可以稍微往上一点,这样就可以暗示自己哪个键是上,哪个键是下了。

不过用多了就记住了。

这里要说的是有些人会教你 3j 是向上 3 行,4h 就是向左移 4 个字符,但是我觉得真实情况用的不多,留个印象就好了。

快速移动

Normal,Visual 模式下,假如现在有句子,"I love you",现在光标在 o 上。

a: 在该字符后面 append,"o" 光标移到 o 后面并进入 Insert 模式 i:在该字符前面 insert,"o" 光标移动 o 前面并进入 Insert 模式 A: 在该行最后面 append,光标移动到 "u" 后面并进入 Insert 模式 I: 在该行最前面 insert,光标移动到 "I" 前面并进入 Insert 模式 w: 指的是跳过一个单词,光标移动到下一个单词开头的位置,这里会移动到 "y" b: 指的是跳到该单词最前面,这里会移动到 "l" G: 跳到整个文件的最后一行 gg: 跳到整个文件的最开始一行

ctrl + d: 向下翻半页 ctrl + u: 向上翻半页

当然还有翻整页的,但是我觉得用不到,因为真实翻页会翻得头都晕了。这也是我为什么推荐 IDE 的原因,因为翻页的时候图形界面才是有优势的。但是代码之间的移动键盘才是有优势的,因为不用鼠标去精准定位。

删除

dd: 删除一行 D: 从光标的地方直接删掉整行,现在就会剩下 "I l","o" 之后包括 "o" 都会删掉。

dit: 上面的 Hello 会被删掉,这个指令的意思就是删除标签里的东西 di什么东西: 意思就是 delete in 什么东西,比如 "Hello",这里 di" 就表示删除在 " 里的东西,再如 {Hello}di{ 就表示删除在 {} 里的东西。所以这个指令可以对很多种括号进行组合。

  • di<
  • di"
  • di'
  • di{
  • di( ...

dt什么东西:意思就是 delete to 什么东西,从光标这个位置一直删除到指定的那个字符,如上面可以 dt< 就表示从 "l" 开始删除,直到遇到 "<" 字符。

将上面的 d 换成 c 也是可以的,不同的是做完删除操作后会进入 Insert 模式。

选中

v: 选中这个字符,然后可以通过 hjkl (前面的上下左右),来扩大选中区域。 V: 选中当前行,然后可以通过 hjkl (前面的上下左右),来扩大选中区域。

复制粘贴

y: 复制选中的代码 p: 粘贴最后一次删除后或者复制后的代码

Tips

别的指令呢

别的操作完全可以用 IDE 来完成,比如搜索,撤销等。因为我觉得用 JetBrains IDE 的话这些功能比 Vim 强大得太多了,完全没必要去用 Vim。

上下左右好烦

是的,会很烦,但是用熟了会快。注意这里的快是相对的,比如你要找文件中间的某一行就一直 jkhl 来跳转到那吧。所以,我一般的做法是先触控板翻到大概的位置,再用快速移动的指令去往要修改的地方。这里的快是因为不用触控板去精准定位,用键盘来精准定位会快些,仅此而已。

就这些指令

对,就这些就够了,等入门了之后用到了别的指令再去查就是了,先用起来再说,不要总想着学好了,背好了再去用。不功利地学习都不是学习,记住也很快会忘。

NeoVim, SpaceVim, Emacs

学 Vim 就学 Vim,不要去管别的,学那么多不如熟悉一个有用。

一些想法

上面都是我学 Vim 的时候走过的一些弯路,以前总喜欢折腾各种编辑器,IDE,像 Sublime, VS Code, Atom, WebStorm, notepad++ 等等。最终还是回归 JetBarins 全家桶,再配上 Vim 模拟器。

折腾过后其实才发现知乎上面说的,JetBrains 市场如何,VSCode 要打败哪个编辑器什么的都很幼稚,都是为了装 B 而已。没有一款最好用的 IDE 或者编辑器,只有一款最合适自己的。不同场合下应该用不一样的,而不是总想着去找编辑器里的 “银弹”。

对于我的话,写项目一般用 WebStorm,简单的代码小操作就用 VSCode。其实最后还是觉得要那么酷炫的主题都没用,一个好的代码提示和代码分析器真的可以让你不用操那么多的心,所以这也是为什么我推荐用 JetBrains 的原因。