替换为文本对象的结尾

时间:2012-07-26 16:35:56

标签: vim

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

def myfun(a, b=12, c=(1,2,3), d=15):
    pass

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

此问题的理想答案也适用于引用的字符串,[]块和其他文本对象。请注意,我在“How to select between brackets (or quotes or ...) in Vim?”中回答了所有关于文本对象的内容。

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

5 个答案:

答案 0 :(得分:10)

有一堆以] 开头的命令,这些命令到达某种结构的末尾,并且尊重嵌套。 ] 转到带括号的块的末尾,] } 转到括号的末尾阻止,] / 转到C注释(/*...*/样式)的末尾。使用 [代替] 转到开头而不是结尾。

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

:help various-motions下列出了这些命令的完整列表。不幸的是,没有一个用括号分隔的块,因为 [ [] ] 已经有了不同在经典的vi中有意思,vim定义了] [ [ ] 以与这些完美契合。

答案 1 :(得分:5)

使用此

创建地图
mavi)o`a
  • 标记当前位置
  • 直观地选择inside()以选择您所在的()内的完整字符集
  • 转到突出显示的文字:h v_o的另一端以获取更多信息
  • 移至先前标记的位置

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

编辑:我仍然最喜欢@Alan-Curry的解决方案,因为键序很短。然而,这种技术的好处是也可以使用]。

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

vi)o``

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

答案 2 :(得分:1)

如果您不介意使用插件,我相信vim-ninja-feet完全符合您的要求。

  • c]i)将更改参数列表的其余部分
  • d[i"会的 向后删除报价的开头,
  • z]i]会在[]块结尾处进入插入模式。

答案 3 :(得分:0)

在这种情况下,

ct:会将所有内容更改为:,但不包括t。使用数字参数在c之前,您可以轻松地更改嵌套的大括号/ parens / quotes,例如 C2T)

如果光标已经在您要更改的行上, fc 将使用上述命令将您置于要开始更改的字符上,或使用搜索,例如:对于更一般的情况, / c = ,即如果你前面有{{1}}个字符,或者光标当前在前一行。

答案 4 :(得分:0)

我一起破解了一个小解决方案。它可能有一些边缘情况,可能有一些一个一个错误,但我今天没有时间进行测试。我有空的时候会再次访问。

function! UntilTextObject(op)
    " Save marks
    let save_a = getpos("'a")
    let save_b = getpos("'b")

    " Read in the object type and set '< and '> to the ends of the
    " range of the text-object and 'a to the current position
    let object_type = nr2char(getchar())
    execute "normal! mavi" . object_type . "\<esc>"

    " Adjust end position (off by one)
    let pos = getpos("'>")
    let pos[2] += 1
    call setpos("'b", pos)

    " Operate on the range `a to `b
    execute "normal! `a" . a:op . "`b"

    " Restore marks
    call setpos("'a", save_a)
    call setpos("'b", save_b)
endfunction

onoremap u :call UntilTextObject(v:operator)<cr>

这允许您执行du)删除 - 直到 - 结束 - 文本对象。也适用于其他文本对象。

我添加了一些更改,通过不踩你的标记使这更有礼貌。如果你给它一个没有选择任何东西的文本对象,它仍然有点古怪。我将在以后重新审视这个问题,看看我是否能解决这个问题。出于演示目的,它故意被过度评论。