Vim

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

  • June 3, 2021

有沒有辦法告訴 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
       }
   }
}

為什麼這個?因為通過按zcVIM 很好地折疊程式碼塊,如果它們是第二個範例的格式。在這種情況下,VIM 只會折疊括號內的內容。如果程式碼的格式與第一個範例相同,VIM 不僅會折疊括號內的內容,還會折疊if (...)for (....)function f()class Foo()等。所以我想知道是否有辦法告訴VIM像第二個例子那樣格式化文件。

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

是的,你可以很容易地做到這一點:$用輸入符 ( \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 paragraph,詳情請參閱 :help =

編輯

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

引用自:https://unix.stackexchange.com/questions/652673