网上对 Vim 的说法往往是「学习曲线陡」、「入门门槛高」,等等。很多人也因此在对 Vim 稍有了解之后就对 Vim 望而却步,怕影响工作效率或者认投入相比产出不划算而没有真正走进 Vim 的大门。
确实,Vim 不像其他编辑器一样上手即用,但是也远没有那么可怕。花个一晚上时间熟悉最基础的十来个命令,在你常用的编辑器上装一个 Vim 插件,例如 vscodevim、IdeaVim,Vim 就算入门了。
读完这篇入门文章,花个把小时时间熟悉一下本文中的操作,然后回到你平常写代码的地方,放下普通的编辑器,用 Vim 来编辑,你会发现,转向 Vim 的第一天,工作效率并没有降低,甚至可能反而略有提升。
Vim 的大门就此打开,之后的学习曲线平缓而温和,edit text at the speed of thought!
新建一个文本文件并填充一些没有用的代码或者文本,这里将是你练习 Vim 操作的地方。
在终端中用 vim 打开这个文本文件,或者通过前面提到的插件激活编辑器的 Vim 模式并打开这个文件。
强烈建议你边看本文边操作,操作的过程也是记忆的过程,看完本文基本你已经记了个七七八八,很多命令马上就可以信手拈来了。
开始
现在,我们处在 Vim 的普通模式。
普通模式
普通模式下无法直接通过打字输入的方式对文本进行编辑,但是可以移动光标,或是执行一些命令。
普通模式是 Vim 的默认模式,也是 Vim 最自然放松的状态,这也是 Vim 和其他编辑器不同的地方。
随着对 Vim 了解的深入,你逐渐就会知道 Vim 为什么是这样的。
移动光标
在 Vim 中,我们可以通过 j↓ k↑ h← l→ 四个按键来移动光标。
j k l正好在右手的食指、中指、无名指下面,手掌不用移动就能按到。
h 在右手食指左边的一个位置,刚刚接触 Vim 的时候可能会觉得不方便,但是掌握了本文下面提到的一些命令,以及一些更加复杂的操作之后你就会发现,需要连续按超过一次 h 或 l 的操作,大部分都可以通过其他命令实现。使用最多的,也就是 jk 上下两个。
插入模式
在普通模式下按 i 就进入了插入(insert)模式。
插入模式下的 Vim 和普通的编辑器差不多,用方向键移动光标,键盘输入打字。
学会了移动光标和最简单的打字输入,你已经可以用最基础的方式进行文本编辑了。
但是,Vim 强大的功能此刻还完全没有露头,下面要讲的,才是让 Vim 可以进行高效文本编辑的所在。
移动光标的更多操作
前面提到的 hjkl 一次只能让光标移动一个字符,而下面这些操作可以让光标跳跃移动。
b w 分别移动到前、后单词的开头,代表 backward,forward one word 。
e ge 分别移动到后、前单词的结尾,代表 end。
0 $ 分别移动到行首和行尾。
^(shift 6)和 0 相似,但是是移动到当前行的第一个非空字符。
| 命令 | 用途 |
|---|---|
b | 移动到当前/上一个单词的开头 |
w | 移动到下一个单词的开头 |
e | 移动到当前/下一个单词结尾 |
ge | 移动到上一个单词结尾 |
0 | 行首 |
$ | 行尾 |
^<⇧ 6> | 第一个非空白字符 |
删除
下面来看一下删除的操作。
x 可以删除光标下的字符,X 删除光标前面的字符。
d 在 Vim 中代表 delete 删除,Vim 中的删除通过按 d 再加要删除的范围来实现。
删除的范围可以看下面这个表格。
d 加方向键可以删除对应方向上的一个字符(上下方向则删除一行)。
顺带一提,在 Vim 的普通模式下先输入数字 n 再输入命令,即可执行 n 次命令,例如 d5j 就表示向下删除 5 行。
前面提到的按单词移动光标和移动到行尾行首的命令,也可以指定删除的范围,例如 db 删除光标起始到单词开头,d$ 从光标位置删除到行尾。
连按两次删除, dd 命令可以删除整行。同样,也可以用数字加命令的方式一次删除多行。
此外,还有等于 delete a word 的 daw ,删除一个单词,和 delete n words 的 d{n}w,删除多个单词。
| 命令 | 用途 |
|---|---|
dh | 删除前一个字符(d←) |
dl | 删除一个字符(等同于 x or d→) |
d5j | 删除 5 行 |
| ---- | ------------------------ |
db | 删除光标起始到单词开头 |
d$ | 从光标位置删除到行尾 |
| ---- | ------------------------ |
dd | 删除 1 行 |
{n}dd | 删除 n 行 |
| ---- | ------------------------ |
daw | 删除一个单词 |
d{n}w | 删除 n 个单词 |
花样进入插入模式
前面提到的 i 只是简单地在当前光标所在的位置进入插入模式,而 Vim 提供了一些命令让我们可以更快地移动到目标位置并插入。
a 代表 append 追加,会在当前光标位置的后面进入插入模式。
在普通模式下按 o,会在光标当前所在的行下面创建一个新行并进入插入模式,代表 open。
s 会删除当前光标下的字符并进入插入模式。
这三个命令还分别有与之匹配的大写命令,实现相似的操作。
A 会在当前行的末尾进入插入模式,O 会在当前行的上面创建一个新行并进入插入模式,S 会删除整行并进入插入模式。i 也有与之匹配的 I,在当前行的第一个非空字符处进入插入模式。
| 命令 | 进入插入模式的位置 |
|---|---|
a | 在当前光标之后 |
A | 在当前行的结尾 |
i | 在光标位置 |
I | 当前行的第一个非空字符处 |
o | 在下面插入新行 |
O | 在上面插入新行 |
s | 删除光标下的字符 |
S | 删除整行 |
撤销操作
不小心删除了不该删除的文本怎么办?在 Vim 中,u 代表 undo,可以撤销最近的一次操作。
命令模式
如果你是在终端当中用 vim 命令进行编辑,那你可能经常要和 Vim 的命令模式打交道。
按 : 进入 Vim 的命令模式,输入命令再按回车即可进行相应的操作。
:w 代表 write,:q 代表 quit。
命令也可以一次输入多个,例如 :wq - 保存并退出。
命令后加 ! 代表强行执行,例如 :q! - 不保存而强行退出。
All in Vim!
现在,你已经掌握了最基本的插入、删除和撤销操作,足以应付简单的日常工作了。
下一篇文章,我们来介绍一些进阶操作,让你的 Vim 更上一层楼。