Vim 中的 Inclusive & Exclusive

2023-09-11

Vim 文档中有 Inclusive 和 Exclusive 的表达,但是在用法上难以找到关联两者的一致性。

比如 fF 在 vim 文档中,前者是 inclusive 的,后者是 exclusive 的。

f{char}			To [count]'th occurrence of {char} to the right.  The
			cursor is placed on {char} |inclusive|.
			
F{char}			To the [count]'th occurrence of {char} to the left.
			The cursor is placed on {char} |exclusive|.

Demo

使用 fF 处理以下文本

hello world.

假设光标在 ^ 位置,按照以上文档的说明

使用 fw 时,因为 finclusive 的,所以光标会移动到 w

   hello world.
   ^

✅ hello world.
         ^

使用 Fw 时,因为 Fexclusive 的,所以光标会移动到 o ?

wait, 真的是这样吗?不,答案是会移动到 w

这是因为,vim 中的 exclusiveinclusive 是对于 vim motion 最后一个字符的约束,而对于反向 motion (F) 而言,最后一个字符.

   hello world.
              ^

❌ hello world.
          ^
           
✅ hello world.
         ^

可以用 dFw 命令证明这一点。可以看出 . 被保留了,因为 FExclusive

hello world.
           ^
              
hello .
      ^

Conclusion

在 vim 中 exclusiveinclusive 约束的是 motion 对最后一个字符的行为,但需要注意区分 motion 的方向

  1. 正向 motion ( f ), 最后一个字符是 motion 最后一个字符

  2. 反向 motion ( F ), 最后一个字符是 motion 开始第一个字符