Vim拆分函数参数

时间:2018-06-12 14:23:07

标签: 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)我的想法出了什么问题?当我从手工运行这个组合时,它可以工作,但在调用时:拆分它不会。

2 个答案:

答案 0 :(得分:1)

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

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

exe "normal! \<esc>"

\<esc>由字符串插入作为文字转义键。因此,exe "normal! ..."会被转换为使用您要查找的键调用normal!。您还需要以相同的方式逃避<cr>。我也使用\<space>而不是,我不完全确定正常空间是否适用于此处。在那之后,希望你得到与手动输入时相同的结果。

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

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

但是有一个setting你可以根据自己的喜好进行调整。或者,从Jordan Running的链接,似乎你也可以使用argwrap插件,特别是对于参数拆分可能更可靠(splitjoin处理更多种类的情况,但可能没有那么好用争论?不确定。)

答案 1 :(得分:0)

数目:

  1. 我不明白这个问题。您可以使用f/语法搜索空格。你为什么要这样做?
  2. 是。见下文。
  3. vimrc语法与普通的vim语法完全不同。我不知道为什么,我也不完全理解它。
  4. 代码:

    nnoremap <C-r> :s/, */,\r    /g<cr>:s/)/\r)<cr>:nohl<cr>
    

    重新映射ctrl + r以搜索逗号,后跟0或更多空格,并用逗号,换行符和制表符替换它。然后搜索)并用换行符替换它。然后撤消它刚刚做的突出显示。

    要输入文字标签而不是4个空格,您必须输入 Ctrl V 标签代替4您在命令中看到的空格