"i " 和 "t" 标签有什么区别?在 VIM 编辑器中?

What is difference between "i "and "t" tag? in VIM editor?

假设我有

'hello'

我的光标在h'上。

当我命令 ci'ct' 时,他们在做同样的事情?

那么 i 和 t 是什么?有什么不同?谢谢

ci'ct'都可以这样分解:

<operator><motion>

其中:

  • c 运算符 ,在这种情况下表示“更改”,
  • i't'是两种动作

t' 覆盖从光标到下一个 ' 之前的文本,仅向一个方向移动。

i'属于一种叫做文本对象的特殊动作。它涵盖了光标处或光标前的第一个单引号与光标处或光标后的第一个单引号之间的文本,分为两个方向。

这张来自 Practical Vim 的图片很好地解释了两种运动之间的区别(t' 在左边,i' 在右边):

如果您的光标恰好位于 i' 的边界之一,那么这两个动作具有相同的效果,因为它们覆盖了完全相同的文本:

foo 'hello' bar
     <--->         i'
     ---->         t'

如果您的光标 没有发生 位于 i' 的边界之一,那么这两个动作将不会产生相同的效果:

foo 'hello' bar
     <--->         i'
       -->         t'

这意味着这些动作在正确的条件下可以产生相同的效果,尽管在功能上并不相同

FWIW,有许多替代方案也适用于您的情况:

foo 'hello' bar
     <--->         iw
     ---->         fo
     ---->         e

Vim 的普通模式命令就像一种语言,每个“词”都有非常特定的含义。这使您可以准确地告诉 Vim 您的意思。在这种非常具体的情况下,“更改此引号中的文本”(ci'),“更改到下一个引号”(ct'),“更改此词” (ciw)、“更改为并包括 o”(cfo) 和“更改为单词结尾”(ce) 具有完全相同的效果,但它们是不同想法的结果。

选择在当前上下文中最有意义的一个。

参考:

:help motion.txt