假设我有一个这样的代码(|表示光标位置):

func1(x|, func2(), y); 


我想获得:

func1(x|);


是否可以从光标位置删除代码到当前内部块右端之前的位置?

我知道我可以使用dt).但我想知道是否有一种方法可以将它与di)的功能混合使用。

评论

我很想知道是否有一种简单的方法可以按照您的要求“删除内部/外部块的左/右一半”。但附带说明,我可能会做C);在这种情况下。

有时%运动可以满足您的需求(即d%)。

#1 楼

我会使用

d])


,这意味着删除(d)到下一个不匹配的')'(]))。

请参阅:help ])
/>

#2 楼

运动仅沿一个方向进行,而文本对象仅沿两个方向进行。

这意味着您不能拥有一半的文本对象,除非您创建一个自定义运算符待处理动作,该动作在幕后使用该文本对象或模仿其行为。

在您的示例中,i)覆盖的文本很容易可视化:

func1(x, func2(), y);
      ^^^^^^^^^^^^^


,但是您如何告诉Vim从光标开始操作到结束文本?人们需要创建自定义运算符,例如obi)oei)(半随机示例)。

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>


评论


创建一个通用动作来重新使用所有已经定义的文本对象,再结合当前光标位置,将会很有趣;例如,代替ib,在右边是imb,在左边是iMb,依此类推(自动)。

– VanLaser
16-11-29在16:16



#3 楼

对于这种特定情况,我会dfy

对于一般情况:



dT(从光标删除到块的开头

vib选择其余的内部块

p用刚刚删除的内容替换内部块

您可以将其变成映射。

 :map K dt(vibp


#4 楼

其他现有的答案都取决于vim的定义和对块的检测。对于这种删除,我的策略是将c命令与f运动和实际字符结合起来使用。然后,这实际上将删除停止字符,但由于它也是您按下的最后一个键,因此重复两次将使成本接近零,并且由于c更改为插入模式而将再次插入。

< br举例说明,对于

func1(x|, func2(), y); 


命令c2f))将给出

func1(x)|;


乍一看似乎不如其他答案那么优雅,但是请注意,此策略是通用的,并且不依赖于任何块定义。


例如,

<div| class="some-class">text</div>


命令cf>>将给出

<div>|text</div>



或者在编辑csv文件(如

)时
2016-11-29,question,vi|.stackexchange.com,10435


命令cf,,会给出

2016-11-29,question,vi,|10435



我经常用它从
printf("Hello world| - a boring example\n");




printf("Hello world\|n");


cf\

或从

print("Hello world| - a boring example");



print("Hello world"|);


cf""一起。


这确实将当前位置更改为与要求的位置稍有不同的位置,并且也会更改为插入模式。但是我想分享删除其他所有内容的解决方案。

评论


cf解决方案的问题在于,我必须指定要停止删除的字符。这些问题询问您是否不能简单地执行cf),因为您实际想要到达的)之前还有另一个)(例如,当您想更改func(x |,g(x,x),x,x,g时),该怎么办? (x,x))转换为func(x))。基本上,我想知道是否可以避免按。 cf之后)。

– Mateusz Piotrowski
16年11月29日在21:54

请注意,您也可以使用t而不是f来删除最多但不包括给定字符,因此对于您的第一个示例(func1(x |,func2(),y);),您可以仅使用d2t。正如@MateuszPiotrowski提到的那样,它不是通用解决方案,需要您知道要将其删除到哪个字符。众所周知,对于给定的语言,哪个字符结束了您所处的障碍,这还不错。

–海因
16-12-7在12:30



#5 楼

vim-ninja-feet插件可能就是您想要的。据我了解,它使d[d]变成“从光标删除到文本对象的开始/结尾”,因此d]i)应该被“删除直到周围括号的结尾”。