使用ci“时,光标不必位于双引号区域。

|String somestring = "some text";


假设管道位于光标位置,则ci”将使其跳至

另一方面,使用ci(时,光标必须在括号内才能起作用,并且不会将光标移到括号内。

什么是行为不同的原因是什么?
我认为有一种方法可以映射键,使这种行为存在。这样做有什么缺点吗?

评论

stackoverflow.com/questions/14650788 / ...

#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

#4 楼

James提到了一个功能强大的插件。我还做了一个简单得多的示例,它只是将ci“扩展为使用),},],<,可以在当前行中的任意位置使用光标:https://github.com/Spenny1068/ciBracket