在Vim中轻松地将函数参数重新格式化为多行

时间:2012-10-04 18:53:11

标签: vim formatting arguments

特别是在编辑旧版C ++代码时,我经常会发现自己手动重新格式化这样的内容:

SomeObject doSomething(firstType argumentOne, secondType argumentTwo, thirdType argumentThree);

这样的事情:

SomeObject doSomething(firstType argumentOne,
                       secondType argumentTwo,
                       thirdType argumentThree);

是否有内置命令来执行此操作?如果没有,有人可以建议一个插件或为它提供一些VimScript代码吗? (Jgq可以非常轻松地改变流程,因此无需双管齐下。)

3 个答案:

答案 0 :(得分:9)

您可以使用vim-argwrap

SomeObject doSomething(firstType argumentOne, secondType argumentTwo, thirdType argumentThree);

在括号内或括号中输入gS进行拆分。你得到:

SomeObject doSomething(firstType argumentOne,
    secondType argumentTwo,
    thirdType argumentThree);

您也可以使用{{3}}

答案 1 :(得分:3)

以下是我在.vimrc中的内容。它比@ rbernabe的答案更灵活;它根据cinoptions全局设置进行格式化,并简单地打破逗号(如果需要,可以在多个函数上使用)。

function FoldArgumentsOntoMultipleLines()
    substitute@,\s*@,\r@ge
    normal v``="
endfunction

nnoremap <F2> :call FoldArgumentsOntoMultipleLines()<CR>
inoremap <F2> <Esc>:call FoldArgumentsOntoMultipleLines()<CR>a

这在正常和插入模式下映射 F2 进行搜索并替换当前行,该行将所有逗号(每个逗号后面有0或更多空格)转换为逗号,并在每个逗号后返回一个回车符,然后选择整个组并使用Vim内置=缩进它。

此解决方案的一个已知缺点是包含多个模板参数的行(它的逗号也会断开,而不仅仅是正常参数的逗号)。

答案 2 :(得分:2)

我会将寄存器设置为预设宏。经过一些测试后,我得到了以下内容:

let @x="/\\w\\+ \\w\\+(\nf(_:s­\\(\\w\\+\\)\\@<=,/,\\r            /g\n"

在vimrc中使用此行,您可以通过执行宏x:@x来格式化方法,光标位于要格式化的行的上方。它为缩进添加了12个空格,因此给出了:

|
SomeObject doSomething(firstType argumentOne, secondType argumentTwo, thirdType argumentThree);

执行宏后:@x你得到

SomeObject doSomething(firstType argumentOne,
             secondType argumentTwo,
             thirdType argumentThree);

如果您在函数定义的行中,则可以进行替换:

:s\(\w\+\)\@,<=,/,\r            /g

将其放在映射中很容易:

nmap <F4> :s/\(\w\+\)\@<=,/,\r            /g<CR>