替换为文本对象的结尾

jbm*_*ler 5 vim

在Vim中,我一直发现自己希望通过按键来重写其余参数列表.例如,在以下Python函数中:

def myfun(a, b=12, c=(1,2,3), d=15):
    pass
Run Code Online (Sandbox Code Playgroud)

我想,以取代c=(1,2,3), d=15e=12.击键ci(允许我替换整个参数列表中的所有内容,但我发现我经常想要保留一些Vim文本对象的前缀.一般来说,我假设我正在搜索的这个键击在替换函数调用的最终参数以及定义的上下文中会很有用.

这个问题的理想答案也适用于引用的字符串,[]块和其他文本对象.请注意,我理解文本对象的所有内容,如" 如何在Vim中的括号(或引号或...)之间进行选择 "中所述.

@ pb2q和@romainl都提供了很好的搜索快捷方式,但它们要求我在视觉上找到封闭块的末尾,以设计一个在块中任何其他垃圾方面明确无误的搜索(例如,考虑嵌套函数调用).特别是,当我想要操作的括号内嵌套括号时,我经常发现自己想要这个.我真正想要的答案类似于ci)ca)完全基于最近的封闭包围)并且完全优雅地与其他嵌套)块进行交易.

Ala*_*rry 10

有一堆命令从]那个开始到某种结构的结尾,并尊重嵌套.])转到带括号的块]}的末尾,转到括号块的末尾,]/转到C注释(/*...*/样式)的末尾.使用[代替]去开始,而不是结束.

所以要更换你的c=(1,2,3), d=15类型c]).

这些命令的完整列表列在下面:help various-motions.不幸的是,没有一个由括号分隔块,因为[[]]已有的经典六不同的含义,以及VIM定义][,并[]与那些很好地适应.


dar*_*ker 5

用这个创建一个地图

mavi)o`a
Run Code Online (Sandbox Code Playgroud)
  • 标记当前位置a
  • 在视觉上选择inside()以选择您所在的()内的完整字符集
  • 转到突出显示文本的另一端以:h v_o获取更多信息
  • 移动到先前标记的位置

现在您可以执行c或d等操作...

编辑:我仍然最喜欢@Alan-Curry的解决方案,因为键序很短.然而,这种技术的好处还在于使用].

我还发现了我的解决方案的简化:

vi)o``
Run Code Online (Sandbox Code Playgroud)

``跳到最后一个位置.所以你不需要创建标记.