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 に答える