如何在vim中撤销一个函数调用?

6
假设有一行文本:
$x = ( frobnicate( foo( bar( $x, $y )[ 1 ]))[ 1 ]);
光标位于“frobnicate”的“f”上,我想要复制包含对frobnicate的调用的文本。也就是说,复制到第3个右括号为止的所有内容。我可以这样做:
y3f)
或者交互式地使用:
vf);;y
但是这两种方法都不理想。(我不想手动计数“3”,也不想重复查找直到找到结束点。)是否有一种简单的方法来实现从“f”移动到匹配的右括号?我想到类似于v_i“内部字符”运动命令的东西。

我基于tpope的vim-surround制作了一个插件,其中包括函数调用的文本对象:但更普遍地说,vim-surround-funk还允许您删除、更改和复制周围的函数调用,并将其粘贴到任何文本对象周围(由于有一个文本对象用于函数调用,因此您也可以将其粘贴在它们周围!) - mattb
2个回答

12

y% 似乎有效。

help % 中得知:

查找游标位置之后或之下此行中的下一项并跳转到其匹配项。包含运动。可以是以下项目:([{}]) 括号或(花括号/方括号)


我终于明白为什么%会向右查找大括号进行匹配了!我一直对%感到烦恼,希望它能向左移动以查找匹配的大括号,因为我经常将光标放在一对大括号内并想要移动到结尾,但这显然是更好的行为。 - William Pursell
@William Pursell:你可以使用[{或者[(向左(和上方)移动,以找到一个开放的大括号或圆括号。 - heijp06
2
@William Pursell:在这种情况下,你可能想要看一下yi(或ya(,它们分别表示“复制括号内部”和“复制一个括号”。当然,任何类似va{、di[、ca(的命令也是有效的... :help object-select - François

0
你可以尝试使用yel%将光标定位到左括号,然后使用%跳转到右括号,但它看起来并不比您当前的解决方案更有效。
唯一的优点是您不必计算任何内容,并且它适用于嵌套调用。
编辑: 正如彼得所指出的那样,y%可行且是更好的解决方案(即使我不太理解为什么它能工作。Vim 真是太神奇了!)

1
我也花了一些时间才理解它。我只是尝试了一下。另一方面,帮助文档非常清楚地解释了它的工作原理。光标首先向右移动到任何一个 ([{}]) 中的字符,然后再移动到该对的另一半。 - heijp06

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接