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 时它不起作用。

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

当你输入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

但是您可以更改一个设置以根据自己的喜好进行调整。或者,从Jordan Running的链接来看,似乎你也可以使用argwrap插件,它可能更适合参数拆分(splitjoin处理更广泛的情况,但可能对参数做得不好?不知道。

答案:

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

法典:

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

重新映射 Ctrl+R 以搜索后跟 0 个或多个空格的逗号,并将其替换为逗号、换行符和制表符。然后搜索 CC_19 并将其替换为换行符和 (。然后撤消刚刚突出显示的内容。

要输入文字制表符而不是 4 个空格,您必须键入CtrlV制表符来代替您在命令中看到的 4 个空格

最新更新