关于 VIM 的一点学习经验

标签:VIM

以前总是很排斥使用这种很难记的编辑器,不过陆陆续续用了几个月后,就渐渐离不开 VIM 了。
回想了一下学习时的过程,发现 VIM 的一致性对于学习者而言很有帮助,许多操作都能举一反三地猜测出来。
下面的介绍只针对 VIM 的初学者,其他人可以无视了。

安装、运行和保存之类的我就略过了,这里只关注文本编辑。

首先要说的是 VIM 主要有 2 种模式:命令模式和输入模式。
后者和一般的文本编辑器差不多,前者则不能直接输入文字,只能敲命令。比较奇葩的是,打开时默认处于命令模式,所以不能直接输入文本。
命令模式下有几种方式进入输入模式,我就不介绍了,而返回命令模式则按 ESC 键即可。在命令模式里取消未输入完的命令,也可以按几次 ESC 键。
这里我主要关注命令模式,毕竟输入模式和其他编辑器比起来没有优势。
提醒一下:VIM 的命令非常多,不要试图去死记硬背。它的大多数命令都有规律可寻的,每天接触几个命令,然后积极地去使用它,很快就能上手了。

下面先从定位开始吧。
输入行号,然后按 G,即可跳到该行。例如 10G 可以跳到第 10 行。这里的 G 是 go 的意思,注意要大写,你可以按 shift + g,也可以在开启大写字母锁定时直接按 g。
如果不喜欢按 shift 键,也可以按 2 下 g,例如 10gg 也可以跳到第 10 行。
如果不加行号的话,gg 会跳到第一行,G 会跳到最后一行。
还有个方法就是 : + 行号 + <回车键>,例如 :10<回车键> 也可以跳到第 10 行。
嗯,这里没什么技巧。

接下来就是大家熟悉的方向键了,在 VIM 里也可以用 hjkl 来代替,不过这里我还是直接用方向键吧。
有个技巧就是数字加命令可以重复该命令。例如 → 可以右移一个字符,而 10→ 可以右移 10 个字符,10↓ 可以下移 10 行。

不过使用方向键是很没效率的,大部分时候都是按单词来跳转的,于是再记下这些命令:
w:跳到下一个单词的第一个字符。这里的 w 是 word 的意思。同样可以加数字,例如 3w 可以跳到后面第 3 个单词。
b:跳到上一个单词的第一个字符。这里的 b 是 back 的意思。同样可以加数字。
e:跳到当前或下一个单词的最后一个字符。这里的 e 是 end 的意思。同样可以加数字。
上面的命令都是小写的,单词会按标点符号来分隔。如果用大写的话,就只以空格来分隔。

可是有时候单词还不够定位,例如 on_delete 和 onDelete,w 是不能定位到字符 d 和 D 的。于是再来看这些命令:
f + 任意字符:向后跳到该字符。例如 fd 会跳到下一个 d 字符,fD 会跳到下一个 D 字符。这里的 f 是 find 的意思。同样可以加数字,例如 3fd 会跳到后面第 3 个 d 字符。
t + 任意字符:向后跳到该字符前的一个字符。例如 td 会跳到 d 前面的 _ 字符。这里的 t 是 to 的意思。同样可以加数字。
如果用大写的话,就是向前跳转了。
也许你会觉得 t 没啥用。别急,后面会有用的。

可是字符有时还不够定位,那么再看这些:
0:跳到本行的第一个字符。
^:跳到本行的第一个非空字符。(正则表达式也用这个符号表示开始)
$:跳到本行的最后一个字符。(正则表达式也用这个符号表示结束)
g_:跳到本行的最后一个非空字符。(这个有什么出处我也不知道)
(:跳到本句的第一个字符。
):跳到本句的最后一个字符。
{:跳到本段的第一个字符。
}:跳到本段的最后一个字符。
[[:跳到第一行的第一个非空字符。
]]:跳到最后一行的最后一个非空字符。
+ 或 <回车键>:跳到下一行的第一个非空字符。
-:跳到上一行的第一个非空字符。
*:跳到下一个相同的单词。你没猜错,3* 可以跳到后面第 3 个相同的单词。
#:跳到上一个相同的单词。同样可以加数字。
%:跳到匹配的括号处。
列号 + |:跳到该行的第 n 个字符处。例如 3| 可以跳到第 3 个字符。
糟了,感觉信息量好大。没关系,我也用了好久才记住,用到的时候再记吧。而且大多数都不常用,我基本上只用 0、^ 和 $。

好了,现在移动告一段落,开始来编辑吧。
貌似从删除开始比较好,于是看看这些命令:
x:删除光标所在处的字符。没错,3x 就是向后删除 3 个字符。
X:删除光标前的字符。
d:删除一组字符,它需要搭配其他命令。这里的 d 是 delete 的意思。
以这段文字为例:
def get_pocket_items(access_token, count=1000, detail_type='simple'):
下划线标记的 c 是光标位置。
dd 可以删除本行;3dd 可以向后删除 3 行。
dgg 可以删除到文件头,dG 可以删除到文件尾,d3gg 或 d3G 可以删除到第 3 行。
d + 方向键可以往那个方向删除,例如 d↑ 可以删除本行和前一行,d2↓ 和 3dd 效果一样,d5→ 可以向后删除 5 个字符。
d + 列号 + |:删除到第 n 个字符,向前向后都行。
dw 就会删除到下一个单词,即把「count」删除;d3w 则可以删除 3 个单词,即把「count=1000」删除。
dW 会删除到空格,即把「count=1000, 」删除。
de 和 dw 的效果一般是一样的(除非光标位置在单词的结尾),而 dE 会比 dW 少删一个空格。
db 自然和 dw 是相反的,d2b 可以把前面的「access_token, 」删除掉。
还可以用 df<空格键> 或 dtd 来做到和 dW 一样的目的;它们也支持数字,例如 d2f' 可以删除到第二个 ' 字符,即把「count=1000, detail_type='simple'」删除。
d% 会向前删除到括号,即把「(access_token, c」删除。如果想删除括号里的所有字符,可以先按 % 跳到括号开头,再按 d%,就把整个括号删除了(后面会介绍更好的方法)。
d0 和 d$(或 D) 可以分别删除到行首和行尾。
: + 行号 + d + <回车键> 可以删除该行,例如 :10d<回车键> 可以删除第 10 行。
: + 行号 + , + 行号 + d + <回车键> 可以删除多行,例如 :10,20d<回车键> 可以删除第 10 ~ 20 行。
虽然看上去好像信息量好大,不过仔细和前面学的比较一下,就会发现其实是一样的,不需要再次记忆。

不过还得补充 2 个辅助的命令,它们本身没啥用,要搭配其他命令:
i:选择包围光标的单词(w)、空格区分的单词(W)、句子(s)、段落(p)、括号()]}>)或引号('")的内部。
a:选择上述的完整部分。
仍以上面的例子来说:
di) 可以删除括号里的所有参数(即「access_token, count=1000, detail_type='simple'」,da) 可以删除括号及参数(即「(access_token, count=1000, detail_type='simple')」)。它同样也支持数字,如果有 2 层括号的话,d2i) 可以删掉向外二层括号里的所有字符。
现在,按 fm 定位到 m 字符。这时如果想删除引号内部的所有字符,可以用 di' 或 diw,而 da' 则可以把引号也删掉。
如果你经常要编辑 HTML 的话,da> 可以很轻松地删除标签,d2a> 可以删除 2 层嵌套的标签。

介绍完删除,就来修改吧,用的命令是 c,意思是 change。它和删除不同的是,它会在删除后进入输入模式。
cc 或 C:修改当前行。同样,3cc 可以删除 3 行,并开始编辑。(有没有觉得 gg、dd 和 cc 的风格很像?)
cw:修改单词。同样,3cw 可以修改 3 个单词。
它同样能和 i、a 搭配,例如 ciw 可以修改一个单词,ci' 可以修改引号内的所有字符等。
其他就不需要再列出来了,基本和删除一样。

还有些命令很简单,就不一一详细介绍了。
r:替换,replace。rx 可以把当前字符替换成 x,5rx 可以把后 5 个字符都替换成 x,R 可以替换任意个字符。
y:复制,copy。基本同 d、c,yy 和 Y 也能复制当前行。值得一提的是,被 d、c、x 删除的字符,也会进入剪贴板,可供粘贴。
p:粘贴,paste。粘贴不需要选择区域,但也可以用 3p 来粘贴 3 次。此外,VIM 的剪贴板是可以存几份数据的,可以用 " + 数字 + p 来粘贴第 n 个剪贴板的数据,例如 "2p 可以粘贴上上次复制的内容。

最后来看可视化编辑。
命令是 v,意思是 visual,可以看到被选择的区域。
vw 可以选中光标所在的字符到单词的结尾,viw 可以选中光标所在的单词,va) 可以选中括号及其内部,等等。
光是选中当然还不够。再按下 d 或 x,被选中的区域就被删除了;按下 c,就修改选中的区域;按下 p,则用剪贴板的内容替换选中的区域。
虽说熟练后并不需要看到可视化的效果,就能脑补出来,但是对粘贴命令却是很有用的,因为手动删除会覆盖剪贴板的内容,导致粘贴时比较费劲。

我想就介绍到这吧,虽然只是很少的一部分知识,但可以看到 VIM 在一致性方面做得有多出色。
回顾一下其实就这些命令的组合:w、e、b、f、t、x、d、c、r、y、p、i 和 a。多用用就会发现真不难记。
希望本文能帮助初学者少走点弯路。

11条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?