删除直到当前内部块的右端


21

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

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

我想得到:

func1(x|);

有没有一种方法可以将代码从光标位置删除到当前内部块右端之前的位置

我知道我可以接受,dt).但是我想知道是否有一种方法可以将其与实际di)功能混合使用。


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

1
有时,该%动作可以完成您想要的操作(即d%)。
alxndr

Answers:


29

我会用

d])

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

请参阅:help ])


5

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

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

在您的示例中,所涵盖的文本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>

4
创建一个通用动作来重新使用所有已定义的文本对象,再结合当前光标位置,将会很有趣;例如,在右侧和左侧而不是ib,等等(自动)。imbiMb
VanLaser

3

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

对于一般情况:

  • dT( 从光标删除到块的开始
  • vib 选择内部块的其余部分
  • p 用刚刚删除的内容替换内部块

您可以将其映射。

 :map K dt(vibp

3

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


为了举例说明,

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""


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


1
cf解决方案的问题是我必须指定要停止删除的字符。这些问题询问您是否不能简单地做,cf)因为您实际上想到达另一个位置(例如,当您要更改为时)),该)怎么办。基本上,我想知道如果我能避免按下后。func(x|, g(x, x), x, x, g(x, x))func(x).cf)
Mateusz Piotrowski

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

3

VIM忍者脚插件可能是你在找什么。从我的理解,这让d[d]成“文本对象从删除光标开始/结束”,所以d]i)应该是“删除,直到周围的括号结束”。

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.