|
表示光标位置):func1(x|, func2(), y);
我想获得:
func1(x|);
是否可以从光标位置删除代码到当前内部块右端之前的位置?
我知道我可以使用
dt).
但我想知道是否有一种方法可以将它与di)
的功能混合使用。#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)
应该被“删除直到周围括号的结尾”。
评论
我很想知道是否有一种简单的方法可以按照您的要求“删除内部/外部块的左/右一半”。但附带说明,我可能会做C);在这种情况下。有时%运动可以满足您的需求(即d%)。