有沒有辦法讓 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{
,如果“}”前面有兩個空格或製表符,則不會替換末尾帶有“}”的行,這表明它可能是正確縮排的。