为什么ci“不能在引用区域内,而ci(仅在括号内有效?


27

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

|String somestring = "some text";

假设管道位于光标位置,ci"将使其跳至引用区域。

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

这种行为差异的原因是什么?我假设有一种方法可以映射键,以便这种行为存在。这样做有什么弊端吗?


Answers:


25

此处的主要区别在于,带括号的语句(由定位ci()可以嵌套,而带引号的字符串(由定位)不能嵌套ci"

如果您的光标在某些括号内,则可能仍在其他语句内。例如(*标记光标位置):

$foo = array(
    'x' => ar*ray(1, 2, 3),
);

光标所在的行包含(1, 2, 3),但光标也在较大的array(...)块内。在这种情况下,较大的是的合适目标ci(

如果您的光标在某些带引号的字符串之外,则因为它们不能嵌套,所以没有完全明智的事情。因此,Vim利用了这一优势,并在行中找到了第一个带引号的字符串。


10

文本对象(的报价家庭i'i"a',和a")比,他们只能看当前行的文本对象的与众不同。因此,选择不将光标置于引号内。相反,当光标不在行中时,Vim会在行内向前搜索以找到带引​​号的字符串。

围绕一些修补程序进行了讨论,这些修补程序也允许针对基于块的文本对象实现这种正向搜索行为。


8

其他答案涵盖了为什么会发生这种情况。这是解决它的好方法。

wellle / targets.vim。我最近才发现这个插件,我认为它被大大低估了。它提供了一个新的文本对象:din(助记符:(d)elete(ⅰ)n侧(n)的转“(”这是与其他运营商和几种不同的对象,如兼容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

这也提供了一个新的对象“参数”。例如,dana意思是“删除下一个参数”。这也接受计数。例如:

def foo(arg1, arg2, BADarg3):
^ cursor here

打字d3ana

def foo(arg1, arg2):
                  ^ cursor here

该插件还有许多其他功能,但这是基本功能。


1
真好!这是一个很好的补充。我可能必须检查一下。
掠夺者

很好的答案10/10,但我得给它一个9/10,因为示例是python
Downgoat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.