-
Notifications
You must be signed in to change notification settings - Fork 65
/
Copy pathindent.jax
1138 lines (934 loc) · 45.8 KB
/
indent.jax
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
*indent.txt* For Vim バージョン 8.1. Last change: 2018 Apr 04
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-comments|, |fo-table|, |gq|, |formatting| を参照。
コンパイル時に|+smartindent| か |+cindent|機能を無効にした時には、これが動作し
ないことに注意。
実際のところインデントには4つの主な方法がある。後のものが有効にされると、前の
ものより優先される('indentexpr' は空でない文字列がセットされたとき)。
'autoindent' 一つ前の行に基づくインデント
'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-format* *indentkeys-format*
オプション 'cinkeys' はVimのインデントを制御する文字列で、どの文字がタイプされ
た時に、どのような状況下でコマンドが実行されたかに応じてインデントを行うかを定
義する。これがCインデントの唯一の引金ではないことには注意する。'indentexpr' が
空でない時には代わりに 'indentkeys' が使われる。'cinkeys' と 'indentkeys' の書
式は同じ。
デフォルトは "0{,0},0),:,0#,!^F,o,O,e" で、これにより次のような時にインデント
が行われる:
"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-TやCTRL-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 の位
置へ配置する。"public:", "protected:", "private:" がスコープ宣言
になり得る。
(省略値 'shiftwidth')
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 がゼロのとき (初期設定): '#' コメントを認識しない。プリプロ
セッサー行は認識される。"#" で始まる行に対する右シフトは機能しな
い。
省略値を全て並べるとこうなる:
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列目に持っていく:
- 'cinkeys' が '#0' を含み行が '#' (プリプロセッサー命令)で始まる場合
- 行がラベル ("case" と "default" 以外のキーワードの後に ':' があるもの) で始
まり、'cinoptions' に正数を持った 'L' フラグがない場合。
- インデントの組合わせの結果、その行のインデント量が0以下になった場合。
==============================================================================
2. スクリプトを用いたインデント *indent-expression*
融通の利くインデントの基本はユーザーマニュアルの|30.3|節で説明されている。
独自にインデントファイルを書きたいならば、オプション 'indentexpr' を設定しなけ
ればならない。同時にオプション 'indentkeys' を設定すると便利だろう。インデント
ファイルの例は $VIMRUNTIME/indent ディレクトリを参照。
インデントファイルについての覚書 ~
CLOJURE *ft-clojure-indent* *clojure-indent*
Clojure のインデントは伝統的な Lisp とは若干異なる。それは角カッコや波カッコの
扱いや、コミュニティの習慣などによる。それらの習慣は普遍的ではないので、
Clojure のインデントスクリプトは以下に挙げる設定可能オプションを用意している。
使用している vim に searchpairpos() がない場合は通常の 'lisp' インデントに
フォールバックする。その場合、以下のオプションは無視される。
*g:clojure_maxlines*
searchpairpos() による検索の最大範囲を設定する。大きな値を指定すれば、フォーム
が長い場合に、パフォーマンスと引き換えに正しい結果を得ることができる。0 を指定
すると制限なしになる。
>
" 初期設定
let g:clojure_maxlines = 100
<
*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)$']
" 古い設定方法。文字列をコンマ区切りで指定する。現在は上記のリストによ
" る設定が推奨される。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" などに
マッチする。
各単語は次の順番で検査される:
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.")
<
このオプションは初期設定でオフになっている。
>
" 初期設定
let g:clojure_align_multiline_strings = 0
<
*g:clojure_align_subforms*
初期設定では、括弧で囲まれた関数呼び出しのような形でその最初の subform が括弧
と同じ行にあるとき、そのうしろの subform は最初の括弧からスペース 2 つ分インデ
ントされる:
>
(foo
bar
baz)
<
このオプションを設定すると、clojure-mode.el のデフォルトの振る舞いのように、す
べての subform を同じカラムに揃えることができる:
>
(foo
bar
baz)
<
このオプションは初期設定ではオフになっている。
>
" 初期設定
let g:clojure_align_subforms = 0
<
FORTRAN *ft-fortran-indent*
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
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 インデント増加
初期設定では多くのタグで、続くタグのインデントが増加される (このスクリプトの
"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
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();
PYTHON *ft-python-indent*
以下の状況のためにインデントの量を設定することができる。この例は既定である。
後で 'shiftwidth' の値を変更するために変数に式を設定しておく。
開き括弧の後のインデント: >
let g:pyindent_open_paren = '&sw * 2'
ネストした括弧の後のインデント: >
let g:pyindent_nested_paren = '&sw'
継続行のインデント: >
let g:pyindent_continue = '&sw * 2'
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)
} }
<
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のファイルにだけこの変数を設定するには、次の設定が使える: >