clang-formatの設定項目に、一部のマクロを繰り返し文として処理させるForEachMacrosがあります。
これを使って(あるいは使わずに)通常のfor文と同じようにフォーマットさせたいのですが、中身が1行の場合にうまくいきません。
AllowShortFunctionsOnASingleLine: Inlineにしたまま、以下で示すような通常のfor文の場合と同じフォーマットを実現することはできますか?
試したこと
C++
1#define FOR(x) for(x)
通常の"for"と同じマクロ"FOR"を定義していくつか試しました。
本来意図する動作は、下記のfor文を用いた際のフォーマットです。
FORマクロを用いた場合、以下のような問題が起きます。
・ループの中身が1行でも改行している
・中括弧があっても改行していない
clangFormat
1AllowShortBlocksOnASingleLine: false 2AllowShortLoopsOnASingleLine: true 3ForEachMacros: ["FOR"]
C++
1// for 2for (int i = 0; i < 10; ++i) continue; 3for (int i = 0; i < 10; ++i) { 4 continue; 5} 6for (int i = 0; i < 10; ++i) { 7 std::cout << i << std::endl; 8 continue; 9} 10 11// FOR macro 12FOR (int i = 0; i < 10; ++i) 13 continue; 14FOR (int i = 0; i < 10; ++i) { continue; } 15FOR (int i = 0; i < 10; ++i) { 16 std::cout << i << std::endl; 17 continue; 18}
ForEachMacrosを設定しないと関数呼び出しのように動作するので、AllowShortFunctionsOnASingleLine: Inlineに設定しました。
小括弧の前に空白が取られなくなりましたが、中身が1行の場合に改行しなくなります。
中括弧があっても改行はされないままです。
clangFormat
1AllowShortBlocksOnASingleLine: false 2AllowShortLoopsOnASingleLine: true 3AllowShortFunctionsOnASingleLine: Inline
C++
1// FOR macro 2FOR(int i = 0; i < 10; ++i) continue; 3FOR(int i = 0; i < 10; ++i) { continue; } 4FOR(int i = 0; i < 10; ++i) { 5 std::cout << i << std::endl; 6 continue; 7}
clangFormat
1AllowShortBlocksOnASingleLine: false 2AllowShortLoopsOnASingleLine: true 3AllowShortFunctionsOnASingleLine: Empty
最後に、AllowShortFunctionsOnASingleLine: Emptyに設定しました。
小括弧の前に空白が取られないままですが、基本的には目的のフォーマットになっています。
クラス内ではないのに、なぜ"Inline"と"Empty"で違いが出るのか分かりません。
小括弧の前に空白がないのはとりあえず良いとしても、AllowShortFunctionsOnASingleLine: Inlineにしたいのでこの設定を使うことはできません。
C++
1// FOR macro 2FOR(int i = 0; i < 10; ++i) continue; 3FOR(int i = 0; i < 10; ++i) { 4 continue; 5} 6FOR(int i = 0; i < 10; ++i) { 7 std::cout << i << std::endl; 8 continue; 9}
あなたの回答
tips
プレビュー