首页 > 解决方案 > Vim 拆分函数参数

问题描述

我发现我经常做重构:

def function(param1, param2, (...), paramK):

def function(
    param1,
    param2,
    (...),
    paramK,       
):

并尝试为其编写映射。我从

command! Split normal! qqqf(a<cr><esc>qqf s<cr><esc>@qq@qf)i<cr><esc>

qqq - reset content of macro q.

f(a<cr><esc> - find bracket, make newline and return to normal mode.

qq - start to record macro q.

f s<cr><esc> - change space to newline.

@q - run macro recursively.

q@q - end recording and run.

f)i<cr><esc> - add last newline before closing bracket. 

我的想法是,该宏在找不到空间时会失败,但这是有问题的。它提出了一些问题。

1)如何检查某些动作是否成功?例如如何检查当前行是否有空格?

2)有更好的主意来实现我想要的吗?也许是一些插件或清除功能?

3)我的想法有什么问题?当我手动运行这个组合时,它可以工作,但是在调用 :Split 时它不会。

标签: vim

解决方案


关于为什么它不像手动键入时那样工作:

当你输入 时normal! <esc>,Vim 将其解析为“输入字母<, e, s, c, >”。您可能可以通过键入在其中插入文字转义键<c-v><esc>,但这在配置中可能看起来有点奇怪。相反,更好的方法是使用:exe命令 ( :help :exe):

exe "normal! \<esc>"

字符串\<esc>插值成为文字转义键。因此,将转换为使用您正在寻找的键的调用。你也需要以同样的方式逃脱。我也会使用而不是,我不完全确定正常空间是否可以在这里工作。在那之后,希望您得到与手动键入时相同的结果。exe "normal! ..."normal!<cr>\<space>


至于您要解决的实际问题,我确实有一个插件:splitjoin。默认情况下,它会像这样拆分您的示例:

def function(param1,
        param2,
        (...),
        paramK):
    pass

但是您可以更改设置以根据自己的喜好进行调整。或者,从 Jordan Running 的链接中,您似乎也可以使用argwrap插件,这对于特别是参数拆分可能更可靠(splitjoin 处理更广泛的情况,但可能对参数没有那么好?不确定.)


推荐阅读