Vimscript-对多行的拆分函数调用

Vimscript-对多行的拆分函数调用,vim,neovim,Vim,Neovim,我正在尝试编写一个vimscript,它可以转换如下行: myFuncCall(param1, param2, param3="hey", param4) 致: 同时保持和添加缩进。到目前为止,我已经: function SplitParamLines() abort let f_line_num = line(".") let indent_length = indent(f_line_num) echom indent

我正在尝试编写一个vimscript,它可以转换如下行:

    myFuncCall(param1, param2, param3="hey", param4)
致:

同时保持和添加缩进。到目前为止,我已经:

function SplitParamLines() abort
    let f_line_num = line(".")
    let indent_length = indent(f_line_num)
    echom indent_length
    echom f_line_num
    .s/\s*,/,\r/g
    nohlsearch
    0t)a<cr>
endfunction


如果要执行本应键入的内容,则需要
:normal
。如果有特殊字符,则还需要
:exe
和来转义这些特殊字符。瞧

:exe "normal! 0t)i\<cr>"
:exe“正常!0t)i\”

所以我选择了两个选项:

  • 使用这个难以置信的插件-
  • 使用此简单函数:
  • “每一行中的每个参数
    函数SplitParamLines()中止
    设f_line_num=line(“.”)
    设缩进长度=缩进(f线数)
    exe“.s/\s*,/,\r.”重复(“,缩进长度+&移位宽度-1)。“/g”
    诺尔研究
    执行“正常!0t)a\\”
    端功能
    nnoremap(:调用SplitParamLines()
    

    虽然不是完美的,但它可以工作:)

    我想拆分任何语言的函数调用,而不是vimscript。我需要弄清楚如何编写vimscript函数来实现这一点。你的参数中会包含一个带逗号的参数吗?与
    func(“lastname,firstname”)
    中一样?如果是这样,你的正则表达式就会崩溃。我想在这种情况下,你可以手动操作,但我想我会指出它。@JakeGrossman谢谢,但我愿意手动面对这些边缘案例。
    Error detected while processing function SplitParamLines:
    line    7:
    E14: Invalid address
    
    :exe "normal! 0t)i\<cr>"
    
    " Every parameter in its own line
    function SplitParamLines() abort
        let f_line_num = line(".")
        let indent_length = indent(f_line_num)
        exe ".s/\s*,/,\r" . repeat(" ", indent_length + &shiftwidth - 1) . "/g"
        nohlsearch
        " execute "normal! 0t)a\<cr>\<esc>"
    endfunction
    nnoremap <silent> <leader>( :call SplitParamLines()<cr>