インデント

Nvim の :help ページは、生成されたもので、ソースtree-sitter-vimdocパーサーを使って処理しています。


このファイルは、Cプログラムやその他のファイルのインデントについて説明します。

1. Cスタイルのプログラムのインデント

Cスタイルのインデントの基本は、ユーザーマニュアルの30.2節で説明されています。
Vimには、Cスタイルのプログラムファイルを自動的にインデントするためのオプションがあります。JavaやC++を含む多くのプログラミング言語は、Cで確立されたフォーマット規則に非常に近いものを採用しています。これらのオプションはインデントのみに影響し、他のフォーマットは行いません。インデントだけでなく、他の種類のフォーマットにも影響を与える追加のオプションがあります。主なものは、format-commentsfo-tablegqformattingを参照してください。
実際には、インデントに使用できる主な方法が4つあります。それぞれの方法は、有効になっている場合、または'indentexpr'が空でない場合、前のものを上書きします。 'autoindent'は、前の行のインデントを使用します。'smartindent'は、'autoindent'と同様ですが、適切な場所でインデントを増減するためにC構文も認識します。'cindent'は、他の2つよりも巧妙に動作し、さまざまなインデントスタイルに合わせて構成できます。'indentexpr'は、すべての中で最も柔軟性があります。式の評価によって、行のインデントを計算します。空でない場合、このメソッドは他のメソッドを上書きします。indent-expressionを参照してください。このセクションの残りの部分では、'cindent'オプションについて説明します。
'cindent'インデントは、すべてのコードシナリオで動作するわけではないことに注意してください。VimはCコンパイラではないため、すべての構文を認識するわけではありません。1つの要件は、トップレベルの関数が最初の列に「{」を持っている必要があることです。そうでない場合、宣言と簡単に混同されます。
次の5つのオプションが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" の2番目の 'e' を入力した場合。
各キーの前に付けることができる文字:i_CTRL-F
! キーの前に "!" が付いている場合、Vimはキーを挿入せず、代わりに現在の行を再インデントします。これにより、現在の行を再インデントするためのコマンドキーを定義できます。CTRL-Fがこのデフォルトキーです。CTRL-I<Tab>のASCIIコードであるため、これにCTRL-Iを定義する場合は注意してください。* キーの前に "*" が付いている場合、Vimはキーを挿入する前にその行を再インデントします。 'cinkeys'に"*<Return>"が含まれている場合、Vimは新しい行を開く前に現在の行を再インデントします。0 キーの前にゼロ(ただし "!" または "*" の後に表示される)が付いている場合、Vimはそのキーが行に入力した最初の文字である場合にのみ、その行を再インデントします。 "=" の前に使用する場合、行の前に空白文字しかない場合にのみ、その行を再インデントします。
"!" も "*" もキーの前に付いていない場合、Vimはキーを入力した後に行を再インデントします。したがって、";" は ";" を含む行のインデントを設定します。
特殊なキー名
> 山かっこはキーの名前を表します。例:「<Up>」、「<Ins>」(キー表記を参照)。^ キャレット(^)で始まる文字は、制御文字です。例:「^F」はCTRL-Fです。o "o" コマンドを使用した場合、またはVimが現在の行の下に新しい行を開いた場合(例:挿入モードで<Enter>を入力した場合)に行を再インデントします。O "O" コマンドを使用した場合に行を再インデントします。e 2番目の 'e' を入力したときに、"else" で始まる行を再インデントします。: ラベルまたはcaseステートメントの後に ":" が入力された場合、行を再インデントします。C++の "class::method" の ":" の場合は再インデントしないでください。すべての ":" に対して再インデントするには、"<:>" を使用します。=word 「word」の最後の文字を入力するときに再インデントします。「word」は実際には別の単語の一部である可能性があります。したがって、"=end" は "endif" または "endwhile" の "d" を入力すると再インデントされます。ただし、"bend" を入力するときは再インデントされません。また、補完によって「word」で始まる単語が生成された場合も再インデントされます。"0=word" は、単語の前に空白文字しかない場合に再インデントします。=~word =word と同様ですが、大文字と小文字を区別しません。
「o」、「O」、「e」、「0」、「<」、「>」、「*」、「:」、または「!」を入力したときに再インデントしたい場合は、それらのキーに対してそれぞれ"<o>"、"<O>"、"<e>"、"<0>"、"<<>"、"<>>"、"<*>"、"<:>"、または "<!>" を使用します。
<Enter>を押すたびにインデントするのではなく、<Tab>を押した場合のみインデントするemacsスタイルのインデントモードの場合、次を推奨します。
:set cinkeys=0{,0},:,0#,!<Tab>,!^F
また、'autoindent'をオフにすることもできます。
注意:現在の行のインデントを手動で変更すると、Vimはその行のcindent設定を無視します。これにより、インデントで<BS><Tab>、または<Space>を入力したり、CTRL-TまたはCTRL-Dを使用したりしてインデントを変更した後、vimが再インデントするのを防ぎます。
cinoptions-values
'cinoptions'オプションは、Vimがどのようにインデントを実行するかを設定します。オプション文字の後の値は、次のいずれかになります(Nは任意の数)。 N インデント Nスペース -N インデント Nスペース左に Ns N倍の'shiftwidth'スペース -Ns N倍の'shiftwidth'スペース左に
以下のリストでは、「N」は任意の数を表します(数は負にすることもできます)。数値の後に「s」がある場合、Vimはその数に'shiftwidth'を掛けます。「1s」は'shiftwidth'、「2s」は2倍の'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 行のEndにある開き中括弧(より正確には、行の最初の文字ではない場合)がある場合、中括弧のセット内にある通常のインデントに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 caseラベルをswitch()のインデントから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 を使用する場合は、'cinkeys' に "0=break" を追加することを検討してください。
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++ 基底クラス宣言とコンストラクタ初期化を、新しい行で開始する場合にインデントします (それ以外の場合は、':' の右側に揃えられます) (デフォルト '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 が 0 以外の場合、コメント開始記号の後ろに他のテキストがある場合でも、上記の 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 と同じですが、1 つ深いネストレベルの場合です (デフォルト 'shiftwidth')。
cino= cino=u2
if (c123456789            if (c123456789
        && (c22345                    && (c22345
            || c3))                      || c3))
cino-U
UN N が 0 以外の場合、未閉じの括弧がその行の最初の空白文字以外の文字である場合、( または u で指定されたインデントを無視しません (デフォルト 0)。
cino= または cino=(s cino=(s,U1
c = c1 &&                    c = c1 &&
    (                                (
     c2 ||                            c2 ||
     c3                            c3
    ) && c4;                        ) && c4;
cino-w
wN 未閉じの括弧内であり、N が 0 以外であり、それぞれ "(0" または "u0" を使用している場合、または "U0" を使用しており、未閉じの括弧がその行の最初の空白文字以外の文字である場合、最初の空白文字以外の文字ではなく、未閉じの括弧の直後の文字に揃えます (デフォルト 0)。
cino=(0 cino=(0,w1
if (   c1                    if (   c1
       && (   c2                && (   c2
              || c3))                    || c3))
    foo;                        foo;
cino-W
WN 未閉じの括弧内であり、N が 0 以外であり、それぞれ "(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 が 0 以外の場合、"(N" によって定義された動作をオーバーライドします。インデントを、外部コンテキスト (つまり、"if"、"for"、または "while" がある行) を基準に N 文字にします。より深いネストレベルには影響しません。"wN" のようなフラグには、"if"、"for"、および "while" の条件に対してのみ影響します。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 以外の場合、閉じ括弧で始まる行を、対応する開き括弧がある行の最初の文字に揃えます (デフォルト 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 以外の場合、閉じ括弧で始まる行を、前の行の最初の文字に揃えます (デフォルト 0)。
cino= cino=M1
if (cond1 &&                    if (cond1 &&
       cond2                           cond2
   )                                   )
java-cinoptions java-indenting cino-j jN Java の匿名クラスを正しくインデントします。Javascript にも適しています。値 'N' は現在未使用ですが、0 以外である必要があります (例: 'j1')。'j1' を使用すると、たとえば次のコードスニペットが正しくインデントされます。
object.add(new ChangeListener() {
    public void stateChanged(ChangeEvent e) {
        do_something();
    }
});
javascript-cinoptions javascript-indenting cino-J JN Javascript オブジェクト宣言を、ラベルと混同しないように正しくインデントします。値 'N' は現在未使用ですが、0 以外である必要があります (例: '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 が 0 以外の場合、'#' で始まるシェル/Perl コメントを認識し、プリプロセッサ行を認識しません。 '#' で始まる行を右シフトできます。N が 0 の場合 (デフォルト): '#' コメントを認識せず、プリプロセッサ行を認識します。 '#' で始まる行の右シフトは機能しません。
cino-P
PN N が 0 以外の場合、C プラグマを認識し、他のコードと同様にインデントします。他のプリプロセッサディレクティブには関係ありません。N が 0 の場合 (デフォルト): C プラグマを認識せず、他のすべてのプリプロセッサディレクティブのように扱います。
デフォルトは、完全に記述すると次のようになります。
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' が含まれている場合、'#' (プリプロセッサディレクティブ) で始まる場合。
'cinoptions' に正の値を持つ 'L' エントリが含まれていない場合、ラベル ('case' および 'default' 以外の ':' が続くキーワード) で始まる場合。
インデントの組み合わせによって、行のインデントが 0 未満になる場合。

2. 式によるインデント indent-expression

柔軟なインデントを使用するための基本は、ユーザーマニュアルの 30.3 節で説明されています。
独自のインデントファイルを作成する場合は、'indentexpr' オプションを設定する必要があります。'indentkeys' オプションの設定も役立つことがよくあります。ヒントについては、$VIMRUNTIME/indent/README.txt ファイルを参照してください。例については、$VIMRUNTIME/indent ディレクトリを参照してください。
特定のインデントファイルに関する注意
Clojure のインデントは、角括弧や波括弧の使用、およびその他のコミュニティの慣例により、従来の Lisp とは多少異なります。これらの慣例は必ずしも普遍的に守られているわけではないため、Clojure インデントスクリプトにはいくつかの構成オプションが用意されています。
searchpairpos() の最大スキャン距離を設定します。値が大きいほど、非常に長い形式を扱う場合のパフォーマンスが低下しますが、正確性が向上します。値 0 は、制限なしにスキャンします。デフォルトは 300 です。
'lispwords' オプションは、サブフォームを 2 つのスペースでインデントする必要がある特殊形式をマークする、コンマ区切りの単語のリストです。
例:
(defn bad []
      "Incorrect indentation")
(defn good []
  "Correct indentation")
'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_patterns および g: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' に関係なく、すべてのサブフォームが 2 つのスペースのみでインデントされるようにインデントされます。この特異な方法でインデントする必要があるカスタム構文がある場合は、以下のデフォルトリストにシンボルを追加できます。
" 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.")
デフォルトでは、関数呼び出しのように見える括弧で囲まれた複合形式で、先頭のサブフォームが独自の行にある場合、後続のサブフォームは開始括弧を基準に2スペースインデントされます。
(foo
  bar
  baz)
このオプションを1に設定すると、この動作が変更され、すべてのサブフォームが同じ列に揃えられ、clojure-mode.elのデフォルトの動作をエミュレートします。
(foo
 bar
 baz)
ブロックif、select case、select type、select rank、where、forall、type、interface、associate、block、enum、critical、およびchange team構文はインデントされます。サブルーチン、関数、モジュール、およびプログラムブロックのインデントはオプションです。コメント、ラベル付きステートメント、および継続行は、Fortranが自由形式の場合にはインデントされますが、固定形式の場合には左マージンの要件があるためインデントされません。したがって、固定形式を使用している場合は、ラベル付きステートメントと継続行に対して手動でのインデント修正が必要になります。ソース形式の検出に使用される方法の詳細については、ft-fortran-syntaxを参照してください。
Doループ
デフォルトでは、すべてのdoループはインデントされません。Fortranでは、(場合によっては複数の)ループがほぼ任意のタイプのラベル付き実行可能ステートメントで終了する、構造化されていないdoループを使用できます。正しいインデントには、コンパイラ品質の解析が必要です。任意のタイプのラベル付きステートメントで終了する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ループはインデントされます。たとえば、.f90ファイルでのみすべてのループがdo/enddo型である場合は、次のようなautocommandでバッファフラグを設定する必要があります。
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> "blocktags" の後の最初の行のインデントを設定できます(デフォルトは"zero")。
:let g:html_indent_script1 = "inc"
:let g:html_indent_style1 = "inc"
値 意味
"zero" インデントなし "auto" 自動インデント(blocktagと同じインデント) "inc" 自動インデント + 1インデントステップ
開始<tag行の後の属性のインデントを設定できます。
:let g:html_indent_attribute = 1
値 意味
1 自動インデント、<tagよりも1インデントステップ多い 2 自動インデント、2インデントステップ(デフォルト) > 2 自動インデント、さらに多くのインデントステップ
多くのタグは、デフォルトで後に続くもののインデントを増やします(スクリプトの「インデントを追加するタグ」を参照)。次のタグを追加できます。
:let g:html_indent_inctags = "html,body,head,tbody"
次のタグを削除することもできます。
:let g:html_indent_autotags = "th,td,tr,tfoot,thead"
両方の変数のデフォルト値は空です。注:最初の「inctags」はVimセッションごとに1回だけ定義されます。
ユーザー変数は、スクリプトがソースされたときにのみ読み取られます。HTMLファイルをリロードせずにセッション中に変更を有効にするには、手動で次のことを実行できます。
:call HtmlIndent_CheckUserSettings()
詳細:「エイリアン」コンテンツを含む「blocktags」内のインデントの計算
BLOCKTAG インデント式 該当する場合
<script> : {カスタマイズ可能} ブロックの最初の行の場合 : cindent(v:lnum) 属性が空の場合または"java"を含む場合 : -1 それ以外の場合(vbscript、tclなど) <style> : {カスタマイズ可能} ブロックの最初の行の場合 : GetCSSIndent() それ以外の場合 <!-- --> : -1
MATLABエディター/デバッガー言語設定の「関数インデント形式」の設定は、以下に対応しています。
:let g:MATLAB_function_indent = {0, 1 or 2 (default)}
ここで、0はClassic、1はネストされた関数をインデント、2はすべての関数をインデントです。
注意: PHPファイルは、PHPの構文がアクティブな場合にのみ正しくインデントされます。
Unixの'fileformat'でファイルを編集していて、改行の前に「\r」文字が存在する場合、インデントは正しく進みません。まず、次のようなコマンドでそれらの不要な文字を削除する必要があります。
:%s /\r$//g
または、単に変数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レベル追加でインデントされます。2スペースのインデントの場合
function call_the_thing(
  $with_this,
  $and_that
) {
  $this->do_the_thing(
      $with_this,
      $and_that
  );
}
PHP_IndentFunctionDeclarationParameters
複数行の関数定義で引数に追加するインデントレベル。
let g:PHP_IndentFunctionDeclarationParameters = 1
宣言の関数引数は、1レベル追加でインデントされます。2スペースのインデントの場合
function call_the_thing(
    $with_this,
    $and_that
) {
  $this->do_the_thing(
    $with_this,
    $and_that
  );
}
インデントの量は、g:python_indentDictionaryで設定できます。これは項目を追加する前に作成する必要があります。
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のユーザーは、#が1つの行は40列目にインデントされ、##はRコードとしてインデントされ、###はインデントされないということを知っている場合があります。コメント文字で始まる行がEmacs/ESSで整列するように整列させたい場合は、vimrcに次のように記述します。
let r_indent_ess_comments = 1
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*$'に一致する行の後にインデントされます。異なるパターンに一致する行の後にインデントしたい場合は、vimrcr_indent_op_patternの適切な値を設定する必要があります。
シェルファイル内のさまざまな状況下で適用されるインデントの量は、Dictionary b:sh_indent_defaultsの次のキーを特定の量、または目的の量を返す関数を参照する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" と揃えられていないことに注意してください。
コメントのインデントは動的な性質を持つため、インデントは2回実行する必要があります。1回目のパスでは、コードがインデントされます。2回目のパスでは、正しくインデントされたコードに従って、行頭コメントがインデントされます。

VIM ft-vim-indent

g:vim_indent_cont
Vimスクリプトのインデントには、バックスラッシュで始まる継続行のインデント量を指定する変数が1つあります。
:let g:vim_indent_cont = shiftwidth() * 3
デフォルト値はshiftwidthの3倍です。
デフォルトでは、yamlインデントスクリプトは複数行のスカラーを検出しようとしません。これを有効にするには、次の変数を設定します。
let g:yaml_indent_multiline_scalar = 1
メイン
コマンドインデックス
クイックリファレンス