如何在 vim 中拉动函数调用?

How does one yank a function call in vim?

提问人:William Pursell 提问时间:12/21/2010 更新时间:12/21/2010 访问量:783

问:

假设一行文本内容如下:

$x = ( frobnicate( foo( bar( $x, $y )[ 1 ]))[ 1 ]);

光标位于“frobnicate”的“f”上,我想拉动包含对 frobnicate 的调用的文本。(也就是说,直到第 3 个右括号的所有内容。我当然可以做到:

y3f)

或与

vf);;y

但这些都没有吸引力。(我不想手动数“3”,也不想重复查找,直到我到达终点。有没有一种简单的方法可以完成从“f”到匹配的结束 paren 的移动?我在想类似v_i“内部词”运动命令的东西。

VIM 编辑

评论

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

答:

12赞 heijp06 12/21/2010 #1

y%似乎有效。

从:help %

在此行中查找以下项 或在光标下并跳转到其 火柴。包容性动议。物品可以 BE:括号或 (大括号/方括号)([{}])

评论

0赞 William Pursell 12/21/2010
我终于明白为什么 % 向右寻找匹配的大括号!我一直对 % 感到恼火,并希望它向左移动以找到匹配的大括号,snice 我经常将光标放在一对大括号内并想移动到最后,但这显然是更好的行为。
0赞 heijp06 12/21/2010
@William Pursell:您可以使用 或 向左(和向上)移动以找到左大括号或括号。[{[(
2赞 François 12/21/2010
@William Pursell:在这种情况下,您可能想看看 yi( 或 ya(,分别表示“在括号内拉动”和“拉动括号”。当然,任何像 va{, di[, ca( 这样的命令也是有效的... :help object-select
0赞 Xavier T. 12/21/2010 #2

您可以尝试将光标定位到左括号,然后使用 跳转到右括号,但它看起来并不比您当前的解决方案更有效。yel%%

唯一的优点是您不必计算任何东西,并且它适用于嵌套调用。

编辑: 正如彼得所指出的那样,有效并且是一个出色的解决方案(即使我不太明白它为什么有效。Vim太棒了!y%

评论

1赞 heijp06 12/21/2010
我花了一段时间才理解它。我刚刚试过了。OTOH 的帮助很清楚它为什么有效。光标首先向右移动到其中任何一个,然后移动到对的另一半。([{}])