-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy pathusr_41.jax
2471 lines (1848 loc) · 103 KB
/
usr_41.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
*usr_41.txt* For Vim バージョン 7.4. Last change: 2016 Jan 28
VIM USER MANUAL - by Bram Moolenaar
Vim スクリプト書法
Vim スクリプト言語は vimrc ファイルや構文ファイルなど、さまざまな目的に使われ
ます。この章では Vim スクリプトの書き方を説明します。説明することがたくさんあ
るので大きな章になってます。
|41.1| はじめに
|41.2| 変数
|41.3| 式
|41.4| 条件式
|41.5| 式を実行する
|41.6| 関数を使う
|41.7| 関数を定義する
|41.8| リストと辞書
|41.9| 例外
|41.10| 注意事項
|41.11| プラグインを書く
|41.12| ファイルタイププラグインを書く
|41.13| コンパイラプラグインを書く
|41.14| プラグインを書く (高速ロード版)
|41.15| ライブラリスクリプトを書く
|41.16| Vim スクリプトを配布する
次章: |usr_42.txt| 新しいメニューを追加する
前章: |usr_40.txt| 新しいコマンドを作る
目次: |usr_toc.txt|
==============================================================================
*41.1* はじめに *vim-script-intro* *script*
誰もが最初に触れる Vim スクリプトは vimrc ファイルです。Vim が起動するときに読
み込まれ、書かれているコマンドが実行されます。それにより好きなように設定を変更
できます。vimrc の中ではすべてのコロンコマンドが使えます (":" で始まるコマンド
のこと。Ex コマンドやコマンドラインコマンドと呼ばれることもある)。
シンタックスファイルも Vim スクリプトです。シンタックスファイルは、ファイルタ
イプ別にオプションを設定するファイルの一種です。複雑なマクロ定義を別ファイルに
分けて保存しておくこともできます。このように、いろいろな使用方法が考えられま
す。
簡単な例から始めましょう: >
:let i = 1
:while i < 5
: echo "count is" i
: let i += 1
:endwhile
<
Note:
実際には ":" を書く必要はありません。":" が必要なのはコマンドラインで
入力するときだけです。Vim スクリプトファイルを書くときは省略できます。
このヘルプでは、コロンコマンドであることを強調し、ノーマルモードと区別
するためにコロンを表記しています。
Note:
例文をヤンクして :@" コマンドで実際に実行できます。
出力は次のようになります:
count is 1 ~
count is 2 ~
count is 3 ~
count is 4 ~
一行目では ":let" コマンドで変数に値を代入しています。書式は次のとおりです: >
:let {変数名} = {式}
例では、変数名が "i"、式が 1 です。
":while" コマンドでループを開始します。書式は次のとおりです: >
:while {条件式}
: {ステートメント}
:endwhile
条件式が真である間、ステートメントが実行されます。例では、条件式は "i < 5" で
す。これは、i が 5 より小さい場合に真になります。
Note:
何かのミスで while ループが止まらなかった場合は、CTRL-C を押せば中断で
きます (MS-Windows では CTRL-Break)。
":echo" コマンドは引数を出力します。例では、"count is" という文字列と、変数 i
の値を出力しています。i が 1 なら、次のように表示されます:
count is 1 ~
":let i += 1" は ":let i = i + 1" と同じ意味です。変数 i に 1 を加算し、新しい
値を同じ変数に代入します。
上述の例は、実際にはもっと簡潔に書くことができます: >
:for i in range(1, 4)
: echo "count is" i
:endfor
|:for| と |range()| の説明はもっと先です。すぐに知りたい人はリンク先にジャンプ
してください。
三種類の数値
------------
数値は10進数、16進数、8進数のいずれかで表記します。16進数は "0x" か "0X" で開
始します。例えば "0x1f" は10進数の 31 です。8進数は "0" で開始します。例えば
"017" は10進数の 15 です。注意: 10進数で書くときは先頭に "0" を付けないでくだ
さい。8進数として扱われてしまいます。
":echo" コマンドは常に10進数で出力します。例: >
:echo 0x7f 036
< 127 30 ~
数値にマイナス記号を付けると負数になります。8進数や16進数も負数にできます。マ
イナス記号は減算記号としても使われます。次の例を上の例と比べてみてください: >
:echo 0x7f -036
< 97 ~
式の途中にある空白は無視されますが、可読性を高めるために、適切に空白で区切るこ
とをお勧めします。例えば上記の数値が負数であると勘違いしてしまわないように、マ
イナス記号と数値の間に空白をいれましょう: >
:echo 0x7f - 036
==============================================================================
*41.2* 変数
変数名にはアルファベット、数字、アンダースコアが使えます。変数名を数字で開始す
ることはできません。次のような変数名が使えます:
counter
_aap3
very_long_variable_name_with_underscores
FuncLength
LENGTH
"foo+var" や "6var" のような名前は使えません。
例に挙げた変数はグローバル変数です。定義されている変数の一覧を見るのは次のコマ
ンドを使います: >
:let
グローバル変数はどこでも使えます。そのため、あるスクリプトファイルで "count"
という変数を使ったとき、その変数は他のスクリプトでも使われている可能性がありま
す。これは混乱を招きますし、トラブルの元です。それを避けるには "s:" を付けてス
クリプトローカル変数を使います。例えば、次のように使います: >
:let s:count = 1
:while s:count < 5
: source other.vim
: let s:count += 1
:endwhile
"s:count" はスクリプトローカル変数なので、他のスクリプトファイルによって変更さ
れる心配はありません。他のスクリプトファイルで "s:count" 変数が使われていたと
しても、それは別の変数です。スクリプトローカル変数についての詳細は
|script-variable| を参照してください。
変数の種類は他にもあります。|internal-variables| 参照。次の変数がよく使われま
す:
b:name バッファローカル変数
w:name ウィンドウローカル変数
g:name グローバル変数 (関数内では g: 必須)
v:name Vim が定義する変数
変数の削除
----------
変数はメモリを消費します。":let" コマンドの出力にも表示されます。変数を削除す
るには ":unlet" コマンドを使います。例: >
:unlet s:count
スクリプトローカル変数の "s:count" が削除され、使用されていたメモリが開放され
ます。変数が存在しない場合でもエラーを起こしたくない場合は ! を付けてください:
>
:unlet! s:count
スクリプトの実行が終了したとき、ローカル変数は自動的には削除されません。次に同
じスクリプトを実行したときにその変数を使うことができます。例: >
:if !exists("s:call_count")
: let s:call_count = 0
:endif
:let s:call_count = s:call_count + 1
:echo "called" s:call_count "times"
"exists()" 関数は変数が定義されているかどうかをチェックします。引数に調べたい
変数の名前を指定します。変数自体を指定するのではありません。例えば: >
:if !exists(s:call_count)
これは、s:call_count の値を変数名として exists() 関数を呼び出しているので、意
味が違ってしまいます。
感嘆符 (! 記号) は値を反転します。値が真なら偽になり、偽なら真になります。この
記号は "not" と読むことができます。つまり、"if !exists()" は "if not exists()"
と読むことができます。
Vim では、0 以外の値はすべて真です。0 は偽です。
Note:
数値が必要なところで文字列を使ったとき、文字列は自動的に数値に変換され
ます。文字列の先頭が数字ではなかった場合は 0 に変換されます。つまり: >
:if "true"
< "true" は 0 に変換されるので偽になります。
文字列変数と定数
----------------
ここまでは変数の値に数値だけを使っていましたが、文字列を使うこともできます。
Vim は数値と文字列を基本型としてサポートしています。変数は動的に型付けされま
す。型は ":let" コマンドで変数に値を代入するたびに変化します。詳しくは|41.8|
を参照してください。
変数に文字列を代入するには文字列定数を使う必要があります。文字列定数には二つの
種類があります。一つはダブルクォート文字列です: >
:let name = "peter"
:echo name
< peter ~
文字列の中でダブルクォートを使いたい場合は、バックスラッシュを前置してくださ
い: >
:let name = "\"peter\""
:echo name
< "peter" ~
バックスラッシュを使いたくない場合はシングルクォート文字列を使ってください: >
:let name = '"peter"'
:echo name
< "peter" ~
シングルクォート文字列の中ではすべての文字がそのまま使われます。ただし、シング
ルクォートだけは特別で、一つのシングルクォートを表すためには二つのシングル
クォートを書く必要があります。バックスラッシュはそのまま使われるので、特殊文字
は使えません。
ダブルクォート文字列の中では特殊文字が使えます。次のようなものがあります:
\t <Tab>
\n <NL>, 改行
\r <CR>, <Enter>
\e <Esc>
\b <BS>, バックスペース
\" "
\\ \, バックスラッシュ
\<Esc> <Esc>
\<C-W> CTRL-W
最後の二つはただの一例です。"\<name>" 形式で "name" という特殊キーを使うことが
できます。
文字列で使える特殊表記については |expr-quote| を参照してください。
==============================================================================
*41.3* 式
Vim の式は高機能でシンプルです。式の定義については |expression-syntax| を参照
してください。ここでは基本的なことだけを説明します。
数値と文字列と変数はそれ自体が式です。つまり、式が必要なところでは数値でも文字
列でも変数でも使えます。他にも次のようなものが使えます:
$NAME 環境変数
&name オプション
@r レジスタ
例: >
:echo "The value of 'tabstop' is" &ts
:echo "Your home directory is" $HOME
:if @a > 5
&name 形式を使うと、オプションを保存し、別の値に設定し、何かを実行して、オプ
ションを元に戻す、というようなことができます。例: >
:let save_ic = &ic
:set noic
:/The Start/,$delete
:let &ic = save_ic
'ignorecase' オプションをオフにしてから "The Start" パターンを検索しています。
しかし設定は変更されません。(パターンに "\C" を加える方法でも同じことができま
す。|/\C| 参照。)
数値計算
--------
基本的な要素を組み合わせると面白くなってきます。まずは数値計算です:
a + b 加算
a - b 減算
a * b 乗算
a / b 除算
a % b 剰余演算(余りを得る)
演算子の優先順位は一般的な規則と同じです: >
:echo 10 + 5 * 2
< 20 ~
カッコを使って優先順位を変更できます: >
:echo (10 + 5) * 2
< 30 ~
文字列は "." で連結できます: >
:echo "foo" . "bar"
< foobar ~
":echo" コマンドに複数の引数を指定すると、スペースで区切られて表示されます。こ
れらの例では一つの式しか使われていないので、スペースは挿入されていません。
C 言語と同じ条件演算子も使えます:
a ? b : c
"a" が真なら "b" が使われ、そうでなければ "c" が使われます。例: >
:let i = 4
:echo i > 5 ? "i is big" : "i is small"
< i is small ~
被演算子の部分は優先的に評価されるので、次のように見なすことができます:
(a) ? (b) : (c)
==============================================================================
*41.4* 条件式
":if" コマンドは条件が真の場合に ":endif" までのステートメントを実行します。書
式は次のとおり:
:if {condition}
{statements}
:endif
{condition} を評価した結果が真 (0以外) であれば、{statements} の内容が実行され
ます。{statements} は正しく記述されている必要があります。不正な記述があると
":endif" までたどり着けません。
":else" を使うこともできます。書式は次のとおり:
:if {condition}
{statements}
:else
{statements}
:endif
二つ目の {statements} は条件が偽の場合にだけ実行されます。
":elseif" を使うこともできます:
:if {condition}
{statements}
:elseif {condition}
{statements}
:endif
これは ":else" に続けて "if" 文を使うのと同じ動作ですが、余計な ":endif" を使
わなくて済みます。
vimrc ファイルで便利に使える例を示しましょう。'term' オプションの値を調べ、そ
の値に応じて処理を分けます: >
:if &term == "xterm"
: " xterm 用の設定
:elseif &term == "vt100"
: " vt100 端末用の設定
:else
: " その他の端末用の設定
:endif
論理演算子
----------
今までの説明で既に論理演算子を使いました。次の演算子がよく使われます:
a == b 等しい
a != b 等しくない
a > b より大きい
a >= b より大きいか等しい
a < b より小さい
a <= b より小さいか等しい
条件が成立するなら 1、そうでなければ 0 が返ります。例: >
:if v:version >= 700
: echo "おめでとう"
:else
: echo "古いバージョンを使っています。更新してね!"
:endif
"v:version" は Vim によって定義されている変数で、Vim のバージョンが入っていま
す。バージョン 6.0 なら 600、バージョン 6.1 なら 601 です。これは複数のバー
ジョンに対応するスクリプトを書くときに便利です。|v:version|
論理演算子は数値でも文字列でも扱えます。文字列どうしを比較するときは数学的な差
が比較されます。文字のバイト値を比較するので、一部の言語では正しい結果にならな
いかもしれません。
文字列と数値を比較するときは、文字列を数値に変換します。文字列が数字ではなかっ
たときは 0 になるので注意してください。例: >
:if 0 == "one"
: echo "yes"
:endif
これは "yes" と表示されます。"one" は数字ではないので 0 に変換されるのです。
文字列にはさらに二つの論理演算子があります:
a =~ b パターンにマッチする
a !~ b パターンにマッチしない
左辺の "a" は文字列として扱われます。右辺の "b" は検索パターンとして扱われま
す。例: >
:if str =~ " "
: echo "str にはスペースが含まれている"
:endif
:if str !~ '\.$'
: echo "str の末尾はピリオドではない"
:endif
パターンを指定するのにシングルクォート文字列を使うのがコツです。ダブルクォート
文字列ではバックスラッシュを二重に書く必要があり、そして、検索パターンではバッ
クスラッシュをよく使うので、バックスラッシュだらけになってしまいます。
文字列を比較するときは 'ignorecase' オプションが使われます。大文字小文字の区別
を明示的に指定したい場合は比較演算子に "#" (区別する) または "?" (区別しない)
をつけます。大文字小文字を区別せずに等しいかどうかを比較したい場合は "==?" を
使います。"!~#" ならパターンにマッチしないことを、大文字と小文字を区別して確認
できます。演算子の一覧は |expr-==| を参照してください。
他のループコマンド
------------------
":while" コマンドは既に説明しました。":while" ループの中では二つのステートメン
トが使えます:
:continue ループの先頭にジャンプしてループを継続する。
:break ":endwhile" までジャンプしてループを脱ける。
例: >
:while counter < 40
: call do_something()
: if skip_flag
: continue
: endif
: if finished_flag
: break
: endif
: sleep 50m
:endwhile
":sleep" コマンドは Vim を一定時間停止します。"50m" は 50 ミリ秒です。
":sleep 4" なら 4 秒間スリープします。
":for" コマンドを使ってループすることもできます。|41.8|を参照。
==============================================================================
*41.5* 式を実行する
今まではコマンドを直接書いてきました。":execute" コマンドを使うと、式の評価結
果をコマンドとして実行できます。これによってコマンドを動的に生成することができ
ます。
例えば、変数に格納された文字列を使ってタグジャンプするには次のようにします: >
:execute "tag " . tag_name
文字列 "tag " と変数 "tag_name" の値を "." で連結しています。仮に "tag_name"
の値が "get_cmd" だった場合、次のコマンドが実行されることになります: >
:tag get_cmd
":execute" コマンドはコロンコマンドのみ実行できます。":normal" コマンドでノー
マルモードコマンドを実行できますが、このコマンドの引数は文字がそのまま使われ、
式としては評価されません。例: >
:normal gg=G
このコマンドは一行目にジャンプしてから "=" オペレータですべての行を整形しま
す。
":normal" コマンドで式の値を使いたい場合は ":execute" と組み合わせてください。
例: >
:execute "normal " . normal_commands
変数 "normal_commands" にはノーマルモードコマンドを入れておく必要があります。
":normal" には完結したコマンドを指定するようにしてください。引数が最後まで実行
された段階でコマンドは中断されます。例えば、挿入モードを開始した場合は挿入モー
ドを終了しなくてはなりません。次のコマンドは正しく動作します: >
:execute "normal Inew text \<Esc>"
これは現在行に "new text" を挿入します。特殊キー "\<ESC>" を使っていることに注
目してください。これによりスクリプトの中で本物の <Esc> 文字を使わないですみま
す。
文字列を実行するのではなく、その式の値を得たい場合は、eval() 関数を使います: >
:let optname = "path"
:let optval = eval('&' . optname)
文字 "&" と "path" を連結しているので eval() の引数は "&path" になります。返り
値は 'path' オプションの値です。
次のようにすることもできます: >
:exe 'let optval = &' . optname
==============================================================================
*41.6* 関数を使う
たくさんの関数があらかじめ定義され、豊富な機能が提供されています。このセクショ
ンの説明にもいくつか登場します。関数の一覧は |functions| を参照してください。
関数は ":call" コマンドで呼び出します。引数はカッコで囲み、それぞれをコンマで
区切ります。例: >
:call search("Date: ", "W")
これは "Date: " と "W" を引数にして search() 関数を呼び出しています。search()
関数は一つ目の引数を検索パターンとして使い、二つ目の引数をフラグとして使いま
す。"W" フラグを指定するとファイル末尾で検索が終了します (折り返さない)。
関数は式の中で使うこともできます。例: >
:let line = getline(".")
:let repl = substitute(line, '\a', "*", "g")
:call setline(".", repl)
getline() 関数はカレントバッファから行を取得する関数です。引数には行番号を指定
します。この例では "." ですが、これはカーソルのある行を示します。
substitute() 関数は ":substitute" コマンドとほぼ同じです。最初の引数は置換対象
の文字列、二つ目の引数はパターン、三つ目は置き換え文字列、最後はフラグです。
setline() 関数は行の内容を置き換えます。最初の引数は行番号、二つ目の引数は置き
換える文字列です。この例では、substitute() の結果で現在行を置き換えています。
上記の三行のコマンドは次のコマンドと同じことをしています: >
:substitute/\a/*/g
substitute() コマンドの前後にいろいろな処理を入れたりすると、もっと面白いこと
ができるようになります。
関数一覧 *function-list*
--------
たくさんの関数があります。ここでは機能別に分類して紹介します。アルファベット順
の一覧は |functions| を参照してください。関数の名前の上で CTRL-] を押すと、詳
細な説明にジャンプできます。
文字列繰作: *string-functions*
nr2char() ASCII値から文字を得る
char2nr() 文字のASCII値を得る
str2nr() 文字列を数値に変換する
str2float() 文字列を浮動小数点数に変換する
printf() 書式付き文字列を整形する
escape() 文字列の特定の文字を '\' でエスケープ
shellescape() シェルコマンドで使えるように文字列をエスケープ
fnameescape() Vim コマンド用にファイル名をエスケープ
tr() ある文字の集合から別の文字の集合へ置換する
strtrans() 文字列を印刷可能な状態とする
tolower() 文字列を小文字にする
toupper() 文字列を大文字にする
match() 文字列の中でパターンにマッチした位置
matchend() 文字列の中でパターンにマッチした末尾の位置
matchstr() 文字列の中でパターンにマッチした文字列
matchlist() matchstr()と同様だが、部分マッチも返す
stridx() 文字列の中で部分文字列が見つかった最初の位置
strridx() 文字列の中で部分文字列が見つかった最後の位置
strlen() 文字列のバイト単位での長さ
strchars() 文字列の文字単位での長さ
strwidth() 表示された文字列のサイズ
strdisplaywidth() 表示された文字列のサイズ、タブに関係する
substitute() パターンにマッチする文字列を置換
submatch() ":s" と substitute() の中で部分マッチを得る
strpart() 文字列の一部分を得る
expand() 特殊キーワードを展開する
iconv() テキストのエンコーディングを変換する
byteidx() 文字列中の文字のバイトインデックス
byteidxcomp() byteidx() と同様だが合成文字を数に入れる
repeat() 文字列を複数回繰り返す
eval() 文字列を式として評価する
リスト操作: *list-functions*
get() 要素を取得。存在しないインデックスでもエラーを
出さない
len() リスト中の要素の個数
empty() リストが空であるか判定する
insert() リストの任意の位置に要素を挿入する
add() リストに要素を追加する
extend() リストにリストを連結する
remove() リストから1個以上の要素を取り除く
copy() リストの浅いコピーを作成する
deepcopy() リストの完全なコピーを作成する
filter() リストから選択された要素を取り除く
map() リストの各要素を変換する
sort() リストをソートする
reverse() リストの並び順を反転させる
uniq() 隣接して繰り返される要素のコピーを削除する
split() 文字列を分割し、リストにする
join() リストの要素を連結し、文字列にする
range() 数列リストを返す
string() リストの文字列表現
call() リストを引数として関数を呼ぶ
index() リスト中の要素のインデックス
max() リスト中の最大値
min() リスト中の最小値
count() ある要素がリスト中に出現する回数を返す
repeat() リストを複数回繰り返す
辞書操作: *dict-functions*
get() 辞書の要素を返す。存在しないキーでもエラーを出
さない
len() 辞書の要素の個数
has_key() あるキーが辞書に含まれているか判定する
empty() 辞書が空であるか判定する
remove() 辞書から要素を取り除く
extend() ある辞書の要素をすべて別の辞書に追加する
filter() 辞書から選択された要素を取り除く
map() 辞書の各要素を変換する
keys() 辞書の全キーのリストを取得する
values() 辞書の全値のリストを取得する
items() 辞書の全キー・値のペアを取得する
copy() 辞書の浅いコピーを作成する
deepcopy() 辞書の完全なコピーを作成する
string() 辞書の文字列表現
max() 辞書中の最大値
min() 辞書中の最小値
count() ある値が出現する回数を返す
浮動小数点数の計算: *float-functions*
float2nr() Float を Number に変換
abs() 絶対値 (Numberも処理可能)
round() 丸め
ceil() 切り上げ
floor() 切り下げ
trunc() 少数切り捨て
fmod() 除法の余り
exp() 指数
log() 自然対数 (eを底とする対数)
log10() 10 を底とする対数
pow() x の y 乗
sqrt() 平方根
sin() 正弦 (サイン)
cos() 余弦 (コサイン)
tan() 正接 (タンジェント)
asin() 逆正弦 (アークサイン)
acos() 逆余弦 (アークコサイン)
atan() 逆正接 (アークタンジェント)
atan2() 逆正接 (アークタンジェント)
sinh() 双曲線正弦 (ハイパボリックサイン)
cosh() 双曲線余弦 (ハイパボリックコサイン)
tanh() 双曲線正接 (ハイパボリックタンジェント)
その他の計算: *bitwise-function*
and() ビットごとの論理積
invert() ビットごとの否定
or() ビットごとの論理和
xor() ビットごとの排他的論理和
sha256() SHA-256 ハッシュ
変数: *var-functions*
type() 変数の型
islocked() 変数がロックされているか判定する
function() 関数名からFuncrefを取得する
getbufvar() 指定バッファの変数値を得る
setbufvar() 指定バッファに変数を設定する
getwinvar() 指定ウィンドウの変数値を得る
gettabvar() 指定タブページから変数値を得る
gettabwinvar() 指定ウィンドウ・タブページから変数値を取得する
setwinvar() 指定ウィンドウに変数を設定する
settabvar() 指定タブページに変数を設定する
settabwinvar() 指定ウィンドウ・タブページに変数を設定する
garbagecollect() 開放可能なメモリを解放する
カーソルとマークの位置: *cursor-functions* *mark-functions*
col() カーソルやマークの列番号を取得する
virtcol() カーソルやマークの画面上の列番号を得る
line() カーソルやマークの行番号を取得する
wincol() カーソルのウィンドウでの列番号
winline() カーソルのウィンドウでの行番号
cursor() カーソルを指定した位置に移動させる
screencol() カーソルのスクリーン列を取得する
screenrow() カーソルのスクリーン行を取得する
getcurpos() カーソルの位置を取得する
getpos() カーソルやマークなどの位置を取得する
setpos() カーソルやマークなどの位置を設定する
byte2line() 指定のバイト位置の行番号を取得する
line2byte() 指定の行のバイト位置を取得する
diff_filler() ある行より上の詰め行の数を取得する
screenattr() スクリーン列/行の属性を取得する
screenchar() スクリーン列/行の文字コードを取得する
カレントバッファで動作するもの: *text-functions*
getline() バッファから行を得る
setline() バッファの行を置き換える
append() 行または行のリストをバッファに追加する
indent() 行のインデントを得る
cindent() C 言語におけるインデントを得る
lispindent() Lisp 言語におけるインデントを得る
nextnonblank() 次の非空行を探す
prevnonblank() 前の非空行を探す
search() パターンにマッチする場所を探す
searchpos() パターンにマッチする場所を探す
searchpair() start/skip/end の対を探す
searchpairpos() start/skip/end の対を探す
searchdecl() 名前が宣言されている場所を探す
*system-functions* *file-functions*
システム関数とファイル繰作:
glob() ワイルドカードを展開する
globpath() 複数のディレクトリを対象にワイルドカードを展開
findfile() 複数のディレクトリからファイルを探す
finddir() 複数のディレクトリからディレクトリを探す
resolve() ショートカットのリンク先を得る
fnamemodify() ファイル名を修飾する
pathshorten() パス中のディレクトリ名を短くする
simplify() パスの意味を変えずに簡略化する
executable() 実行形式ファイルかどうかをチェックする
exepath() 実行ファイルのフルパスを得る
filereadable() ファイルが読み込み可能かどうかをチェックする
filewritable() ファイルが書き込み可能かどうかをチェックする
getfperm() ファイルのパーミッションを得る
getftype() ファイルの種類を得る
isdirectory() ディレクトリの存在をチェックする
getfsize() ファイルのサイズを得る
getcwd() カレントディレクトリを得る
haslocaldir() カレントウィンドウが |:lcd| を使用するかどうか
をチェックする
tempname() 一時ファイルの名前を得る
mkdir() ディレクトリを作成する
delete() ファイルを削除する
rename() ファイルの名前を変更する
system() シェルコマンドを実行し、その結果を文字列で得る
systemlist() シェルコマンドを実行し、その結果をリストで得る
hostname() システムの名称を得る
readfile() ファイルを読み込み、行のリストを得る
writefile() 行のリストをファイルに書き込む
日付と時刻: *date-functions* *time-functions*
getftime() ファイルの最終更新日時を得る
localtime() 現在時刻を秒単位で得る
strftime() 時刻を文字列に変換する
reltime() 現在時刻または経過時間を正確に取得する
reltimestr() reltime()の結果を文字列に変換する
*buffer-functions* *window-functions* *arg-functions*
バッファ、ウィンドウ、引数リスト:
argc() 引数リストの大きさ
argidx() 引数リスト中の現在の位置
arglistid() 引数リストのIDを得る
argv() 引数リストの中身を得る
bufexists() バッファの存在をチェックする
buflisted() バッファが存在し、リストされているかどうか
bufloaded() バッファが存在し、ロードされているかどうか
bufname() バッファの名前を得る
bufnr() バッファの番号を得る
tabpagebuflist() タブページ中のバッファのリストを返す
tabpagenr() タブページの番号を取得する
tabpagewinnr() タブページを対象にwinnr()と同様
winnr() カレントウィンドウの番号を得る
bufwinnr() バッファのウィンドウ番号を得る
winbufnr() ウィンドウのバッファ番号を得る
getbufline() バッファの行のリストを得る
コマンドライン: *command-line-functions*
getcmdline() 現在のコマンドラインを取得
getcmdpos() コマンドラインにおけるカーソル位置を取得
setcmdpos() コマンドラインにおけるカーソル位置を設定
getcmdtype() 現在のコマンドラインの種類を返す
getcmdwintype() 現在のコマンドラインウィンドウの種類を返す
Quickfixとロケーションリスト: *quickfix-functions*
getqflist() quickfixエラーのリスト
setqflist() quickfixを変更する
getloclist() ロケーションリストの項目のリスト
setloclist() ロケーションリストを変更する
挿入モード補完: *completion-functions*
complete() 補完候補を設定する
complete_add() 補完候補を追加する
complete_check() 補完処理を終えるべきかどうかをチェックする
pumvisible() ポップアップメニューが表示されているかチェック
折り畳み: *folding-functions*
foldclosed() 行が折り畳まれているかどうかをチェックする
foldclosedend() foldclosed()と同様。折り畳み末尾の行番号を返す
foldlevel() 行の折り畳みレベルを得る
foldtext() 閉じた折り畳みを代替表示するテキストを生成
foldtextresult() 閉じた折り畳みを代替表示するテキストを得る
シンタックスハイライト: *syntax-functions* *highlighting-functions*
clearmatches() |matchadd()|と|:match|コマンドで定義されたマッ
チをクリアする
getmatches() |matchadd()|と|:match|コマンドで定義されたすべ
てのマッチを得る
hlexists() ハイライトグループの存在をチェック
hlID() ハイライトグループのIDを得る
synID() 指定位置のシンタックスIDを得る
synIDattr() シンタックスIDから指定の属性を得る
synIDtrans() 変換したシンタックスIDを得る
synstack() 指定位置のシンタックスIDのリストを得る
synconcealed() conceal の情報を得る
diff_hlID() 差分モードの指定位置のシンタックスIDを得る
matchadd() 強調表示するパターンを定義する
matchaddpos() 強調表示する位置のリストを定義する
matcharg() |:match|の引数の情報を得る
matchdelete() |matchadd()|と|:match|コマンドで定義されたマッ
チを削除する
setmatches() |getmatches()|で得たマッチを使って復元する
スペリング: *spell-functions*
spellbadword() カーソル位置以降のスペルミスを探す
spellsuggest() スペル訂正の候補を返す
soundfold() 単語の同音等値(sound-a-like equivalent)を返す
履歴: *history-functions*
histadd() 履歴に項目を追加
histdel() 履歴から項目を削除
histget() 履歴の項目を得る
histnr() 履歴リストの最大インデックスを得る
対話インターフェイス: *interactive-functions*
browse() ファイル選択ダイアログを開く
browsedir() ディレクトリ選択ダイアログを開く
confirm() ユーザーに選択をさせる
getchar() ユーザーが入力した文字を得る
getcharmod() 最後に入力した文字の修飾子(modifier)を得る
feedkeys() 先行入力キューに文字を入れる
input() ユーザーが入力した行を得る
inputlist() ユーザーにリストから項目を選択させる
inputsecret() ユーザーが入力した行を得る。ただし表示はしない
inputdialog() ダイアログを使ってユーザーが入力した行を得る
inputsave() 先行入力キューを保存して空にする
inputrestore() inputsave()で保存した状態に戻す
GUI: *gui-functions*
getfontname() 現在使われているフォントの名前を取得
getwinposx() GUIのVimウィンドウのX座標
getwinposy() GUIのVimウィンドウのY座標
Vimサーバー: *server-functions*
serverlist() サーバー名のリストを返す
remote_send() Vimサーバーにコマンド文字を送る
remote_expr() Vimサーバーで式を評価する
server2client() Vimサーバーのクライアントに応答を返す
remote_peek() Vimサーバーから返信があったかどうかをチェック
remote_read() Vimサーバーからの返信を読む
foreground() Vimのウィンドウを前面に持ってくる
remote_foreground() Vimサーバーのウィンドウを前面に持ってくる
ウィンドウサイズと位置: *window-size-functions*
winheight() ウィンドウの高さを取得
winwidth() ウィンドウの幅を取得
winrestcmd() ウィンドウサイズを復元するコマンドを返す
winsaveview() カレントウィンドウのビューを取得
winrestview() カレントウィンドウのビューを復元
マッピング: *mapping-functions*
hasmapto() マップの存在をチェック
mapcheck() マッチするマップの存在をチェック
maparg() マップのrhs(展開結果)を得る
wildmenumode() wildmodeが有効かどうかをチェック
テスト用: *test-functions*
assert_equal() 2つの式が等しいかどうかテストする
assert_false() 式がfalseかどうかテストする
assert_true() 式がtrueかどうかテストする
プロセス間通信:
connect() チャンネルを開く
disconnect() チャンネルを閉じる
sendexpr() チャンネルにJSONメッセージを送る
sendraw() チャンネルにrawメッセージを送る
jsonencode() 式をJSONの文字列に変換する
jsondecode() JSONの文字列を式に変換する
その他: *various-functions*
mode() 現在の編集モードを得る
visualmode() 最後に使われたビジュアルモードの種類
exists() 変数、関数の存在をチェック
has() 機能がサポートされているかをチェック
changenr() 最近の変更番号を返す
cscope_connection() cscope接続をチェック
did_filetype() FileTypeオートコマンドが使用されたかどうか
eventhandler() イベントハンドラによって起動されたかどうか
getpid() Vim のプロセスIDを得る
libcall() 外部ライブラリの関数を呼ぶ
libcallnr() 同上、数値を返す
undofile() アンドゥファイルの名前を得る
undotree() アンドゥツリーの状態を返す
getreg() レジスタの値を得る
getregtype() レジスタのタイプを得る
setreg() レジスタの値を設定する
shiftwidth() 'shiftwidth' の実際の値
taglist() マッチするタグのリストを取得
tagfiles() タグファイルのリストを取得
luaeval() |Lua|の式を評価する
mzeval() |MzScheme| の式を評価する
perleval() |Perl|の式を評価する (|+perl|)
py3eval() |Python|の式を評価する (|+python3|)
pyeval() |Python|の式を評価する (|+python|)
wordcount() バッファ内のバイト数/単語数/文字数などを得る
==============================================================================
*41.7* 関数を定義する
自分で関数を定義することができます。基本的な関数定義は次のとおり: >
:function {name}({var1}, {var2}, ...)
: {body}
:endfunction
<
Note:
関数名は大文字で開始する必要があります。
小さな関数を定義してみましょう。二つの数値のうち小さい方を返す関数を作ります。
関数は次のような行で始まります: >
:function Min(num1, num2)
関数の名前が "Min" であり、二つの引数 ("num1" と "num2") を取る、ということを
表しています。
最初にしなければならないのは、どちらの数値が小さいかをチェックすることです: >
: if a:num1 < a:num2
"a:" は特殊なプレフィクスで、この変数が関数の引数であることを示します。小さい
方の値を変数 "smaller" に代入しましょう: >
: if a:num1 < a:num2
: let smaller = a:num1
: else
: let smaller = a:num2
: endif
変数 "smaller" はローカル変数です。関数の中で使われた変数はローカル変数になり
ます。ただし、"g:"、"a:"、"s:" などのプレフィクスを付けた場合は別です。
Note:
関数の内からグローバル変数にアクセスするには "g:" を付ける必要がありま
す。つまり、関数内では "g:today" はグローバル変数 "today" を示し、
"today" ならそれとは別の変数、すなわちローカル変数になります。
":return" ステートメントを使って、小さい方の値を呼び出し元に返しましょう。そし
て、関数を閉じます: >
: return smaller
:endfunction
関数定義の全体は次のようになります: >
:function Min(num1, num2)
: if a:num1 < a:num2
: let smaller = a:num1
: else
: let smaller = a:num2
: endif
: return smaller
:endfunction
関数を短く書きたい場合は、次のようにもできます: >
:function Min(num1, num2)
: if a:num1 < a:num2
: return a:num1
: endif
: return a:num2
:endfunction
ユーザー定義関数は組み込み関数とまったく同じ方法で呼び出すことができます。違う
のは名前だけです。Min 関数は次のように使用できます: >
:echo Min(5, 8)
関数が実行され、関数の中身が Vim によって解釈されます。未定義の変数や関数を使
うなどの間違いがあったときは、エラーメッセージが表示されます。関数定義の時点で
はそれらのエラーは検出されません。
関数が ":endfunction" まで実行されたとき、あるいは引数無しで ":return" を使っ
たときは 0 が返ります。
既存の関数を再定義したい場合は ":function" コマンドに "!" を付けてください: >
:function! Min(num1, num2, num3)
範囲指定を使う
--------------