15

特别是在编辑遗留 C++ 代码时,我经常发现自己手动重新格式化如下内容:

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

像这样:

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

是否有内置命令可以执行此操作?如果没有,有人可以建议一个插件或提供一些 VimScript 代码吗?(J或者gq可以很容易地逆转这个过程,所以它不需要双向。)

4

3 回答 3

12

您可以使用splitjoin

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

在括号内或括号上,键入gS以拆分。你得到:

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

你也可以使用vim-argwrap

于 2015-05-16T04:38:36.233 回答
4

这是我在我的.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 缩进内置=

该解决方案的一个已知缺点是包含多个模板参数的行(它也以逗号分隔,而不仅仅是普通参数的逗号)。

于 2012-10-04T21:01:08.917 回答
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>
于 2012-10-04T19:21:47.687 回答