假设我有
'hello'
Run Code Online (Sandbox Code Playgroud)
我的光标在h或 上'。
当我命令ci'或 时ct',他们正在做同样的事情?
那么那些 i 和 t 是什么?有什么不同?谢谢
二者ci'并ct'可以分解为这样:
<operator><motion>
Run Code Online (Sandbox Code Playgroud)
在哪里:
c是operator,在这种情况下意味着“改变”,i'和t'是两种运动。t'覆盖从光标到下一个之前的文本,'仅在一个方向上。
i'属于一种称为文本对象的特殊运动。它涵盖了光标处或之前的第一个单引号和光标处或之后的第一个单引号之间的文本,有两个方向。
这张来自Practical Vim 的图片很好地解释了两种运动之间的区别(t'左侧,i'右侧):
如果您的光标恰好位于 的边界之一上i',则两种运动具有相同的效果,因为它们覆盖了完全相同的文本:
foo 'hello' bar
<---> i'
----> t'
Run Code Online (Sandbox Code Playgroud)
如果您的光标没有恰好位于 的边界之一上i',那么这两个动作将不会产生相同的效果:
foo 'hello' bar
<---> i'
--> t'
Run Code Online (Sandbox Code Playgroud)
这意味着在正确的条件下,这些运动可以具有相同的效果,尽管在功能上并不相同。
FWIW,有许多替代方案也适用于您的情况:
foo 'hello' bar
<---> iw
----> fo
----> e
Run Code Online (Sandbox Code Playgroud)
Vim 的普通模式命令就像一种语言,每个“单词”都有非常特定的含义。这使您可以准确地告诉 Vim 您的意思。在这种非常特殊的情况下,“更改此引号中的文本” ( ci')、“更改为下一个引号” ( ct')、“更改此单词” ( ciw)、“更改为并包括o” ( cfo) 和“更改为结尾word" ( ce) 具有完全相同的效果,但它们是不同思维的结果。
选择在当前上下文中最有意义的一个。
参考:
:help motion.txt
Run Code Online (Sandbox Code Playgroud)