在上一篇中,我们提到vim的几种模式,并且给出了一些基本的操作命令,包括移动光标,删除、替换操作。并且给出了几个重要的公式,理解这个公式对于理解vim和提高使用vim的效率来说至关重要。所以在这篇文章里面我打算再围绕这几个公式给出一些示例,希望能给各位理解公式提供一些帮助。
vim操作的效率很大程度上取决于移动光标的效率,平时在修改代码的时候很大程度上都是需要在特定位置修改,下面介绍到的操作很大程度上能提高我们移动光标和修改的效率
行内查找字符使用 f{char} 来进行,即使用f后面加一个字符,会快速跳转到行内第一个出现该字符的位置,例如下面一段话
vim.o.relativenumber = true假设光标位于行首的s 处,我们可以使用 fr 将光标移动到单词 字符 r出现的位置

根据公式
motion = [数字] + 移动光标我们可以使用 2fr 跳转到第二个r 位置

我们也可以使用 t 来跳转光标到搜索的字符处,它与 f 的区别在于 f 直接跳转光标到指定字符处,t 跳转光标到指定字符的前一个位置
tr 跳转到第一个r的左边

3tr 跳转到第三个r的左边

我们可以使用 F 和 T 实现向前查找,它门跳转的规则与 f 和 t 类似,这里就不再给出具体的示例了,有小伙伴感兴趣的可以自行尝试
之前只演示了基本的行内移动和多行移动,但是多行移动是基于上述公式实现重复向下移动一行多次的。vim中提供了一些大范围移动光标的方式。
H 移动光标到窗口首行M 移动光标到窗口中间L 移动光标到窗口尾行gg 移动光标至第一行G 移动光标到最后一行要演示这几个操作光靠一屏就可以显示完的简短的文本是不行的,这里我采用 ~/.bashrc 小伙伴可以随便打开一个系统的配置文件,只要它超过一屏就行
H 将光标移动到窗口首行

M 移动光标到窗口中间

L 移动光标到窗口末尾

G 移动光标到最后一行

后面的 gg 也就不演示了,从上面这些演示来看不难发现窗口和文件不是同一个东西,在窗口中跳转只能在文件的部分区域间进行跳转,而在文件中跳转则能浏览文件中的任意行
根据上面的公式,他们前面也是可以添加数字的,但是在这些操作的前面加上数字表示重复又有什么,例如gg 可以跳转到文件首行,我执行3次跳到行首又有什么用呢。要解释这个问题,我们先看一个例子
3gg 可以跳转到文件的第三行。这里我们假设光标在文件的最后一行
这些算是之前将的公式含义的特例吧,他们并不表示重复,这里我仅仅列出他们的含义吧,具体该如何理解我也不清楚,暂时记住,后续会使用即可
数字 + gg, 表示跳转到文件的第几行数字 + G, 也表示跳转到文件的第几行。但是我平时都使用 gg 这种跳转方式,毕竟在一个键位上按两次可比按它的大写字母要快的多数字 + L, 移动到窗口的倒数第几行数字 + H, 移动到窗口的第几行数字 + M, 与单纯的使用M 效果一样下面在列举一些操作符配合光标移动指令的例子,帮助大家理解
假设光标在 relativenumber 的词首
cw 来删除该单词并输入number

dtn 来删除字符 n 前面 relative

2f! 将光标移动到对应位置,然后使用 a 进入插入模式插入对应字符

2f" 移动到行尾,然后使用i 进入插入模式插入对应字符

$ 跳转到行尾,使用 i 进入插入模式进行修改

从上面的例子来看,使用 f t 之类的指令相比使用 l、w 更加高效,毕竟数单词个数和字符格式是很低效而且容易出错的
我们假设光标位于h处
d2w 删除两个单词并进入插入模式

dt" 删除对应单词,然后进入插入模式
ci" 删除对应字符并进入插入模式

看到这里,肯定很多小伙伴会有一脑袋问号,这个 i 是什么东西,i 不是进入插入模式嘛,为什么我光标在行首它也能准确的删除引号内的字符呢。这就涉及到vim中一个非常重要的概念——文本对象
还记得最开始我们说过,vim将文本分为 字符、单词、句子、段落嘛,这可不是为了方便而人为划分的,而是vim在处理文本的时候就是真么做的。文本对象是vim 描述这些划分的。文本对象只能跟在 operator 后,由 a 和 i 开头,后面跟文本范围来组成,表示我们要针对哪个范围的文本进行何种处理。其中 i 表示 inner 不包含表示范围的字符, 而 a 会包含表示范围的字符。例如上述例子中,如果使用 i 则会保留 " ,使用 a 则不会保留。感兴趣的小伙伴可以自行尝试。
下面给出各种文本范围的表格
文本范围 | 代表含义 |
|---|---|
w | word 词 |
s | sentence 句 |
p | paragraph 段 |
t | tag(HTML/XML) 标签 |
[或] | 由[]包裹的部分 |
(或) | 由()包裹的部分 |
<或> | 由<>包裹的部分 |
{或} | 由{} 包裹的部分 |
" | 由""包裹的部分 |
' | 由''包裹的部分 |
` | 由``包裹的部分 |
文本对象看似抽象,实际上只需要多使用几次基本就能掌握它了。熟练掌握它之后,将会大大提高我们编辑文本的效率
接下来让我们再给出一个最后的例子,并且以本示例来结束该文
假设有这么一段文本
<div class = "example">
<div> This is vim example</div>
</div>我们希望将其变为
<div class "example">
vim is so good
</div>我们将光标移动到最外层的div上,然后使用 cit 删除div中的内容,然后输入 "vim is so good"
