vim-jp / vimdoc-ja / indent

indent - Vim日本語ドキュメント

メインヘルプファイルに戻る English | 日本語 | 編集
indent.txt    For Vim バージョン 9.1.  Last change: 2024 Feb 29


                VIMリファレンスマニュアル    by Bram Moolenaar


このファイルにはCソースコードとその他のファイルのインデント(字下げ)について書
かれている。

1. Cスタイルのソースコードのインデント  C-indenting
2. スクリプトを用いたインデント         indent-expression

==============================================================================
1. Cソースコードのインデント                            C-indenting

C言語(以下、単に「C」)スタイルのソースコード用インデントの基本はユーザーマニュ
アルの30.2節で説明されている。

VimにはCスタイルの言語を自動的にインデントするためのオプションがある。Cスタイ
ルの言語とは、Java や C++ など、C によく似た書式の言語のことである。これらのオ
プションはインデントだけに影響し、その他の整形は行わない。その他の整形について
は、format-commentsfo-tablegqformatting を参照。

実際のところインデントには4つの主な方法がある。後のものが有効にされると、前の
ものより優先される('indentexpr' は空でない文字列がセットされたとき)。
'autoindent'    一つ前の行に基づくインデント
'smartindent'   'autoindent' と同様だが幾つかのC構文を認識し、適切な箇所のイン
                デントを増減させる。
'cindent'       他の2つの方法よりも賢く動作し、設定することで異なるインデント
                スタイルにも対応できる。
'indentexpr'    この中で一番融通が利く: ある行のインデントを計算するのにVim
                scriptを実行する。この方法が有効である(空でない)時にはその他
                のインデントは抑制される。indent-expression参照
この節の残りはオプション 'cindent' について述べる。

'cindent' はあらゆるCソースを正しくインデントできるわけではないことに注意。Vim
はCコンパイラではない: だから全ての構文は認識できない。1つの要求事項は、トップ
レベル関数が第1桁が '{' で始まっていることである。そうなっていないと宣言との区
別が困難である。

Cのインデントはこの5つのオプションで制御されている:
'cindent'       Cの自動インデントを有効化する。
'cinkeys'       再インデントの引金となる挿入モードでのキーを指定する。
'cinoptions'    好みのインデントスタイルを設定する。
'cinwords'      次の行から特別なインデントを開始するキーワードを定義する。
'cinscopedecls' C++ スコープ宣言として認識される文字列を定義する。

オプション 'lisp' がオフで 'equalprg' が空ならば、オペレータ "=" は外部プログ
ラムではなくVimの内蔵アルゴリズムを使用してインデントを行う。

Cのファイルに対して自動的に 'cindent' をオンにしてそれ以外のファイルに対しては
オフにする方法はautocommandを参照。
{訳注: バージョン6.0以降はファイル形式プラグイン(filetype参照)とバッファロー
       カルオプション(:setlocal)を使うことが推奨される。VimにはデフォルトでC
       用のファイル形式プラグイン($VIMRUNTIME/ftplug/c.vim)が付属しているから、
       これを行いたい時は単にファイル形式プラグインを有効化するだけで良い。}

                                        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をタイプした時 (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       '0' をキーの前 ('!' や '*' の後ということはあるが) に置くと、Vimはその
        キーが行の先頭で入力された時だけインデント再調整を行う。"=" の前に使わ
        れた時にはVimはその単語の前に空白文字しか無い時にだけ再調整が行われる。

'!' と '*' のいずれもキーの前に置かれていない時は、Vimはそのキーがタイプされた
時にインデント再調整を行う。だから ';' を含めれば ';' が入力された行のインデ
ントが調整される。

特別なキーの名称:
<>      折カッコは書き下されたキーの名前を意味する。例: "<Up>" や "<Ins>"
        (key-notation参照)。
^       キャレット(^)が前に置かれた文字はコントロール文字。例: "^F" はCTRL-F
o       "o" コマンドを使用した時もしくはVimが現在の行の下に新しい行を作成した
        時にインデント再調整をする(例えば、挿入モードで<Enter>をタイプした時)。
O       "O" コマンドを使用した時にインデント再調整をする。
e       "else" で始まる行の2つ目の 'e' をタイプした時にインデント再調整をする。
:       ラベルや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を押す度ではなくemacsのようにTabキーを押した時にだけインデントを行うよう
にするには、次の設定を提案する: >
        :set cinkeys=0{,0},:,0#,!<Tab>,!^F
その時には 'autoindent' もオフにしたほうが良いかもしれない。

NOTE: 現在の行のインデントを手動で変更すれば、Vimはその行についてはcindentの設
定を無視する。これによりインデントの中で<BS><Tab> や <Space>を入力したり、
CTRL-TCTRL-Dを使用してインデントを変更した後では、Vimはインデントの再調整を
行わなくなる。

                                                cinoptions-values
オプション 'cinoptions' ではVimがどのようなインデントを行うのかを設定する。オ
プション文字の後ろは次のような形式で指定できる (N は任意の数字):
        N       N スペースインデント
        -N      N スペースインデント (左方向に)
        Ns      'shiftwidth' の N 倍のスペース
        -Ns     'shiftwidth' の N 倍のスペース (左方向に)

以下のリストでは、"N" は指定したい数値を意味する(数値は負でも良い)。数値のあと
に 's' がある時には、数値に 'shiftwidth' の数を掛算して使用する: "1s" は
'shiftwidth' に等しく、"2s" は 'shiftwidth' の2倍になり、以下同様。

小数を使うこともできる: "-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    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ラベル後の文の替わりに、caseラベルそ
              のものを基本にして配置を行う。
              (省略値 0)

                cino=                       cino=l1 >
                    switch (a) {              switch (a) {
                        case 1: {                 case 1: {
                                    break;            break;
                                }                 }
<
                                                        cino-b
        bN    N が 0 でなければ、末尾の "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++の基底クラスの宣言やコンストラクタが新しい行で始まる時に 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 が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 文字イ
              ンデントする。インデント量は 1 つの丸カッコの追加につき
              '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 が 0 ではない時には、閉じていない丸カッコが行頭にある場合でも
              ( や u で指定したインデントを無視しない。
              (省略値 0)

                cino= or 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" のどち
              らかが使われていて閉じていない開き丸カッコが行末にある時、続く行
              を最初の行から相対的にインデントする。
              (省略値 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" の条件のみに働く。N が 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)。

                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' は今のところ使用されていないが非ゼロを指定する必
              要がある (例: '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言語のプラグマを認識し、他のコードと同様の
              インデントにする。他のプリプロセッサディレクティブには関心を持た
              ない。
              N がゼロのとき (初期設定): 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' を含み行が '#' (プリプロセッサー命令)で始まる場合
- 行がラベル ("case" と "default" 以外のキーワードの後に ':' があるもの) で始
  まり、'cinoptions' に正数を持った 'L' フラグがない場合。
- インデントの組合わせの結果、その行のインデント量が0以下になった場合。

==============================================================================
2. スクリプトを用いたインデント                         indent-expression

融通の利くインデントの基本はユーザーマニュアルの30.3節で説明されている。

独自にインデントファイルを書きたいならば、オプション 'indentexpr' を設定しなけ
ればならない。同時にオプション 'indentkeys' を設定すると便利だろう。
ヒントは $VIMRUNTIME/indent/README.txt ファイルを参照。
例は $VIMRUNTIME/indent ディレクトリを参照。


インデントファイルについての覚書 ~


CLOJURE                                 ft-clojure-indent clojure-indent

Clojure のインデントは伝統的な Lisp とは若干異なる。それは角カッコや波カッコの
扱いや、コミュニティの習慣などによる。それらの習慣は普遍的ではないので、
Clojure のインデントスクリプトは設定のオプションを用意している。

(使用している Vim に searchpairpos() がない場合は通常の 'lisp' インデントに
フォールバックする。その場合、以下のオプションは無視される。)

                                                        g:clojure_maxlines

`searchpairpos()` による検索の最大範囲を設定する。大きな値を指定すれば、フォー
ムが長い場合に、パフォーマンスと引き換えに正しい結果を得ることができる。0 を指
定すると制限なしになる。デフォルトは300。


                                                g:clojure_fuzzy_indent
                                        g:clojure_fuzzy_indent_patterns
                                        g:clojure_fuzzy_indent_blacklist

'lispwords' オプションはコンマ区切りの単語のリストで、サブフォームをスペース 2
個でインデントする必要のある特別なフォームを指定する。

例:
>
        (defn bad []
              "Incorrect indentation")

        (defn good []
          "Correct indentation")
<
'lispwords' をパターン (pattern) で指定したい場合は、ファジーインデント機能
が使える:
>
        " 初期設定
        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 はパ
ターンのリストで、unquoted symbol や unqualified symbol に対してマッチする。つ
まり、`"^foo"` というパターンは、`foobar`, `my.ns/foobar`, `#'foobar` などに
マッチする。


各単語は次の順番で検査される:

        1. 単語が 'lispwords' に含まれていたら真を返す
        2. 単語が g:clojure_fuzzy_indent_blacklist にマッチしたら偽を返す
        3. 単語が g:clojure_fuzzy_indent_patterns にマッチしたら真を返す
        4. それ以外は、偽を返し、通常どおりにインデントする


                                        g:clojure_special_indent_words

Clojure のいくつかのフォームは、'lispwords' に依らず、すべてのサブフォームはス
ペース2個のみでインデントされる。そのような特異なインデントで扱いたい構造が他に
もある場合は、そのシンボルを次の初期値リストに加えること。
>
        " 初期設定
        let g:clojure_special_indent_words =
           \ 'deftype,defrecord,reify,proxy,extend-type,extend-protocol,letfn'
<

                                        g:clojure_align_multiline_strings

複数行文字列を、クォート文字と同じ列で揃えるのではなく、クォート文字の一つ後ろ
の列で整列させる。

例:
>
        (def 初期設定
          "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 整列する場合
          "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.")
<

                                                g:clojure_align_subforms

初期設定では、括弧で囲まれた関数呼び出しのような形でその最初の subform が括弧
と同じ行にあるとき、そのうしろの subform は最初の括弧からスペース 2 つ分インデ
ントされる:
>
        (foo
          bar
          baz)
<
このオプションを `1` に設定すると、clojure-mode.el のデフォルトの振る舞いのよ
うに、すべての subform を同じカラムに揃えることができる:
>
        (foo
         bar
         baz)
<
FORTRAN                                                 ft-fortran-indent

ブロック if、select case、select type、select Rank、where、forall、type、
interface、associate、block、enum、critical、および change team 構造はインデン
トされる。サブルーチン、関数、モジュール、プログラムブロックのインデントは任
意。コメント、ラベル付き文、そして 2 行にまたがった行は、Fortran が自由形式の
ソースではインデントされるが、一方 Fortran が固定形式ソースの場合には左余白が
言語仕様により決定されているのでインデントされない。それ故に固定形式ソースを
使っている時にはラベル付き文と2行にまたがった行については手動でインデントを修
正する必要がある。ソース形式の判定に使われている方法についてのさらなる議論は
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_enddoi 変数を設定
してそのことを宣言するべきである:
>
   let fortran_do_enddo=1

このようにすれば do ループはインデントされる。例えば拡張子が .f90 であるファイ
ルの中にある全てのループが do/enddo タイプだけならば、このような自動コマンドを
使ってのバッファフラグを設定することができる: >

  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"     自動インデント + 1つ分インデント増加

開いている <tag の後の行のインデント値を設定できる: >

      :let g:html_indent_attribute = 1
<
      値        意味 ~
      1         自動インデント、<tag よりも 1つ分インデント増加
      2         自動インデント、2つ分インデント増加(デフォルト)
      > 2       自動インデント、数値分のインデント増加

初期設定では多くのタグで、続くタグのインデントが増加される (このスクリプトの
"Add Indent Tags" 参照)。そのように扱うタグを追加するには: >

      :let g:html_indent_inctags = "html,body,head,tbody"

対象から除外するには: >

      :let g:html_indent_autotags = "th,td,tr,tfoot,thead"

これらの変数の初期設定は空である。NOTE: "inctags" は Vim の編集セッションごと
に一度だけ初期化される。

ユーザー変数はスクリプトが実行されたときだけ読まれる。編集中に HTML ファイルを
再読み込みすることなしに設定変更を反映したい場合は、手動で次のようにする: >

      :call HtmlIndent_CheckUserSettings()

詳細:
  異質な内容を含むブロックタグ内のインデントの計算:
      BLOCKTAG   インデント式       適用できるとき ~
      <script> : {カスタマイズ可}   ブロックの最初の行
               : cindent(v:lnum)    属性が空または "java" を含むとき
               : -1                 その他 (vbscript, tcl, ...)
      <style>  : {カスタマイズ可}   ブロックの最初の号
               : GetCSSIndent()     その他
      <!-- --> : -1


MATLAB                 ft-matlab-indent matlab-indent matlab-indenting

MATLAB エディタ/デバッガの言語設定における関数のインデント書式の設定。以下に対
応する: >
    :let g:MATLAB_function_indent = {0, 1 or 2 (default)}

0 の場合はクラシック、1 は入れ子関数のインデント、2 はすべての関数のインデント
である。


PHP                             ft-php-indent php-indent php-indenting

NOTE:   syntax がオンのときのみ PHP のファイルは正しくインデントされる。

'fileformat' を "unix" にしている場合、文字 '\r' が改行の前にあると、インデ
ントは正しく行われない。これらの不要な文字を削除するには次のコマンドを使う: >

    :%s /\r$//g

または :let コマンドを使って変数 PHP_removeCRwhenUnix に 1 をセットすると、
PHP ファイルを読み込んだとき、BufRead のタイミングで自動的にこれらが削除され
る(そのとき特にメッセージは表示されない)。

オプション: ~

下記のグローバル変数をセットすることで、PHP のインデントをカスタマイズできる。

                                        php-comment PHP_autoformatcomment
デフォルトでは有効になっているコメントの自動整形を無効化するには
('formatoptions' に従うようにするには)次のようにする: >
    :let g:PHP_autoformatcomment = 0

これをしない場合、'formatoptions' から 't' が除かれ、"qrowcb" が加えられる。
詳しくは fo-table を参照。
-------------

                                                        PHP_outdentSLComments
一行コメントに追加のインデントを加える: >
    :let g:PHP_outdentSLComments = N

N は 'shiftwidth' に追加される値。

次のような一行コメントのみ影響する: >
    # Comment
    // Comment
    /* Comment */
-------------

                                                        PHP_default_indenting
すべての PHP の行に対しインデントを増やすには、次のようにする: >
    :let g:PHP_default_indenting = N

ここで N は整数。N 個の 'shiftwidth' 分のインデントが追加される。例として
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 タグよりコードの方が 1 段階多くインデントされている)
-------------

                                                        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();
    }

NOTE:   このオプションをオンにすると、最適化の一部が効かなくなるため、インデ
        ントが少し遅くなる。
-------------

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


PYTHON                                                  ft-python-indent

インデントの量は `g:python_indentDictionary で設定できる。これは項目を追加
する前に作成する必要がある: >
        let g:python_indent = {}
示されている例はデフォルトである。Note 辞書の値は式に設定されているので、これ
らの値を更新しなくても後で '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*$'` に一致する行の
後にインデントされる。別のパターンと一致する行の後ろに字下げをしたい場合は、
vimrc で `r_indent_op_pattern` の値を適切に設定する必要がある。


SHELL                                                   ft-sh-indent

シェルファイルの様々な状況に適用されるインデント量を調整するには、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のbreakに対して追加(あるいは削減)されるイ
                                ンデント量。

VERILOG                                                 ft-verilog-indent

一般的なブロック文であるif, for, case, always, initial, function, specify, そ
してbegin等などはインデントされる。moduleブロック文(最初のレベルのブロック)は
デフォルトではインデントされない。次のように.vimrcで以下の変数を設定するとその
インデントを有効化できる: >

  let b:verilog_indent_modules = 1

これによりmoduleブロックがインデントされる。これをやめるには変数を削除すれば良
い: >

  :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

さらに、デバッグ目的でverboseモードを有効化できる: >

  let b:verilog_indent_verbose = 1

メッセージを表示できるようにするために、先に ":set cmdheight=2" を実行すること
を確認すること。


VHDL                                                    ft-vhdl-indent

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;

これをオフにするには、次を .vimrc に加える >

  let g:vhdl_indent_genportmap = 0

すると、先ほどの例が次のように変わる: >

  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);

これをオフにするには次を ~/.vimrc に加える。 >

  let g:vhdl_indent_rhsassign = 0

すると先ほどの例が次のように変わる: >

  sig_out <= (bus_a(1) AND
    (sig_b OR sig_c)) OR
    (bus_a(0) AND sig_d);

----------------------------------------

"-- " で始まるコメント行は、1 行前のコメント行と同じインデントになる。
"--" の後にスペースがついていなければならないことに注意。

例: >

  sig_a <= sig_b; -- start of a comment
                  -- continuation of the comment
                  -- more of the same comment

挿入モードでは、"-- " (スペース " " に注意) をタイプしたあと、CTRL-F を押すと
現在行の "-- " を前の行の "--" に揃えることができる。

1 行前が "--" を含んでいない場合、その行は下方の「空行でもコメントでもない行」
と同じインデントになる。

以下のコードをインデントすると: >

  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
Vim script のインデントは `g:vim_indent` 辞書変数で設定できる。
`line_continuation`、`more_in_bracket_block`、`searchpair_timeout` の 3 つの
キーをサポートしている。
`line_continuation` はバックスラッシュで始まる継続行のインデントレベルに追加さ
れる数値を期待し、デフォルトは `shiftwidth() * 3` である。また、文字列も受け取
ることができ、これは実行時に評価される。
`more_in_bracket_block` には真偽値を指定する。オンにすると、大括弧で囲まれたブ
ロックの中にさらに `shiftwidth()` が追加される。デフォルトは `v:false` である。
`searchpair_timeout` はタイムアウトとして `searchpair()` に渡される数値を指定
する。この値を大きくすると、より正確な結果が得られるかもしれないが、インデント
に時間がかかるようになる。デフォルトは100 (ミリ秒) である。

構成例: >

        let g:vim_indent = #{
            \ line_continuation: shiftwidth() * 3,
            \ more_in_bracket_block: v:false,
            \ searchpair_timeout: 100,
            \ }
<
                                                        g:vim_indent_cont
この変数は `g:vim_indent.line_continuation` と等価である。
後方互換性のためにサポートされている。

YAML                                                    ft-yaml-indent

デフォルトでは、yaml のインデントスクリプトは複数行のスカラーの検出を行おうと
しない。もしこれを有効化したい場合は、以下の変数を設定すること: >

  let g:yaml_indent_multiline_scalar = 1

 vim:tw=78:ts=8:noet:ft=help:norl: