縮排

Nvim :help 頁面,由 產生,來源為 此處,並使用 tree-sitter-vimdoc 解析器。


此檔案是有關 C 程式和其他檔案的縮排。

1. C 樣式程式的縮排

C 樣式縮排的基本概念在使用者手冊的 30.2 節中說明。
Vim 具有自動縮排 C 樣式程式檔案的選項。許多程式語言(包括 Java 和 C++)都非常遵循 C 建立的格式慣例。這些選項只會影響縮排,而不會執行其他格式化。還有其他選項會影響其他類型的格式化以及縮排,請參閱 format-commentsfo-tablegqformatting 以了解主要的選項。
事實上,有四種主要的縮排方法可用,如果啟用,每種方法都會覆蓋前一種,或者對於 'indentexpr' 而言,如果不是空的:'autoindent' 使用前一行的縮排。'smartindent' 類似於 'autoindent',但也會辨識一些 C 語法,以在適當的地方增加/減少縮排。'cindent' 比其他兩種更聰明地工作,並且可以配置為不同的縮排樣式。'indentexpr' 是最靈活的:評估運算式以計算一行的縮排。當此方法不是空的時候,會覆蓋其他方法。請參閱 indent-expression。本節的其餘部分描述 'cindent' 選項。
請注意,'cindent' 縮排並非適用於所有程式碼情境。Vim 不是 C 編譯器:它無法辨識所有語法。其中一個要求是,頂層函數必須在第一欄中有「{」。否則,它們很容易與宣告混淆。
以下五個選項控制 C 程式縮排:'cindent' 啟用 Vim 自動執行 C 程式縮排。'cinkeys' 指定在插入模式下觸發重新縮排的按鍵。'cinoptions' 設定您偏好的縮排樣式。'cinwords' 定義在下一行開始額外縮排的關鍵字。'cinscopedecls' 定義被識別為 C++ 範圍宣告的字串。
如果 'lisp' 未開啟且 'equalprg' 為空,則 "=" 運算子會使用 Vim 的內建演算法縮排,而不是呼叫外部程式。
請參閱 autocommand,了解如何為 C 程式碼檔案自動設定 'cindent' 選項,並為其他檔案重設它。
cinkeys-format indentkeys-format 'cinkeys' 選項是一個字串,用於控制 Vim 在某些內容中回應輸入特定字元或命令時的縮排。請注意,這不僅會觸發 C 縮排。當 'indentexpr' 不是空的時候,會改用 'indentkeys''cinkeys''indentkeys' 的格式相同。
預設值為「0{,0},0),0],:,0#,!^F,o,O,e」,指定縮排的發生方式如下
「0{」如果您輸入「{」作為一行的第一個字元「0}」如果您輸入「}」作為一行的第一個字元「0)」如果您輸入「)」作為一行的第一個字元「0]」如果您輸入「]」作為一行的第一個字元「:」如果您在標籤或 case 語句後輸入「:」「0#」如果您輸入「#」作為一行的第一個字元「!^F」如果您輸入 CTRL-F(不會插入)「o」如果您在任何地方輸入 <CR> 或使用「o」命令(不在插入模式!)「O」如果您使用「O」命令(不在插入模式!)「e」如果您在行首的「else」輸入第二個「e」
可以放在每個按鍵之前的字元:i_CTRL-F
! 當「!」放在按鍵之前時,Vim 不會插入按鍵,而是會重新縮排目前行。這可讓您定義一個用於重新縮排目前行的命令按鍵。CTRL-F 是此功能的預設按鍵。如果您為此定義 CTRL-I,請小心,因為 CTRL-I<Tab> 的 ASCII 碼。* 當「*」放在按鍵之前時,Vim 會在插入按鍵之前重新縮排該行。如果 'cinkeys' 包含「*<Return>」,Vim 會在開啟新行之前重新縮排目前行。0 當零放在按鍵之前時(但出現在「!」或「*」之後),Vim 只會在按鍵是您在該行中輸入的第一個字元時,才會重新縮排該行。當在「=」之前使用時,Vim 只會在單字之前只有空白時,才會重新縮排該行。
當按鍵之前沒有「!」或「*」時,Vim 會在您輸入按鍵後重新縮排該行。因此,「;」會設定包含「;」的行的縮排。
特殊按鍵名稱
> 角括號表示按鍵的完整名稱。例如:「<Up>」、「<Ins>」(請參閱 key-notation)。^ 以插入符號 (^) 開頭的字母是控制字元。例如:「^F」是 CTRL-F。o 當您使用「o」命令或當 Vim 在目前行下方開啟新行時(例如,當您在插入模式下輸入 <Enter> 時),重新縮排一行。O 當您使用「O」命令時,重新縮排一行。e 當您輸入第二個「e」時,重新縮排以「else」開頭的行。: 當輸入「:」且該「:」位於標籤或 case 語句之後時,重新縮排一行。對於 C++ 中的「class::method」中的「:」,請勿重新縮排。若要重新縮排任何「:」,請使用「<:>」。=word 在輸入「word」的最後一個字元時重新縮排。「word」實際上可能是另一個單字的一部分。因此,當輸入「endif」或「endwhile」中的「d」時,「=end」會導致重新縮排。但當輸入「bend」時則不會。當完成產生以「word」開頭的單字時,也會重新縮排。「0=word」會在單字之前只有空白時重新縮排。=~word 與 =word 類似,但忽略大小寫。
如果您真的想在輸入 'o'、'O'、'e'、'0'、'<'、'>'、'*'、':' 或 '!' 時重新縮排,請分別使用 "<o>"、"<O>"、"<e>"、"<0>"、"<<>"、"<>>"、"<*>"、"<:>" 或 "<!>" 作為這些按鍵。
對於 Emacs 樣式的縮排模式,其中不會在每次按下 <Enter> 時縮排行,而只會在按下 <Tab> 時縮排行,我建議
:set cinkeys=0{,0},:,0#,!<Tab>,!^F
您可能也想關閉 'autoindent'
注意:如果您手動變更目前行的縮排,Vim 會忽略該行的 cindent 設定。這可以防止 vim 在您透過在縮排中輸入 <BS><Tab><Space> 或使用 CTRL-TCTRL-D 來變更縮排後重新縮排。
cinoptions-values
'cinoptions' 選項設定 Vim 如何執行縮排。選項字元後的值可以是下列其中之一(N 為任何數字):N 縮排 N 個空格 -N 向左縮排 N 個空格 Ns N 次 'shiftwidth' 個空格 -Ns 向左縮排 N 次 'shiftwidth' 個空格
在下面的列表中,「N」代表您選擇的數字(數字可以是負數)。當數字後面有「s」時,Vim 會將數字乘以 'shiftwidth':「1s」是 'shiftwidth',「2s」是兩倍的 'shiftwidth',依此類推。您也可以使用小數點:「-0.5s」是負一半的 'shiftwidth'。下面的範例假設 'shiftwidth' 為 4。cino->
>N 「正常」縮排所增加的量。用於應該增加縮排的行之後(以「if」開頭的行、開頭的大括號等等)。(預設值為 'shiftwidth')。
cino= cino=>2 cino=>2s
if (cond)              if (cond)                  if (cond)
{                      {                          {
    foo;                foo;                          foo;
}                      }                          }
cino-e
eN 如果行尾的開頭大括號(更精確地說:不是該行的第一個字元),則在大括號內的一組縮排中加入 N。如果您想要當「{」在行首時和當「{」在行尾時使用不同的縮排,這會很有用。(預設值為 0)。
cino= cino=e2 cino=e-2
if (cond) {              if (cond) {          if (cond) {
    foo;                    foo;            foo;
}                      }                          }
else                      else                  else
{                      {                          {
    bar;                  bar;                      bar;
}                      }                          }
cino-n
nN 如果在「if」、「while」等之後的語句不在一組大括號內,則將 N 加入其主要縮排。如果您想要當語句之前沒有「{」時和當語句之前有「{」時使用不同的縮排,這會很有用。(預設值為 0)。
cino= cino=n2 cino=n-2
if (cond)              if (cond)                  if (cond)
    foo;                    foo;            foo;
else                      else                  else
{                      {                          {
    bar;                  bar;                      bar;
}                      }                          }
cino-f
fN 將函數或其他區塊的第一個開頭大括號放在第 N 欄。這僅適用於不在其他大括號內且位於行首的開頭大括號。大括號之後的內容會相對於這個大括號放置。(預設值為 0)。
cino= cino=f.5s cino=f1s
func()              func()                  func()
{                        {                      {
    int foo;                    int foo;                  int foo;
cino-{
{N 從主要的縮排放置開頭大括號 N 個字元。這僅適用於其他大括號內的開頭大括號。(預設值為 0)。
cino= cino={.5s cino={1s
if (cond)              if (cond)                  if (cond)
{                        {                      {
    foo;                  foo;                      foo;
cino-}
}N 從相符的開頭大括號放置結尾大括號 N 個字元。(預設值為 0)。
cino= cino={2,}-0.5s cino=}2
if (cond)              if (cond)                  if (cond)
{                        {                  {
    foo;                  foo;                      foo;
}                      }                            }
cino-^
^N 如果開頭大括號位於第 0 欄,則將 N 加入大括號內的一組縮排。這可以為整個函數指定不同的縮排(有些人可能喜歡將其設定為負數)。(預設值為 0)。
cino= cino=^-2 cino=^-s
func()              func()                  func()
{                      {                          {
    if (cond)                if (cond)          if (cond)
    {                        {                  {
        a = b;            a = b;              a = b;
    }                        }                  }
}                      }                          }
cino-L
LN 控制跳躍標籤的放置。如果 N 為負數,標籤將放在第 1 欄。如果 N 為非負數,標籤的縮排將是主要的縮排減去 N。(預設值為 -1)。
cino= cino=L2 cino=Ls
func()              func()              func()
{                   {                   {
    {                   {                   {
        stmt;               stmt;               stmt;
LABEL:                    LABEL:            LABEL:
    }                   }                   }
}                   }                   }
cino-:
:N 從 switch() 的縮排放置 case 標籤 N 個字元。(預設值為 'shiftwidth')。
cino= cino=:0
switch (x)              switch(x)
{                      {
    case 1:              case 1:
        a = b;          a = b;
    default:              default:
}                      }
cino-=
=N 從標籤的縮排放置在 case 標籤之後出現的語句 N 個字元。(預設值為 'shiftwidth')。
cino= cino==10
case 11:                case 11:  a = a + 1;
    a = a + 1;                  b = b + 1;
cino-l
lN 如果 N != 0,Vim 會將程式碼對齊到 case 標籤,而不是同一行中其後的語句。
cino= cino=l1
switch (a) {              switch (a) {
    case 1: {                  case 1: {
                break;              break;
            }                  }
cino-b
bN 如果 N != 0,Vim 會將最後的 "break" 對齊到 case 標籤,使 case..break 看起來像一個區塊。(預設值:0)。當使用 1 時,請考慮將 "0=break" 加入 'cinkeys'
cino= cino=b1
switch (x)              switch(x)
{                      {
    case 1:                  case 1:
        a = b;              a = b;
        break;          break;
    default:                  default:
        a = 0;              a = 0;
        break;          break;
}                      }
cino-g
gN 將 C++ 作用域宣告放置在它們所屬區塊的縮排位置,並偏移 N 個字元。(預設值 'shiftwidth')。預設情況下,作用域宣告為 "public:"、"protected:" 或 "private:"。可以使用 'cinscopedecls' 選項調整。
cino= cino=g0
{                      {
    public:              public:
        a = b;          a = b;
    private:              private:
}                      }
cino-h
hN 將 C++ 作用域宣告後的語句放置在標籤縮排位置,並偏移 N 個字元。(預設值 'shiftwidth')。
cino= cino=h10
public:                public:   a = a + 1;
    a = a + 1;                  b = b + 1;
cino-N
NN 相較於一般區塊,在 C++ 命名空間內縮排額外 N 個字元。(預設值:0)。
cino= cino=N-s
namespace {                namespace {
    void function();       void function();
}                          }
namespace my               namespace my
{                          {
    void function();       void function();
}                          }
cino-E
EN 相較於一般區塊,在 C++ 連結規格(extern "C" 或 extern "C++")內縮排額外 N 個字元。(預設值:0)。
cino= cino=E-s
extern "C" {               extern "C" {
    void function();       void function();
}                          }
extern "C"                 extern "C"
{                          {
    void function();       void function();
}                          }
cino-p
pN K&R 風格函數宣告的參數宣告將從邊界縮排 N 個字元。(預設值 'shiftwidth')。
cino= cino=p0 cino=p2s
func(a, b)              func(a, b)          func(a, b)
    int a;              int a;                          int a;
    char b;              char b;                          char b;
cino-t
tN 將函數回傳型別宣告從邊界縮排 N 個字元。(預設值 'shiftwidth')。
cino= cino=t0 cino=t7
    int              int                         int
func()              func()                  func()
cino-i
iN 如果 C++ 基底類別宣告和建構子初始化在新行開始(否則它們會對齊到 ':' 的右側),則將其縮排 N 個字元。(預設值 'shiftwidth')。
cino= cino=i0
class MyClass :            class MyClass :
    public BaseClass      public BaseClass
{}                            {}
MyClass::MyClass() :            MyClass::MyClass() :
    BaseClass(3)            BaseClass(3)
{}                            {}
cino-+
+N 在函數內,將延續行(溢出到下一行的行)額外縮排 N 個字元。(預設值 'shiftwidth')。在函數外,當前一行以反斜線結尾時,會使用 2 * N。
cino= cino=+10
a = b + 9 *                    a = b + 9 *
    c;                              c;
cino-c
cN 當沒有其他文字可以對齊時,將註解開始符號後的註解行從註解開始符號縮排 N 個字元。(預設值:3)。另請參閱 format-comments
cino= cino=c5
/*                            /*
   text.                         text.
 */                             */
cino-C
CN 當 N 為非零值時,即使在註解開始符號後有其他文字,也使用上述 c 標籤指定的數量來縮排註解行。(預設值:0)。
cino=c0 cino=c0,C1
/********                    /********
  text.                    text.
********/                    ********/
(範例使用 ":set comments& comments-=s1:/* comments^=s0:/*")
cino-/
/N 將註解行額外縮排 N 個字元。(預設值:0)。cino= cino=/4
a = b;                    a = b;
/* comment */                        /* comment */
c = d;                    c = d;
cino-(
(N 在未關閉的括號內,從具有未關閉括號的行縮排 N 個字元。為每個額外未關閉的括號增加一個 'shiftwidth'。當 N 為 0 或未關閉的括號是其行中的第一個非空白字元時,與未關閉括號後的下一個非空白字元對齊。(預設值:'shiftwidth' * 2)。
cino= cino=(0
if (c1 && (c2 ||            if (c1 && (c2 ||
            c3))                       c3))
    foo;                        foo;
if (c1 &&                    if (c1 &&
        (c2 || c3))                (c2 || c3))
   {                               {
cino-u
uN 與 (N 相同,但針對更深一層的巢狀層級。(預設值:'shiftwidth')。
cino= cino=u2
if (c123456789            if (c123456789
        && (c22345                    && (c22345
            || c3))                      || c3))
cino-U
UN 當 N 為非零值時,如果未關閉的括號是其行中的第一個非空白字元,則不要忽略 ( 或 u 指定的縮排。(預設值:0)。
cino= or cino=(s cino=(s,U1
c = c1 &&                    c = c1 &&
    (                                (
     c2 ||                            c2 ||
     c3                            c3
    ) && c4;                        ) && c4;
cino-w
wN 在未關閉的括號內,且 N 為非零值,並分別使用 "(0" 或 "u0",或使用 "U0" 且未關閉的括號是其行中的第一個非空白字元時,與未關閉的括號之後的字元立即對齊,而不是與第一個非空白字元對齊。(預設值:0)。
cino=(0 cino=(0,w1
if (   c1                    if (   c1
       && (   c2                && (   c2
              || c3))                    || c3))
    foo;                        foo;
cino-W
WN 在未關閉的括號內,且 N 為非零值,並分別使用 "(0" 或 "u0",且未關閉的括號是其行中的最後一個非空白字元,且它不是關閉括號時,將下一行相對於外部上下文(即行首或下一個未關閉的括號)縮排 N 個字元。(預設值:0)。
cino=(0 cino=(0,W4
a_long_line(                    a_long_line(
            argument,                argument,
            argument);        argument);
a_short_line(argument,    a_short_line(argument,
             argument);                 argument);
cino-k
kN 在 "if"、"for" 或 "while" 後面的未關閉括號內,且 N 為非零值時,覆蓋 "(N" 定義的行為:導致縮排相對於外部上下文(即 "if"、"for" 或 "while" 所在的行)縮排 N 個字元。對更深的巢狀層級沒有影響。僅對 "if"、"for" 和 "while" 條件影響 "wN" 等標籤。如果為 0,則預設為 "(N" 標籤定義的行為。(預設值:0)。
cino=(0 cino=(0,ks
if (condition1            if (condition1
    && condition2)                    && condition2)
    action();                        action();
function(argument1            function(argument1
         && argument2);             && argument2);
cino-m
mN 當 N 為非零值時,將以關閉括號開頭的行與具有匹配開啟括號的行的第一個字元對齊。(預設值:0)。
cino=(s cino=(s,m1
c = c1 && (                    c = c1 && (
    c2 ||                        c2 ||
    c3                        c3
    ) && c4;                    ) && c4;
if (                            if (
    c1 && c2                        c1 && c2
   )                            )
    foo;                        foo;
cino-M
MN 當 N 為非零值時,將以關閉括號開頭的行與前一行的第一個字元對齊。(預設值:0)。
cino= cino=M1
if (cond1 &&                    if (cond1 &&
       cond2                           cond2
   )                                   )
java-cinoptions java-indenting cino-j jN 正確縮排 Java 匿名類別。也適用於 Javascript。目前 'N' 的值未使用,但必須為非零值(例如 'j1')。'j1' 會正確縮排以下程式碼片段
object.add(new ChangeListener() {
    public void stateChanged(ChangeEvent e) {
        do_something();
    }
});
javascript-cinoptions javascript-indenting cino-J JN 正確縮排 JavaScript 物件宣告,方法是不將它們與標籤混淆。目前 'N' 的值未使用,但必須為非零值(例如 'J1')。如果啟用此選項,您可能還需要設定 cino-j
var bar = {
    foo: {
        that: this,
        some: ok,
    },
    "bar":{
        a : 2,
        b: "123abc",
        x: 4,
        "y": 5
    }
}
cino-)
)N Vim 最多會搜尋 N 行以外的未關閉括號。這限制了搜尋括號所需的時間。(預設值:20 行)。
cino-star
*N Vim 最多會搜尋 N 行以外的未關閉註解。這限制了搜尋註解開始所需的時間。如果您的 /* */ 註解在 N 行後停止縮排,這是您想要變更的值。(預設值:70 行)。
cino-#
#N 當 N 為非零值時,辨識以 '#' 開頭的 shell/Perl 註解,不辨識前置處理器行;允許右移以 "#" 開頭的行。當 N 為零(預設值)時:不辨識 '#' 註解,辨識前置處理器行;右移以 "#" 開頭的行不起作用。
cino-P
PN 當 N 為非零值時,辨識 C pragma,並像其他程式碼一樣縮排它們;不涉及其他前置處理器指令。當 N 為零(預設值)時:不辨識 C pragma,將它們視為其他前置處理器指令。
預設值完整寫出如下:
cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,N0,E0,ps,ts,is,+s,
                c3,C0,/0,(2s,us,U0,w0,W0,k0,m0,j0,J0,)20,*70,#0,P0
如果出現以下情況,Vim 會將行放在第 1 欄:
它以 '#' 開頭(前置處理器指令),如果 'cinkeys' 包含 '#0'。
它以標籤(一個關鍵字後面跟著 ':',而不是 "case" 和 "default")開頭,並且 'cinoptions' 不包含具有正值的 'L' 項目。
任何縮排組合都會導致該行的縮排小於 0。

2. 依運算式縮排 indent-expression

使用彈性縮排的基本知識在使用者手冊的 30.3 節中說明。
如果您想編寫自己的縮排檔案,則必須設定 'indentexpr' 選項。設定 'indentkeys' 選項通常很有用。有關提示,請參閱 $VIMRUNTIME/indent/README.txt 檔案。有關範例,請參閱 $VIMRUNTIME/indent 目錄。
關於特定縮排檔案的說明
Clojure 縮排在某種程度上與傳統的 Lisp 不同,部分原因是使用了方括號和花括號,另一方面則是社群慣例。這些慣例並非普遍遵循,因此 Clojure 縮排腳本提供了一些組態選項。
設定 searchpairpos() 的最大掃描距離。當處理非常長的表單時,較大的值會犧牲效能來換取正確性。值為 0 將掃描而不受限制。預設值為 300。
'lispwords' 選項是一個以逗號分隔的單字列表,標記特殊表單,其子表單應縮排兩個空格。
例如
(defn bad []
      "Incorrect indentation")
(defn good []
  "Correct indentation")
如果您想使用 pattern 指定 'lispwords',則可以使用模糊縮排功能
" Default
let g:clojure_fuzzy_indent = 1
let g:clojure_fuzzy_indent_patterns = ['^with', '^def', '^let']
let g:clojure_fuzzy_indent_blacklist =
        \ ['-fn$', '\v^with-%(meta|out-str|loading-context)$']
g:clojure_fuzzy_indent_patternsg:clojure_fuzzy_indent_blacklist 是將與列表頭部的未限定符號比對的模式列表。這表示類似 "^foo" 的模式將與所有這些候選項比對:foobarmy.ns/foobar#'foobar
每個候選字都按此順序測試以進行特殊處理
1. 如果單字字面上位於 'lispwords' 中,則傳回 true。2. 如果單字符合 g:clojure_fuzzy_indent_blacklist 中的模式,則傳回 false。3. 如果單字符合 g:clojure_fuzzy_indent_patterns 中的模式,則傳回 true。4. 否則傳回 false 並正常縮排
Clojure 中的某些表單會縮排,使得每個子表單僅縮排兩個空格,而無論 'lispwords' 為何。如果您有應以這種特殊方式縮排的自訂結構,則可以將您的符號新增至下面的預設列表。
" Default
let g:clojure_special_indent_words =
   \ 'deftype,defrecord,reify,proxy,extend-type,extend-protocol,letfn'
將多行字串中的後續行對齊到開頭引號後的欄位,而不是同一欄位。
例如
(def default
  "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
  eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
  enim ad minim veniam, quis nostrud exercitation ullamco laboris
  nisi ut aliquip ex ea commodo consequat.")
(def aligned
  "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
   eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
   enim ad minim veniam, quis nostrud exercitation ullamco laboris
   nisi ut aliquip ex ea commodo consequat.")
預設情況下,看起來像函數呼叫且其頭部子表單位於其自身行上的括號複合表單,其後續子表單相對於開頭括號縮排兩個空格。
(foo
  bar
  baz)
將此選項設定為 1 會變更此行為,使所有子表單都對齊到同一欄位,模擬 clojure-mode.el 的預設行為。
(foo
 bar
 baz)
會縮排 Block if、select case、select type、select rank、where、forall、type、interface、associate、block、enum、critical 和 change team 建構。子常式、函數、模組和程式區塊的縮排是可選的。如果 Fortran 採用自由原始碼形式,則會縮排註解、標記語句和接續行,如果 Fortran 採用固定原始碼形式,則不會縮排,因為有左邊界的要求。因此,當使用固定原始碼形式時,對於標記語句和接續行,將需要手動縮排校正。有關用於偵測原始碼格式的方法的進一步討論,請參閱 ft-fortran-syntax
Do 迴圈
預設情況下,所有 do 迴圈都會保持未縮排。Do 迴圈在 Fortran 中可以是非結構化的,(可能有多個)迴圈在幾乎任意類型的標記可執行語句上結束。正確縮排需要編譯器品質的剖析。以任意類型標記語句結束的 do 迴圈的舊程式碼可以使用精細的程式(例如 Tidy)進行縮排。結構化的 do/continue 迴圈也保持未縮排,因為 continue 語句用於 do 迴圈以外的目的。Tidy 等程式可以將結構化的 do/continue 迴圈轉換為 do/enddo 形式。可以縮排 do/enddo 類型的 do 迴圈。如果您僅使用 do/enddo 形式的結構化迴圈,則應在您的 vimrc 中設定 fortran_do_enddo 變數來宣告這一點,如下所示
let fortran_do_enddo=1
在這種情況下,do 迴圈將會被縮排。 如果你所有的迴圈都只有 do/enddo 類型,例如在 .f90 檔案中,那麼你應該使用自動指令設定緩衝區標誌,例如
au! BufRead,BufNewFile *.f90 let b:fortran_do_enddo=1
以在 .f90 檔案中縮排 do 迴圈,並在其他副檔名(如 .for)的 Fortran 檔案中保持不變。
程式單元
程式單元(子程序、函數、模組和程式區塊)的縮排可以透過設定變數 fortran_indent_more 來增加,並透過設定變數 fortran_indent_less 來減少。這些變數可以在你的 vimrc 檔案中為所有 fortran 檔案設定,如下所示
let fortran_indent_less=1
可以透過設定對應的緩衝區局部變數來實現更精細的控制,如下所示
let b:fortran_indent_less=1

HTML ft-html-indent html-indent html-indenting

這是關於你可以在 vimrc 中設定的變數,以自訂 HTML 縮排。
你可以設定 <script><style>「區塊標籤」後第一行的縮排(預設為「zero」)
:let g:html_indent_script1 = "inc"
:let g:html_indent_style1 = "inc"
值 含義
「zero」:零縮排; 「auto」:自動縮排(與區塊標籤相同的縮排); 「inc」:自動縮排 + 一個縮排步進
你可以設定在開啟的 <tag 行之後屬性的縮排
:let g:html_indent_attribute = 1
值 含義
1:自動縮排,比 <tag 多一個縮排步進; 2:自動縮排,兩個縮排步進(預設); > 2:自動縮排,更多縮排步進
預設情況下,許多標籤會增加後續內容的縮排(請參閱腳本中的「新增縮排標籤」)。你可以使用以下方式新增更多標籤
:let g:html_indent_inctags = "html,body,head,tbody"
你也可以使用以下方式移除這些標籤
:let g:html_indent_autotags = "th,td,tr,tfoot,thead"
兩個變數的預設值都為空。注意:初始的「inctags」只在每個 Vim 會話中定義一次。
使用者變數僅在腳本被引用時讀取。若要在會話期間啟用你的變更,而無需重新載入 HTML 檔案,你可以手動執行
:call HtmlIndent_CheckUserSettings()
詳細資訊:計算具有「alien」內容的「區塊標籤」內的縮排
區塊標籤 縮排 運算式 何時適用
<script>{可自訂} 如果是區塊的第一行:cindent(v:lnum) 如果屬性為空或包含 "java":-1 否則(vbscript,tcl,...)<style>{可自訂} 如果是區塊的第一行:GetCSSIndent() 否則 <!-- -->:-1
MATLAB 編輯器/除錯器語言偏好設定中的「函數縮排格式」對應於
:let g:MATLAB_function_indent = {0, 1 or 2 (default)}
其中 0 代表「傳統」,1 代表「縮排巢狀函數」,2 代表「縮排所有函數」。
注意:只有在 PHP 語法啟用時,PHP 檔案才會正確縮排。
如果你正在 Unix 'fileformat' 中編輯檔案,並且換行符號前存在 '\r' 字元,則縮排將無法正確進行;你必須先使用類似以下的命令移除這些無用的字元
:%s /\r$//g
或者,你可以簡單地 :let 變數 PHP_removeCRwhenUnix 為 1,並且腳本將在 Vim 載入 PHP 檔案時(在每個 BufRead 時)靜默地移除它們。
選項
可以透過修改一些全域變數的值,以多種方式更改 PHP 縮排
php-comment PHP_autoformatcomment 預設不啟用註解的自動格式化(如果你想要使用自己的 'formatoptions'
:let g:PHP_autoformatcomment = 0
否則,'t' 將從 'formatoptions' 字串中移除,並新增 "qrowcb",有關更多資訊,請參閱 fo-table
PHP_outdentSLComments
為單行註解新增額外縮排
:let g:PHP_outdentSLComments = N
其中 N 為要新增的 'shiftwidth' 的數量。
只會影響單行註解,例如
# Comment
// Comment
/* Comment */
PHP_default_indenting
為每行 PHP 程式碼新增額外縮排,其中 N 為要新增的 'shiftwidth' 的數量
:let g:PHP_default_indenting = N
例如,當 N = 1 時,這將產生
<?php
    if (!isset($History_lst_sel))
        if (!isset($History_lst_sel))
            if (!isset($History_lst_sel)) {
                $History_lst_sel=0;
            } else
                $foo="bar";
    $command_hist = TRUE;
?>
(注意 PHP 容器標記和程式碼之間的額外縮排)
PHP_outdentphpescape
將 PHP 跳脫標籤縮排為周圍的非 PHP 程式碼(僅影響 PHP 跳脫標籤)
:let g:PHP_outdentphpescape = 0
PHP_removeCRwhenUnix
'fileformat' 設定為 Unix 時,自動移除 '\r' 字元
:let g:PHP_removeCRwhenUnix = 1
PHP_BracesAtCodeLevel
將大括號縮排到與其包含的程式碼相同的層級
:let g:PHP_BracesAtCodeLevel = 1
這將產生以下結果
if ($foo)
    {
    foo();
    }
而不是
if ($foo)
{
    foo();
}
注意:如果使用此選項,縮排速度會稍慢,因為某些最佳化將無法使用。
PHP_vintage_case_default_indent
縮排 switch() 區塊中的 'case:' 和 'default:' 陳述式
:let g:PHP_vintage_case_default_indent = 1
在 PHP 中,'case/default' 區塊內不需要大括號,因此 'case:' 和 'default:' 的縮排層級與 'switch()' 相同,以避免無意義的縮排。你可以使用以上選項來返回傳統的方式。
PHP_noArrowMatching
預設情況下,縮排腳本會透過比對 '->' 的位置來縮排多行鏈式呼叫
$user_name_very_long->name()
                    ->age()
                    ->info();
你可以將此選項設定為 1,還原為傳統的縮排方式
:let g:PHP_noArrowMatching = 1
你將獲得以下結果
$user_name_very_long->name()
    ->age()
    ->info();
PHP_IndentFunctionCallParameters
為多行函數呼叫中的參數新增額外的縮排層級。
let g:PHP_IndentFunctionCallParameters = 1
函數呼叫引數將縮排 1 個額外的層級。對於雙空格縮排
function call_the_thing(
  $with_this,
  $and_that
) {
  $this->do_the_thing(
      $with_this,
      $and_that
  );
}
PHP_IndentFunctionDeclarationParameters
為多行函數定義中的引數新增額外的縮排層級。
let g:PHP_IndentFunctionDeclarationParameters = 1
宣告中的函數引數將縮排 1 個額外的層級。對於雙空格縮排
function call_the_thing(
    $with_this,
    $and_that
) {
  $this->do_the_thing(
    $with_this,
    $and_that
  );
}
縮排量可以透過 g:python_indent 字典設定,該字典需要在新增項目之前建立
let g:python_indent = {}
給出的範例是預設值。請注意,字典值設定為運算式,以便你可以稍後變更 'shiftwidth' 的值,而無需更新這些值。
在左括號後縮排
let g:python_indent.open_paren = 'shiftwidth() * 2'
在巢狀括號後縮排
let g:python_indent.nested_paren = 'shiftwidth()'
用於續行的縮排
let g:python_indent.continue = 'shiftwidth() * 2'
預設情況下,多行建構中的右括號與上一行的第一個非空白字元對齊。如果你希望它與開始多行建構的行的第一個字元對齊,請重設此鍵
let g:python_indent.closed_paren_align_last_line = v:false
此方法使用 searchpair() 來回溯尋找未關閉的括號。這有時會很慢,因此會在 150 毫秒後逾時。如果你發現縮排不正確,你可以設定更大的逾時時間(以毫秒為單位)
let g:python_indent.searchpair_timeout = 500
如果回溯尋找未關閉的括號仍然太慢,尤其是在複製貼上操作期間,或者你不需要在多行括號內縮排,則可以完全停用此功能
let g:python_indent.disable_parentheses_indenting = 1
為了向後相容性,也支援這些變數
g:pyindent_open_paren
g:pyindent_nested_paren
g:pyindent_continue
g:pyindent_searchpair_timeout
g:pyindent_disable_parentheses_indenting
R ft-r-indent
如果函數引數跨越多行,則會對齊。如果你不希望對齊函數的引數,請在你的 vimrc 中放置
let r_indent_align_args = 0
所有以註解字元 # 開頭的行都取得與一般 R 程式碼相同的縮排層級。Emacs/ESS 的使用者可能習慣於讓以單個 # 開頭的行縮排到第 40 欄,## 縮排為 R 程式碼,而 ### 不縮排。如果你希望以註解字元開頭的行像 Emacs/ESS 一樣對齊,請在你的 vimrc 中放置
let r_indent_ess_comments = 1
如果你希望以單個 # 開頭的行與第 40 欄不同的欄對齊,則應為變數 r_indent_comment_column 設定新值,如下例所示
let r_indent_comment_column = 30
在以 "<-" 結尾的行之後的任何程式碼都會縮排。如果它是頂層函數,Emacs/ESS 不會縮排程式碼。如果你希望在這方面採用類似 Emacs/ESS 的行為,請在你的 vimrc 中放置
let r_indent_ess_compatible = 1
以下是啟用和停用此選項的縮排範例
### r_indent_ess_compatible = 1           ### r_indent_ess_compatible = 0
foo <-                                    foo <-
    function(x)                               function(x)
{                                             {
    paste(x)                                      paste(x)
}                                             }
程式碼將在符合模式 '\(&\||\|+\|-\|\*\|/\|=\|\~\|%\|->\)\s*$' 的行之後縮排。如果你希望在符合不同模式的行之後縮排,則應在你的 vimrc 中設定 r_indent_op_pattern 的適當值。
可以在 shell 檔案中的各種情況下套用的縮排量,可以透過在 字典 b:sh_indent_defaults 中將以下鍵設定為特定量或 Funcref 來配置,該 Funcref 引用將返回所需量的函數
b:sh_indent_options["default"]:預設縮排量。
b:sh_indent_options["continuation-line"]:要新增到續行的縮排量。
b:sh_indent_options["case-labels"]:為 case 標籤新增的縮排量。(尚未實際實作)
b:sh_indent_options["case-statements"]:為 case 陳述式新增的縮排量。
b:sh_indent_options["case-breaks"]:為 case 中斷新增(或更可能移除)的縮排量。
一般區塊陳述式,例如 if、for、case、always、initial、function、specify 和 begin 等,都會縮排。模組區塊陳述式(第一層區塊)預設不縮排。你可以透過在 vimrc 中設定變數來開啟縮排,如下所示
let b:verilog_indent_modules = 1
然後模組區塊將會縮排。若要停止此行為,請移除變數
:unlet b:verilog_indent_modules
若要僅為 Verilog 檔案設定變數。可以使用以下陳述式
au BufReadPost * if exists("b:current_syntax")
au BufReadPost *   if b:current_syntax == "verilog"
au BufReadPost *     let b:verilog_indent_modules = 1
au BufReadPost *   endif
au BufReadPost * endif
此外,設定變數 b:verilog_indent_width 來變更縮排寬度(預設為 'shiftwidth'
let b:verilog_indent_width = 4
let b:verilog_indent_width = shiftwidth() * 2
此外,你可以開啟除錯問題的詳細模式
let b:verilog_indent_verbose = 1
請務必先執行 ":set cmdheight=2" 以允許顯示訊息。
預設會執行 generic/port 對應陳述式的對齊。這會導致以下對齊範例
ENTITY sync IS
PORT (
       clk        : IN  STD_LOGIC;
       reset_n    : IN  STD_LOGIC;
       data_input : IN  STD_LOGIC;
       data_out   : OUT STD_LOGIC
     );
END ENTITY sync;
若要關閉此功能,請新增
let g:vhdl_indent_genportmap = 0
到 vimrc 檔案,這會導致先前的對齊範例變更
ENTITY sync IS
PORT (
  clk        : IN  STD_LOGIC;
  reset_n    : IN  STD_LOGIC;
  data_input : IN  STD_LOGIC;
  data_out   : OUT STD_LOGIC
);
END ENTITY sync;
預設會執行右側指派 "<=" 陳述式的對齊。這會導致以下對齊範例
sig_out <= (bus_a(1) AND
           (sig_b OR sig_c)) OR
           (bus_a(0) AND sig_d);
若要關閉此功能,請新增
let g:vhdl_indent_rhsassign = 0
到 vimrc 檔案,這會導致先前的對齊範例變更
sig_out <= (bus_a(1) AND
  (sig_b OR sig_c)) OR
  (bus_a(0) AND sig_d);
全行註解(以 "--" 開頭的行)會縮排以與前一行的註解對齊,前提是 "--" 後面跟著一個空白。
例如
sig_a <= sig_b; -- start of a comment
                -- continuation of the comment
                -- more of the same comment
在插入模式中,輸入 "-- "(注意空格 " ")後,按下 CTRL-F 會將當前行的 "-- " 與前一行的 "--" 對齊。
如果前一行不包含 "--",則整行註解將會與下一個非空白且非整行註解的行的開頭對齊。
縮排以下程式碼
sig_c <= sig_d; -- comment 0
       -- comment 1
             -- comment 2
  --debug_code:
  --PROCESS(debug_in)
       --BEGIN
          --  FOR i IN 15 DOWNTO 0 LOOP
           --    debug_out(8*i+7 DOWNTO 8*i) <= debug_in(15-i);
          --  END LOOP;
   --END PROCESS debug_code;
    -- comment 3
sig_e <= sig_f; -- comment 4
         -- comment 5
會產生
sig_c <= sig_d; -- comment 0
                -- comment 1
                -- comment 2
--debug_code:
--PROCESS(debug_in)
--BEGIN
--  FOR i IN 15 DOWNTO 0 LOOP
--    debug_out(8*i+7 DOWNTO 8*i) <= debug_in(15-i);
--  END LOOP;
--END PROCESS debug_code;
-- comment 3
sig_e <= sig_f; -- comment 4
                -- comment 5
請注意,"--debug_code:" 不會與 "-- comment 2" 對齊,因為 "--debug_code:" 的 "--" 後面沒有空格。
考慮到註解縮排的動態特性,縮排應該執行兩次。第一次執行時,會縮排程式碼。第二次執行時,會根據正確縮排後的程式碼來縮排整行註解。

VIM ft-vim-indent

g:vim_indent_cont
在縮排 Vim 腳本時,有一個變數可以指定接續行的縮排量,也就是以反斜線開頭的行。
:let g:vim_indent_cont = shiftwidth() * 3
預設值為 shiftwidth 的三倍。
預設情況下,yaml 縮排腳本不會嘗試偵測多行純量。如果您想要啟用此功能,請設定以下變數
let g:yaml_indent_multiline_scalar = 1
主要
指令索引
快速參考