|String somestring = "some text";
假设管道位于光标位置,则ci”将使其跳至
另一方面,使用ci(时,光标必须在括号内才能起作用,并且不会将光标移到括号内。
什么是行为不同的原因是什么?
我认为有一种方法可以映射键,使这种行为存在。这样做有什么缺点吗?
#1 楼
这里的主要区别是括号语句(以ci(
为目标)可以嵌套,而带引号的字符串(ci"
为目标)不能嵌套。如果光标在某些括号语句之外,则它可能仍在内部其他一些。例如(
*
标记光标位置):$foo = array(
'x' => ar*ray(1, 2, 3),
);
光标所在的行包含
(1, 2, 3)
,但光标也位于较大的array(...)
块内。在这种情况下,较大的对象是ci(
的适当目标。如果您的光标位于某些带引号的字符串之外,因为它们不能嵌套,因此没有完全明智的选择。因此,Vim利用了这一优势并找到了该行上的第一个带引号的字符串。
#2 楼
文本对象的引用族(i'
,i"
,a'
和a"
)与其余文本对象的不同之处在于它们仅查看当前行。因此,选择不将光标放在引号内。相反,当光标不在行中时,Vim会在行中向前搜索以找到带引号的字符串。围绕一些修补程序进行了讨论,这些修补程序将允许针对基于块的文本对象也是如此。
#3 楼
其他答案涵盖了为什么会发生这种情况。这是解决该问题的一种好方法。wellle / targets.vim。我最近才发现这个插件,我认为它被大大低估了。它提供了一个新的文本对象:
din(
助记符:(d)删除(i)nside(n)ext“(”。这与其他运算符和几个不同的对象兼容,例如an(
,in"
,il(
(在最后一个括号内)它还将覆盖
i(
的默认行为,以便它首先查看光标是否在括号中,然后如果它不是,则其工作方式与in(
相同。可以打开此行为。或关闭,例如:def foo(bar):
^cursor here
键入
ci(
的行为与cin(
相同,因为光标不在括号内。def foo( ):
^Cursor here, and in insert mode
这也接受计数:
def foo(bar): #Define function foo(bar)
^cursor here
键入
c2in(
:def foo(bar): #Define function foo( )
^cursor here
这里还提供了一个新对象“ argument”。例如,
dana
表示“删除下一个参数”。它也接受计数。例如:def foo(arg1, arg2, BADarg3):
^ cursor here
键入
d3ana
:def foo(arg1, arg2):
^ cursor here
还有很多其他功能该插件具有的功能,但这是基本功能。
评论
真好!这是一个很好的补充。我可能必须检查一下。
–掠夺者
16年7月16日在18:39
很好的答案10/10,但我得给它9/10,因为例子是python
–下山羊
16年7月20日在6:41
评论
stackoverflow.com/questions/14650788 / ...