如何告訴 VIM 在新行上格式化函數、條件和迴圈的括號?

如何告訴 VIM 在新行上格式化函數、條件和迴圈的括號?

有沒有辦法讓 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如果程式碼區塊的格式如第二個範例所示,則按VIM 可以很好地折疊程式碼區塊。在這種情況下,VIM 將只折疊括號內的內容。如果程式碼的格式如第一個範例所示,VIM 不僅會折疊括號內的內容,還會折疊if (...)for (....)function f()class Foo()等。所以我想知道是否有辦法告訴 VIM 像第二個例子一樣格式化檔案。

另一個選擇是告訴 VIM 不要折疊括號之前的內容。

答案1

$是的,您可以輕鬆地做到這一點:用回車符()和新的“ {”替換行()末尾的現有“{”字符\r,然後很好地格式化內容,您可以執行以下兩個命令(儘管請參閱答案末尾的編輯以了解邊緣情況):

:%s/{$/\r{

:%norm ==

第一個命令將達到以下目的:

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
        }
    }
}

%上述命令中的符號表示適用於檔案的所有行。您可以改為給出一個範圍,例如:5,10s/{$/\r{,或者您可以使用相對行號,例如-2,+3s/{$/\r{,或者在可視模式下選擇行並點擊: ,替換命令將套用於這些行線)。

(您也可以套用格式來=ap格式化a p段落,請參閱 :help =詳細資訊)

編輯

來自@blackyellow的評論:這是一個很好的解決方案,但一個問題是它還用“}”替換了已經正確格式化的行。更好的模式是:%s/[^( |\t)]}$/\r{,如果“}”前面有兩個空格或製表符,則不會替換末尾帶有“}”的行,這表明它可能是正確縮排的。

相關內容