Vim 进阶学习(八)—— 字符查找

252 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

对字符进行查找

今天我们来学习一个新的命令,字符查找,Vim 的字符查找命令让我们可以在行内快速移动。这个命令就是 f{char}

f{char} 命令是在 Vim 中移动的最快方式之一。它会在光标位置与当前行行尾之间查找指定的字符,如果找到了,就会把光标移到此字符上;如果未找到,则保持光标不动。

我们来实际操作一下。假设有下面一行文本。

Find the first occurrence of {char} and move to it.

初始时光标位置在首字符 F 处,此时我们只需要输入 fm 命令,就能将光标移动到单词 move 处,如果我们输入 fx 命令,就什么都不做。因为 Vim 正向查找字符 x,但是却未能找到匹配的字符,因此光标保持不动。这里,我们只需要执行一个命令,就跳转到想要的位置上。

但是, f{char} 命令并不是总能工作得这么好。假设我们想把光标移到单词 “{char}” 中的字符 “c” 上,在本例中需要移动 4 次才能够到达对应的位置。因为字符“c”在该行出现了好几次,因此这次我们无法直接命中目标,而是要试几次才能把光标移到想去的位置。

幸运的是,我们不必一遍遍地重复输入 fc 命令。Vim 会记录上次执行过的 f{char} 命令,随后用 ; 命令就可以重复该命令了。在本例中,我们得连按 3 次 ; 才能使光标就位。

f{char} 和 ; 结合在一起很强大,它让我们用很少的键就可以移动很远的距离。不过由于光标会移到哪里并不是很一目了然,因此我们很容易按 ; 按得忘乎所以,导致错过目标。如果我们不小心跳过头了,这个时候,用 , 命令就可以再跳回来。此命令也会重复上次的 f{char} 命令,不过会按相反的方向进行查找。

下面我们来看下这些命令:

命令用途
f{char}正向移动到下一个 {char} 所在之处
F{char}反向移动到上一个 {char} 所在之处
t{char}正向移动到下一个 {char} 所在之处的前一个字符上
T{char}反向移动到上一个 {char} 所在之处的后一个字符上
;重复上次的字符查找命令
,反转方向查找上次的字符查找命令

我们可以把 t{char} 及 T{char} 命令当成“直到查找到指定的字符为止”(search till thespecified character)的命令,它们使光标停留在 {char} 前面的那个字符上,而f{char} 和 F{char} 命令则把光标移动到指定字符上。

那么为什么我们会同时需要这两种字符查找命令呢?我们举一个实际的例子来看一下。

I've been expecting you, Mister Bond.

假设有上面一句话,我们想删除逗号之后的所有文本,但是又不想删除句号。首先我们先使用 f, 命令,找到逗号位置,然后我们再执行删除操作,此时我们可以有下面几种方式:

  1. d%A.:即删除当前行到行尾,然后插入句号。这种操作方式有一个限制,就是只能删除直到行尾的这种 case,而且还多了一步插入操作;
  2. dt.:这个命令可以直接删除从此处到句尾的所有文本,而不必删除逗号;
  3. dfd:另外一种方式就是使用 f{char} 命令,找到单词 “Bond” 的最后一个单词,然后删除它;

我们可以看到,随后后面两种方法的最终结果都一样,但是我们可以发现用 dt. 的话,不需要考虑太多东西。删除到字母“d”并不是一个通用模式,而删除句子的后半句话则是经常会做的操作。因此我们可以把 f,dt. 训练成手指的下意识动作。

通常情况下,当我们想在当前行内快速移动光标时,推荐在普通模式中使用 f{char} 和 F{char} 命令;当与 d{motion} 或 c{motion} 一起使用时,推荐使用 t{char} 及 T{char} 命令。

参考文档

  • 《Vim实用技巧》—— [英]Drew Neil

往期文章