*indent.txt* For Vim バージョン 8.1. Last change: 2019 Aug 01 VIMリファレンスマニュアル by Bram Moolenaar
このファイルには C ソースコードとその他のファイルのインデント (字下げ) について書かれてゐる。
1. C スタイルのソースコードのインデント | |C-indenting| |
2. スクリプトを用いたインデント | |indent-expression| |
C 言語 (以下、單に「C」) スタイルのソースコード用インデントの基本はユーザーマニュアルの |30.2| 節で說明されてゐる。
Vim には C スタイルの言語を自動的にインデントするためのオプションがある。C スタイルの言語とは、Java や C++ など、C によく似た書式の言語のことである。これらのオプションはインデントだけに影響し、その他の整形は行はない。その他の整形については、|format-comments|, |fo-table|, |gq|, |formatting| を參照。
コンパイル時に |+smartindent| か |+cindent| 機能を無效にした時には、これが動作しないことに注意。
實際のところインデントには 4 つの主な方法がある。後のものが有效にされると、前のものより優先される (’indentexpr’ は空でない文字列がセットされたとき)。
’autoindent’ | 1 つ前の行に基づくインデント |
’smartindent’ | ’autoindent’ と同樣だが幾つかの C 構文を認識し、適切な箇所のインデントを增減させる。 |
’cindent’ | 他の 2 つの方法よりも賢く動作し、設定することで異なるインデントスタイルにも對應できる。 |
’indentexpr’ | この中で一番融通が利く: ある行のインデントを計算するのに Vim script を實行する。この方法が有效である (空でない) 時にはその他のインデントは抑制される。|indent-expression| 參照。 |
この節の殘りはオプション ’cindent’ について述べる。
’cindent’ はあらゆる C ソースを正しくインデントできるわけではないことに注意。Vim は C コンパイラではない: だから全ての構文は認識できない。1 つの要求事項は、トップレベル函數が第 1 桁が ’{’ で始まつてゐることである。さうなつてゐないと宣言との區別が困難である。
C のインデントはこの 4 つのオプションで制禦されてゐる:
’cindent’ | C の自動インデントを有效化する。 |
’cinkeys’ | 再インデントの引金となる插入モードでのキーを指定する。 |
’cinoptions’ | 好みのインデントスタイルを設定する。 |
’cinwords’ | 次の行から特別なインデントを開始するキーワードを定義する。 |
オプション ’lisp’ がオフで ’equalprg’ が空ならば、オペレータ "=" は外部プログラムではなく Vim の內藏アルゴリズムを使用してインデントを行ふ。
C のファイルに對して自動的に ’cindent’ をオンにしてそれ以外のファイルに對してはオフにする方法は |autocommand| を參照。
{譯注: バージョン 6.0 以降はファイル形式プラグイン (|filetype| 參照) とバッファローカルオプション (|:setlocal|) を使ふことが推奬される。Vim にはデフォルトで C 用のファイル形式プラグイン ($VIMRUNTIME/ftplug/c.vim) が附屬してゐるから、これを行ひたい時は單にファイル形式プラグインを有效化するだけで良い。}
オプション ’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’ をタイプした時 |
各キーの前に置くことのできる文字は次の通り:
’!’ をキーの前に置くと、Vim はそのキーを插入するのではなく替はりに現在の行のインデントを再調整する。これにより現在の行の再調整するためのコマンドキーを定義することができる。CTRL-F はそのデフォルトキーである。CTRL-I は <Tab> の ASCII コードだから、CTRL-I を定義する際に氣をつけること。
’*’ をキーの前に置くと、Vim はインデント再調整を行つてからそのキーを插入する。’cinkeys’ に "*<Return>" が含まれてゐる時には、Vim は新しい行を作成する前に現在行のインデントを再調整する。
’0’ をキーの前 (’!’ や ’*’ の後といふことはあるが) に置くと、Vim はそのキーが行の先頭で入力された時だけインデント再調整を行ふ。"=" の前に使はれた時には Vim はその單語の前に空白文字しか無い時にだけ再調整が行はれる。
’!’ と ’*’ のいづれもキーの前に置かれてゐない時は、Vim はそのキーがタイプされた時にインデント再調整を行ふ。だから ’;’ を含めれば ’;’ が入力された行のインデントが調整される。
特別なキーの名稱:
折カッコは書き下されたキーの名前を意味する。例: "<Up>" や "<Ins>" (|key-notation| 參照)。
キャレット (^) が前に置かれた文字はコントロール文字。例: "^F" は CTRL-F
"o" コマンドを使用した時もしくは Vim が現在の行の下に新しい行を作成した時にインデント再調整をする (例へば、插入モードで <Enter>
をタイプした時)。
"O" コマンドを使用した時にインデント再調整をする。
"else" で始まる行の 2 つ目の ’e’ をタイプした時にインデント再調整をする。
ラベルや case 文の後に ’:’ をタイプした時にインデント再調整をする。C++ の "class::method" 內の ":" では再調整しない。どんな ":" でもインデントするには "<:>" を使用する。
"word" の最後の文字をタイプした時にインデント再調整をする。"word" は實際は別の單語の一部かもしれない。"=end" のやうに設定すれば "endif" や "endwhile" の "d" をタイプした時に再調整が起こる。しかし "bend" では起こらない。補完により "word" で始まる單語が提示された時にも再調整は起こる。"0=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-T や CTRL-D を使用してインデントを變更した後では、Vim はインデントの再調整を行はなくなる。
オプション ’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 と想定してゐる。
通常のインデントで追加される量。インデントを增やすべき行 (if で始まる行や、開き波カッコ等)の直後で使用される。(既定値 ’shiftwidth’)
cino= cino=>2 cino=>2s if (cond) if (cond) if (cond) { { { foo; foo; foo; } } }
開き波カッコが行末にある (正確には行頭ではない) 時に、カッコ內のインデントを通常よりも N 追加する。’{’ が行頭ある場合と行末にある場合とでインデント量を變更したい時に便利。(既定値 0)
cino= cino=e2 cino=e-2 if (cond) { if (cond) { if (cond) { foo; foo; foo; } } } else else else { { { bar; bar; bar; } } }
"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; } } }
函數やその他のブロックを示す開き波カッコを N 列目に配置する。これは他の波カッコの內側ではなく、かつ行頭である開き波カッコだけに適用される。波カッコの後の續くものはこの波カッコと相對的な位置に配置される。(既定値 0)
cino= cino=f.5s cino=f1s func() func() func() { { { int foo; int foo; int foo;
開き波カッコを現行のインデントから N の位置に配置する。これは他の波カッコの內側にある開き波カッコにのみ適用される。(既定値 0)
cino= cino={.5s cino={1s if (cond) if (cond) if (cond) { { { foo; foo; foo;
閉ぢ波カッコを對應する開き波カッコから N の位置に配置する。(既定値 0)
cino= cino={2,}-0.5s cino=}2 if (cond) if (cond) if (cond) { { { foo; foo; foo; } } }
開き波カッコが 0 列目にある波カッコセットの內側のインデントを現行よりも N 追加する。これにより函數全體には異なるインデント量を指定することができる。(既定値 0)
cino= cino=^-2 cino=^-s func() func() func() { { { if (cond) if (cond) if (cond) { { { a = b; a = b; a = b; } } } } } }
ジャンプラベルの位置を制禦する。N が負數ならラベルは 1 列目に置かれる。N が正數ならラベルはインデントから N を引いた位置に置かれる。(既定値 -1)。
cino= cino=L2 cino=Ls func() func() func() { { { { { { stmt; stmt; stmt; LABEL: LABEL: LABEL: } } } } } }
case ラベルを switch() のインデントから N の位置に配置する。(既定値 ’shiftwidth’)
cino= cino=:0 switch (x) switch(x) { { case 1: case 1: a = b; a = b; default: default: } }
case ラベル後に現れる文をラベルのインデントから N の位置に配置する。(既定値 ’shiftwidth’)
cino= cino==10 > case 11: case 11: a = a + 1; a = a + 1; b = b + 1;
N が 0 でなければ Vim は case ラベル後の文の替はりに、case ラベルそのものを基本にして配置を行ふ。(既定値 0)
cino= cino=l1 switch (a) { switch (a) { case 1: { case 1: { break; break; } }
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; } }
C++ のスコープ宣言をそれが含まれるブロックのインデントから N の位置へ配置する。"public:", "protected:", "private:" がスコープ宣言になり得る。(既定値 ’shiftwidth’)
cino= cino=g0 { { public: public: a = b; a = b; private: private: } }
C++ スコープ宣言後に現れる文をそのラベルのインデントから N の位置に配置する。(既定値 ’shiftwidth’)
cino= cino=h10 public: public: a = a + 1; a = a + 1; b = b + 1;
C++ ネームスペースの中を通常のブロックに加へて N 文字インデントする。(既定値 0)。
cino= cino=N-s namespace { namespace { void function(); void function(); } } namespace my namespace my { { void function(); void function(); } }
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(); } }
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;
函數の戾り型の宣言を N 文字インデントする。(既定値 ’shiftwidth’)
cino= cino=t0 cino=t7 int int int func() func() func()
C++ の基底クラスの宣言やコンストラクタが新しい行で始まる時に N 文字インデントする (さうでない時には右端の ’:’ を基準にする)。(既定値 ’shiftwidth’)
cino= cino=i0 class MyClass : class MyClass : public BaseClass public BaseClass {} {} MyClass::MyClass() : MyClass::MyClass() : BaseClass(3) BaseClass(3) {} {}
函數の內側の繼續行 (次の行へと分割された行) を N 文字分インデントする。(既定値 ’shiftwidth’)
函數の外側では、直前の行の末尾にバックスラッシュがあるときは 2 * N が使はれる。
cino= cino=+10 a = b + 9 * a = b + 9 * c; c;
コメント開始子の後のコメント本文を、配置すべきその他のテキストが無ければ、コメント開始子から N 文字でインデントする。(既定値 3) |format-comments| も參照。
cino= cino=c5 /* /* text. text. */ */
N が 0 でなければ、コメント開始子の後に他のテキストがある場合でも、コメントの行に c フラグで指定した量でインデントがされる。(既定値 0)
cino=c0 cino=c0,C1 /******** /******** text. text. ********/ ********/
(":set comments& comments-=s1:/* comments^=s0:/*" を同時に設定)
コメント行を N 文字インデントする。(既定値 0)
cino= cino=/4 a = b; a = b; /* comment */ /* comment */ c = d; c = d;
閉ぢてゐない丸カッコ內では開き丸カッコのあるラインより 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)) { {
(N と同じだが、一段階內側にネストしてゐる丸カッコについての設定。(既定値 ’shiftwidth’)
cino= cino=u2 if (c123456789 if (c123456789 && (c22345 && (c22345 || c3)) || c3))
N が 0 ではない時には、閉ぢてゐない丸カッコが行頭にある場合でも ( や u で指定したインデントを無視しない。(既定値 0)
cino= or cino=(s cino=(s,U1 c = c1 && c = c1 && ( ( c2 || c2 || c3 c3 ) && c4; ) && c4;
N が 0 ではなければ次に示すやうな場合の、閉ぢてゐない丸カッコ後の非空白文字ではなく、カッコ直後の位置がインデントに使用される:
(既定値 0)
cino=(0 cino=(0,w1 if ( c1 if ( c1 && ( c2 && ( c2 || c3)) || c3)) foo; foo;
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);
"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);
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;
N が非ゼロのとき、閉ぢ括弧で始まる行のインデントを前の行の最初の文字と同じ位置にする (既定値 0)。
cino= cino=M1 if (cond1 && if (cond1 && cond2 cond2 ) )
Java の無名クラスを正しくインデントする。JavaScript に對しても機能する。値 ’N’ は現在のところ使はれてゐないが 0 以外 (例 ’j1’) にしなければならない。’j1’ にすることで例へば次のやうなコードが正しくインデントされる:
object.add(new ChangeListener() { public void stateChanged(ChangeEvent e) { do_something(); } });
JavaScript のオブジェクト定義を (ラベルと混同せずに) 適切にインデントする。’N’ は今のところ使用されてゐないが非ゼロを指定する必要がある (例: ’J1’)。このオプションを有效にした場合、もしかしたら |cino-j| もセットしたはうがいいかもしれない。
var bar = { foo: { that: this, some: ok, }, "bar":{ a : 2, b: "123abc", x: 4, "y": 5 } }
Vim は N 行まで遡つて閉ぢてゐないカッコを探す。これはカッコを探すのにかかる時閒を制限する。(既定値 20)
Vim は N 行まで遡つて閉ぢられてゐないコメントを探す。これはコメントの始まりを探すのにかかる時閒を制限する。N 行以降で /* */ コメントがインデントされない、といふときはこのオプションを設定すること。(既定値 70行)
N がゼロでないときは ’#’ で始まる shell/Perl のコメントを認識する。プリプロセッサー行は認識されない。"#" で始まる行を右シフトできるやうになる。
N がゼロのとき (初期設定): ’#’ コメントを認識しない。プリプロセッサー行は認識される。"#" で始まる行に對する右シフトは機能しない。
既定値を全て竝べるとかうなる:
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
次のやうな場合には Vim は行頭を 1 列目に持つていく:
融通の利くインデントの基本はユーザーマニュアルの |30.3| 節で說明されてゐる。
獨自にインデントファイルを書きたいならば、オプション ’indentexpr’ を設定しなければならない。同時にオプション ’indentkeys’ を設定すると便利だらう。
インデントファイルのヒントは $VIMRUNTIME/indent/README.txt ファイルを參照。インデントファイルの例は $VIMRUNTIME/indent ディレクトリを參照。
Clojure のインデントは傳統的な Lisp とは若干異なる。それは角カッコや波カッコの扱ひや、コミュニティの習慣などによる。それらの習慣は普遍的ではないので、Clojure のインデントスクリプトは以下に擧げる設定可能オプションを用意してゐる。
使用してゐる vim に |searchpairpos()| がない場合は通常の ’lisp’ インデントにフォールバックする。その場合、以下のオプションは無視される。
|searchpairpos()| による檢索の最大範圍を設定する。大きな値を指定すれば、フォームが長い場合に、パフォーマンスと引き換へに正しい結果を得ることができる。0 を指定すると制限なしになる。
" Default let g:clojure_maxlines = 100
’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)$'] " 古い設定方法。文字列をコンマ區切りで指定する。現在は上記のリストによ " る設定が推奬される。Note: パターンは暗默的に ^ と $ で固定される。 let g:clojure_fuzzy_indent_patterns = 'with.*,def.*,let.*'
|g:clojure_fuzzy_indent_patterns| と |g:clojure_fuzzy_indent_blacklist| はパターンのリストで、unquoted symbol や unqualified symbol に對してマッチする。つまり、"^foo" といふパターンは、"foobar", "my.ns/foobar", "#’foobar" などにマッチする。
各單語は次の順番で檢査される:
Clojure のいくつかのフォームは、’lispwords’ に依らず、すべてのサブフォームがスペース 2 個でインデントされる。そのやうな特異なインデントで扱ひたい構造が他にもある場合は、そのシンボルを次の初期値に加へること。
" 初期設定 let g:clojure_special_indent_words = \ 'deftype,defrecord,reify,proxy,extend-type,extend-protocol,letfn'
複數行文字列を、クォート文字と同じ列で揃へるのではなく、クォート文字の 1 つ後ろの列で整列させる。
例:
(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.")
このオプションは初期設定でオフになつてゐる。
" 初期設定 let g:clojure_align_multiline_strings = 0
初期設定では、括弧で圍まれた函數呼び出しのやうな形でその最初の subform が括弧と同じ行にあるとき、そのうしろの subform は最初の括弧からスペース 2 つ分インデントされる:
(foo bar baz)
このオプションを設定すると、clojure-mode.el のデフォルトの振る舞ひのやうに、すべての subform を同じカラムに揃へることができる:
(foo bar baz)
このオプションは初期設定ではオフになつてゐる。
" 初期設定 let g:clojure_align_subforms = 0
Block if, select case, where, forall 構造がインデントされる。さらに type, interface, associate, block, enum 構造も。サブルーチン、函數、モジュール、プログラムブロックのインデントは任意。
コメント、ラベル付き文、そして 2 行にまたがつた行は、Fortran が自由形式のソースではインデントされるが、一方 Fortran が固定形式ソースの場合には左餘白が言語仕樣により決定されてゐるのでインデントされない。それ故に固定形式ソースを使つてゐる時にはラベル付き文と 2 行にまたがつた行については手動でインデントを修正する必要がある。
ソース形式の判定に使はれてゐる方法についてのさらなる議論は |ft-fortran-syntax| を參照のこと。
Do ループ
デフォルトでは全ての do ループはインデントされない。Fortran では、ループはラベル付けされたほとんど任意の型の實行可能な文で (場合によつては多重に) 終はるので、do ループは非構造的になる。これを正しくインデントするにはコンパイラ級の構文解析が必要になる。任意の型の實行可能文で終はる do ループを持つてゐたとしても、古いコードであれば Tidy (http://www.unb.ca/chem/ajit/f_tidy.htm) のやうに念入りに作られたプログラムでインデントすることはできる。
構造化 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 ファイルでプログラム單位のインデントを無效化するにはグローバル變數の fortran_indent_less を .vimrc で設定する。
let fortran_indent_less=1
バッファ單位で無效化したい場合はバッファローカル變數を設定する。
let b:fortran_indent_less=1
これらの變數を vimrc で設定することで HTML のインデントをカスタマイズできる。
<script> と <style> の最初の行のインデントを設定できる (初期設定は "zero"):
:let g:html_indent_script1 = "inc" :let g:html_indent_style1 = "inc"
値 | 意味 |
---|---|
"zero" | ゼロインデント |
"auto" | 自動インデント (ブロックタグのインデントと同じ) |
"inc" | 自動インデント + 1 インデント增加 |
初期設定では多くのタグで、續くタグのインデントが增加される (このスクリプトの "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 |
Note:
|syntax| がオンのときのみ PHP のファイルは正しくインデントされる。
’fileformat’ を "unix" にしてゐる場合、文字 ’\r’ が改行の前にあると、インデントは正しく行はれない。これらの不要な文字を削除するには次のコマンドを使ふ:
:%s /\r$//g
または |:let| コマンドを使つて變數 PHP_removeCRwhenUnix に 1 をセットすると、PHP ファイルを讀み込んだとき、|BufRead| のタイミングで自動的にこれらが削除される (そのとき特にメッセージは表示されない)。
オプション:
下記のグローバル變數をセットすることで、PHP のインデントをカスタマイズできる。
デフォルトでは有效になつてゐるコメントの自動整形を無效化するには (’formatoptions’ に從ふやうにするには)次のやうにする:
:let g:PHP_autoformatcomment = 0
これをしない場合、’formatoptions’ から ’t’ が除かれ、"qrowcb" が加へられる。詳しくは |fo-table| を參照。
一行コメントに追加のインデントを加へる:
:let g:PHP_outdentSLComments = N
N は ’shiftwidth’ に追加される値。
次のやうな一行コメントのみ影響する:
# Comment // Comment /* Comment */
すべての 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 エスケープタグを圍まれてゐる PHP ではないコードとしてインデントする (PHP エスケープタグにのみ影響):
:let g:PHP_outdentphpescape = 0
’fileformat’ を "unix" にしてゐるとき、自動的に ’\r’ を削除するには次のやうにする:
:let g:PHP_removeCRwhenUnix = 1
波カッコ {} をその內側と同じインデントレベルにするには:
:let g:PHP_BracesAtCodeLevel = 1
すると、次のやうになる:
if ($foo) { foo(); }
デフォルトの場合:
if ($foo) { foo(); }
Note:
このオプションをオンにすると、最適化の一部が效かなくなるため、インデントが少し遲くなる。
switch() ブロック內の ’case:’ と ’default:’ をインデントさせるには:
:let g:PHP_vintage_case_default_indent = 1
PHP では ’case/default’ ブロックの中で波カッコは不要なので、餘計なインデントを避けるため、’case:’ と ’default:’ は ’switch()’ と同じレベルにインデントされる。上記のオプションを使ふことで古いインデント形式を使ふことができる。 デフォルトでは、インデントスクリプトは複數行にまたがつた函數呼び出しを ’->’ の位置に合はせてインデントする:
$user_name_very_long->name() ->age() ->info();
このオプションを 1 に設定することによつて、從來のインデント方法に戾すことができる:
:let g:PHP_noArrowMatching = 1
以下の結果を得る:
$user_name_very_long->name() ->age() ->info();
————-
複數行の函數呼び出しでパラメーターに追加する追加のインデントレベル。
let g:PHP_IndentFunctionCallParameters = 1
函數呼び出し引數は 1 レベル餘分にインデントします。2 スペースのインデントの場合:
function call_the_thing( $with_this, $and_that ) { $this->do_the_thing( $with_this, $and_that ); }
————-
複數行の函數定義の引數に追加する追加のインデントレベル。
let g:PHP_IndentFunctionDeclarationParameters = 1
宣言內の函數引數は 1 レベル餘分にインデントします。2 スペースのインデントの場合:
function call_the_thing( $with_this, $and_that ) { $this->do_the_thing( $with_this, $and_that ); }
以下の狀況のためにインデントの量を設定することができる。この例は既定である。後で ’shiftwidth’ の値を變更するために變數に式を設定しておく。
開き括弧の後のインデント:
let g:pyindent_open_paren = 'shiftwidth() * 2'
ネストした括弧の後のインデント:
let g:pyindent_nested_paren = 'shiftwidth()'
繼續行のインデント:
let g:pyindent_continue = 'shiftwidth() * 2'
この方法は 閉ぢられてゐない丸括弧を探すために |searchpair()| を使ふ。これはときどき遲くなるため、150 ミリ秒後にタイムアウトする。もしもあなたがインデントが正しくないと氣づいたなら、タイムアウトの時閒をミリ秒單位で長く設定することができる:
let g:pyindent_searchpair_timeout = 500
閉ぢ括弧を遡つて振り返るのがまだ遲すぎる場合、特にコピー&ペースト操作の閒、あるいは複數行の括弧の內側をインデントする必要がない場合は、この機能を完全に無效にすることができる:
let g:pyindent_disable_parentheses_indenting = 1
函數の引數が複數行にまたがる場合はそれらは整列される。函數の引數を整列させたくない場合は |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‘ に適切な値を設定するべきです。
シェルファイルの樣々な狀況に適用されるインデント量を調整するには、|Dictionary| b:sh_indent_defaults の以下のキーを設定するか、またはインデント量を計算して返す函數への參照 |Funcref| を用ゐる。
インデント量の既定値。
繼續行に對して追加されるインデント量。(實際には實裝されてゐない)
case のラベルに對して追加されるインデント量。
case の文に對して追加されるインデント量。
case の break に對して追加 (あるいは削減) されるインデント量。
一般的なブロック文である 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" を實行することを確認すること。
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 script に對しては繼續行 (バックスラッシュで始まる行) のインデント量を指定する變數が 1 つある:
:let g:vim_indent_cont = shiftwidth() * 3
shiftwidth の 3 倍が既定値である。