vim に新しい行の括弧をフォーマットするように指示する方法はありますか?
例えば:
public class Foo {
private Foo(int a) {
if (a > 30) {
// do stuff
}
for (int i = 0; i < a; i++) {
// more stuff
}
}
}
次のように変更します:
public class Foo
{
private Foo(int a)
{
if (a > 30)
{
// do stuff
}
for (int i = 0; i < a; i++)
{
// more stuff
}
}
}
zc
なぜそうなるのでしょうか? 2 番目の例のようにフォーマットされている場合、VIM を押すとコード ブロックがきれいに折りたたまれるためです。 この場合、VIM は括弧内のコンテンツのみを折りたたみます。コードが最初の例のようにフォーマットされている場合、VIM は括弧内のコンテンツだけでなくif (...)
、、、、for (....)
なども折りたたみます。そこで、2 番目の例のようにファイルをフォーマットするように VIM に指示する方法があるかどうかを知りたいです。function f()
class Foo()
別の方法としては、括弧の前の内容を折り返さないように VIM に指示する方法があります。
答え1
はい、それは非常に簡単にできます。行末の既存の '{' 文字 ( $
) を復帰 ( \r
) と新しい '{' に置き換えて、適切にフォーマットするには、次の 2 つのコマンドを実行します (ただし、エッジケースについては回答の最後にある編集を参照してください)。
:%s/{$/\r{
:%norm ==
最初のコマンドは次のようになります:
public class Foo
{
private Foo(int a)
{
if (a > 30)
{
// do stuff
}
for (int i = 0; i < a; i++)
{
// more stuff
}
}
}
2 番目のコマンドは次のようになります。
public class Foo
{
private Foo(int a)
{
if (a > 30)
{
// do stuff
}
for (int i = 0; i < a; i++)
{
// more stuff
}
}
}
(%
上記コマンドの 記号は、ファイルのすべての行に適用することを意味します。代わりに、 のように範囲を指定したり:5,10s/{$/\r{
、 のように相対行番号を使用したり-2,+3s/{$/\r{
、ビジュアル モードで行を選択して を押すと:
、置換コマンドがそれらの行に適用されます)。
=ap
(段落をフォーマットするために書式設定を適用することもできます。詳細については、a
p
を参照してください ):help =
編集
@blackyellow のコメントより: これは良い解決策ですが、すでに正しくフォーマットされている '}' の行も置き換えられてしまうという問題があります。よりよいパターンは で、:%s/[^( |\t)]}$/\r{
'}' の前に 2 つのスペースまたはタブがある場合、末尾の '}' のある行は置き換えられません。これは、'}' が正しくインデントされていることを示しています。