Merge branch 'MacVim'
[MacVim/KaoriYa.git] / runtime / doc / usr_41.jax
blob0d96d26d81d5f7da182ccf203953b3854546703b
1 *usr_41.txt*    For Vim バージョン 7.2.  Last change: 2008 Jun 21
3                      VIM USER MANUAL - by Bram Moolenaar
5                               Vim スクリプト書法
8 Vim スクリプト言語は vimrc ファイルや構文ファイルなど、さまざまな目的に使われ
9 ます。この章では Vim スクリプトの書き方を説明します。説明することがたくさんあ
10 るので大きな章になってます。
12 |41.1|  はじめに
13 |41.2|  変数
14 |41.3|  式
15 |41.4|  条件式
16 |41.5|  式を実行する
17 |41.6|  関数を使う
18 |41.7|  関数を定義する
19 |41.8|  リストと辞書
20 |41.9|  例外
21 |41.10| 注意事項
22 |41.11| プラグインを書く
23 |41.12| ファイルタイププラグインを書く
24 |41.13| コンパイラプラグインを書く
25 |41.14| プラグインを書く (高速ロード版)
26 |41.15| ライブラリスクリプトを書く
27 |41.16| Vim スクリプトを配布する
29 次章: |usr_42.txt|  新しいメニューを追加する
30 前章: |usr_40.txt|  新しいコマンドを作る
31 目次: |usr_toc.txt|
33 ==============================================================================
34 *41.1*  はじめに                            *vim-script-intro* *script*
36 誰もが最初に触れる Vim スクリプトは vimrc ファイルです。Vim が起動するときに読
37 み込まれ、書かれているコマンドが実行されます。それにより好きなように設定を変更
38 できます。vimrc の中ではすべてのコロンコマンドが使えます (":" で始まるコマンド
39 のこと。Ex コマンドやコマンドラインコマンドと呼ばれることもある)。
40 シンタックスファイルも Vim スクリプトです。シンタックスファイルは、ファイルタ
41 イプ別にオプションを設定するファイルの一種です。複雑なマクロ定義を別ファイルに
42 分けて保存しておくこともできます。このように、いろいろな使用方法が考えられま
43 す。
45 簡単な例から始めましょう: >
47         :let i = 1
48         :while i < 5
49         :  echo "count is" i
50         :  let i += 1
51         :endwhile
53         Note:
54         実際には ":" を書く必要はありません。":" が必要なのはコマンドラインで
55         入力するときだけです。Vim スクリプトファイルを書くときは省略できます。
56         このヘルプでは、コロンコマンドであることを強調し、ノーマルモードと区別
57         するためにコロンを表記しています。
58         Note:
59         例文をヤンクして :@" コマンドで実際に実行できます。
61 出力は次のようになります:
63         count is 1 ~
64         count is 2 ~
65         count is 3 ~
66         count is 4 ~
68 一行目では ":let" コマンドで変数に値を代入しています。書式は次のとおりです: >
70         :let {変数名} = {式}
72 例では、変数名が "i"、式が 1 です。
73 ":while" コマンドでループを開始します。書式は次のとおりです: >
75         :while {条件式}
76         :  {ステートメント}
77         :endwhile
79 条件式が真である間、ステートメントが実行されます。例では、条件式は "i < 5" で
80 す。これは、i が 5 より小さい場合に真になります。
81         Note:
82         何かのミスで while ループが止まらなかった場合は、CTRL-C を押せば中断で
83         きます (MS-Windows では CTRL-Break)。
85 ":echo" コマンドは引数を出力します。例では、"count is" という文字列と、変数 i
86 の値を出力しています。i が 1 なら、次のように表示されます:
88         count is 1 ~
90 ":let i += 1" は ":let i = i + 1" と同じ意味です。変数 i に 1 を加算し、新しい
91 値を同じ変数に代入します。
93 上述の例は、実際にはもっと簡潔に書くことができます: >
95         :for i in range(1, 4)
96         :  echo "count is" i
97         :endfor
99 |:for| と |range()| の説明はもっと先です。すぐに知りたい人はリンク先にジャンプ
100 してください。
103 三種類の数値
104 ------------
106 数値は10進数、16進数、8進数のいずれかで表記します。16進数は "0x" か "0X" で開
107 始します。例えば "0x1f" は10進数の 31 です。8進数は "0" で開始します。例えば
108 "017" は10進数の 15 です。注意: 10進数で書くときは先頭に "0" を付けないでくだ
109 さい。8進数として扱われてしまいます。
110 ":echo" コマンドは常に10進数で出力します。例: >
112         :echo 0x7f 036
113 <       127 30 ~
115 数値にマイナス記号を付けると負数になります。8進数や16進数も負数にできます。マ
116 イナス記号は減算記号としても使われます。次の例を上の例と比べてみてください: >
118         :echo 0x7f -036
119 <       97 ~
121 式の途中にある空白は無視されますが、可読性を高めるために、適切に空白で区切るこ
122 とをお勧めします。例えば上記の数値が負数であると勘違いしてしまわないように、マ
123 イナス記号と数値の間に空白をいれましょう: >
125         :echo 0x7f - 036
127 ==============================================================================
128 *41.2*  変数
130 変数名にはアルファベット、数字、アンダースコアが使えます。変数名を数字で開始す
131 ることはできません。次のような変数名が使えます:
133         counter
134         _aap3
135         very_long_variable_name_with_underscores
136         FuncLength
137         LENGTH
139 "foo+var" や "6var" のような名前は使えません。
140 例に挙げた変数はグローバル変数です。定義されている変数の一覧を見るのは次のコマ
141 ンドを使います: >
143         :let
145 グローバル変数はどこでも使えます。そのため、あるスクリプトファイルで "count"
146 という変数を使ったとき、その変数は他のスクリプトでも使われている可能性がありま
147 す。これは混乱を招きますし、トラブルの元です。それを避けるには "s:" を付けてス
148 クリプトローカル変数を使います。例えば、次のように使います: >
150         :let s:count = 1
151         :while s:count < 5
152         :  source other.vim
153         :  let s:count += 1
154         :endwhile
156 "s:count" はスクリプトローカル変数なので、他のスクリプトファイルによって変更さ
157 れる心配はありません。他のスクリプトファイルで "s:count" 変数が使われていたと
158 しても、それは別の変数です。スクリプトローカル変数についての詳細は
159 |script-variable| を参照してください。
161 変数の種類は他にもあります。|internal-variables| 参照。次の変数がよく使われま
162 す:
164         b:name          バッファローカル変数
165         w:name          ウィンドウローカル変数
166         g:name          グローバル変数 (関数内では g: 必須)
167         v:name          Vim が定義する変数
170 変数の削除
171 ----------
173 変数はメモリを消費します。":let" コマンドの出力にも表示されます。変数を削除す
174 るには ":unlet" コマンドを使います。例: >
176         :unlet s:count
178 スクリプトローカル変数の "s:count" が削除され、使用されていたメモリが開放され
179 ます。変数が存在しない場合でもエラーを起こしたくない場合は ! を付けてください:
181         :unlet! s:count
183 スクリプトの実行が終了したとき、ローカル変数は自動的には削除されません。次に同
184 じスクリプトを実行したときにその変数を使うことができます。例: >
186         :if !exists("s:call_count")
187         :  let s:call_count = 0
188         :endif
189         :let s:call_count = s:call_count + 1
190         :echo "called" s:call_count "times"
192 "exists()" 関数は変数が定義されているかどうかをチェックします。引数に調べたい
193 変数の名前を指定します。変数自体を指定するのではありません。例えば: >
195         :if !exists(s:call_count)
197 これは、s:call_count の値を変数名として exists() 関数を呼び出しているので、意
198 味が違ってしまいます。
199 感嘆符 (! 記号) は値を反転します。値が真なら偽になり、偽なら真になります。この
200 記号は "not" と読むことができます。つまり、"if !exists()" は "if not exists()"
201 と読むことができます。
202 Vim では、0 以外の値はすべて真です。0 は偽です。
203         Note:
204         数値が必要なところで文字列を使ったとき、文字列は自動的に数値に変換され
205         ます。文字列の先頭が数字ではなかった場合は 0 に変換されます。つまり: >
206                 :if "true"
207 <       "true" は 0 に変換されるので偽になります。
210 文字列変数と定数
211 ----------------
213 ここまでは変数の値に数値だけを使っていましたが、文字列を使うこともできます。
214 Vim は数値と文字列を基本型としてサポートしています。変数は動的に型付けされま
215 す。型は ":let" コマンドで変数に値を代入するたびに変化します。詳しくは|41.8|
216 を参照してください。
217 変数に文字列を代入するには文字列定数を使う必要があります。文字列定数には二つの
218 種類があります。一つはダブルクオート文字列です: >
220         :let name = "peter"
221         :echo name
222 <       peter ~
224 文字列の中でダブルクオートを使いたい場合は、バックスラッシュを前置してくださ
225 い: >
227         :let name = "\"peter\""
228         :echo name
229 <       "peter" ~
231 バックスラッシュを使いたくない場合はシングルクオート文字列を使ってください: >
233         :let name = '"peter"'
234         :echo name
235 <       "peter" ~
237 シングルクオート文字列の中ではすべての文字がそのまま使われます。ただし、シング
238 ルクオートだけは特別で、一つのシングルクオートを表すためには二つのシングルク
239 オートを書く必要があります。バックスラッシュはそのまま使われるので、特殊文字は
240 使えません。
241 ダブルクオート文字列の中では特殊文字が使えます。次のようなものがあります:
243         \t              <Tab>
244         \n              <NL>, 改行
245         \r              <CR>, <Enter>
246         \e              <Esc>
247         \b              <BS>, バックスペース
248         \"              "
249         \\              \, バックスラッシュ
250         \<Esc>          <Esc>
251         \<C-W>          CTRL-W
253 最後の二つはただの一例です。"\<name>" 形式で "name" という特殊キーを使うことが
254 できます。
255 文字列で使える特殊表記については |expr-quote| を参照してください。
257 ==============================================================================
258 *41.3*  式
260 Vim の式は高機能でシンプルです。式の定義については |expression-syntax| を参照
261 してください。ここでは基本的なことだけを説明します。
262 数値と文字列と変数はそれ自体が式です。つまり、式が必要なところでは数値でも文字
263 列でも変数でも使えます。他にも次のようなものが使えます:
265         $NAME           環境変数
266         &name           オプション
267         @r              レジスタ
269 例: >
271         :echo "The value of 'tabstop' is" &ts
272         :echo "Your home directory is" $HOME
273         :if @a > 5
275 &name 形式を使うと、オプションを保存し、別の値に設定し、何かを実行して、オプ
276 ションを元に戻す、というようなことができます。例: >
278         :let save_ic = &ic
279         :set noic
280         :/The Start/,$delete
281         :let &ic = save_ic
283 'ignorecase' オプションをオフにしてから "The Start" パターンを検索しています。
284 しかし設定は変更されません。(パターンに "\C" を加える方法でも同じことができま
285 す。|/\C| 参照。)
288 数値計算
289 --------
291 基本的な要素を組み合わせると面白くなってきます。まずは数値計算です:
293         a + b           加算
294         a - b           減算
295         a * b           乗算
296         a / b           除算
297         a % b           剰余演算(余りを得る)
299 演算子の優先順位は一般的な規則と同じです: >
301         :echo 10 + 5 * 2
302 <       20 ~
304 カッコを使って優先順位を変更できます: >
306         :echo (10 + 5) * 2
307 <       30 ~
309 文字列は "." で連結できます: >
311         :echo "foo" . "bar"
312 <       foobar ~
314 ":echo" コマンドに複数の引数を指定すると、スペースで区切られて表示されます。こ
315 れらの例では一つの式しか使われていないので、スペースは挿入されていません。
317 C 言語と同じ条件演算子も使えます:
319         a ? b : c
321 "a" が真なら "b" が使われ、そうでなければ "c" が使われます。例: >
323         :let i = 4
324         :echo i > 5 ? "i is big" : "i is small"
325 <       i is small ~
327 被演算子の部分は優先的に評価されるので、次のように見なすことができます:
329         (a) ? (b) : (c)
331 ==============================================================================
332 *41.4*  条件式
334 ":if" コマンドは条件が真の場合に ":endif" までのステートメントを実行します。書
335 式は次のとおり:
337         :if {condition}
338            {statements}
339         :endif
341 {condition} を評価した結果が真 (0以外) であれば、{statements} の内容が実行され
342 ます。{statements} は正しく記述されている必要があります。不正な記述があると
343 ":endif" までたどり着けません。
344 ":else" を使うこともできます。書式は次のとおり:
346         :if {condition}
347            {statements}
348         :else
349            {statements}
350         :endif
352 二つ目の {statements} は条件が偽の場合にだけ実行されます。
353 ":elseif" を使うこともできます:
355         :if {condition}
356            {statements}
357         :elseif {condition}
358            {statements}
359         :endif
361 これは ":else" に続けて "if" 文を使うのと同じ動作ですが、余計な ":endif" を使
362 わなくて済みます。
363 vimrc ファイルで便利に使える例を示しましょう。'term' オプションの値を調べ、そ
364 の値に応じて処理を分けます: >
366         :if &term == "xterm"
367         :  " xterm 用の設定
368         :elseif &term == "vt100"
369         :  " vt100 端末用の設定
370         :else
371         :  " その他の端末用の設定
372         :endif
375 論理演算子
376 ----------
378 今までの説明で既に論理演算子を使いました。次の演算子がよく使われます:
380         a == b          等しい
381         a != b          等しくない
382         a >  b          より大きい
383         a >= b          より大きいか等しい
384         a <  b          より小さい
385         a <= b          より小さいか等しい
387 条件が成立するなら 1、そうでなければ 0 が返ります。例: >
389         :if v:version >= 700
390         :  echo "おめでとう"
391         :else
392         :  echo "古いバージョンを使っています。更新してね!"
393         :endif
395 "v:version" は Vim によって定義されている変数で、Vim のバージョンが入っていま
396 す。バージョン 6.0 なら 600、バージョン 6.1 なら 601 です。これは複数のバー
397 ジョンに対応するスクリプトを書くときに便利です。|v:version|
399 論理演算子は数値でも文字列でも扱えます。文字列どうしを比較するときは数学的な差
400 が比較されます。文字のバイト値を比較するので、一部の言語では正しい結果にならな
401 いかもしれません。
402 文字列と数値を比較するときは、文字列を数値に変換します。文字列が数字ではなかっ
403 たときは 0 になるので注意してください。例: >
405         :if 0 == "one"
406         :  echo "yes"
407         :endif
409 これは "yes" と表示されます。"one" は数字ではないので 0 に変換されるのです。
411 文字列にはさらに二つの論理演算子があります:
413         a =~ b          パターンにマッチする
414         a !~ b          パターンにマッチしない
416 左辺の "a" は文字列として扱われます。右辺の "b" は検索パターンとして扱われま
417 す。例: >
419         :if str =~ " "
420         :  echo "str にはスペースが含まれている"
421         :endif
422         :if str !~ '\.$'
423         :  echo "str の末尾はピリオドではない"
424         :endif
426 パターンを指定するのにシングルクオート文字列を使うのがコツです。ダブルクオート
427 文字列ではバックスラッシュを二重に書く必要があり、そして、検索パターンではバッ
428 クスラッシュをよく使うので、バックスラッシュだらけになってしまいます。
430 文字列を比較するときは 'ignorecase' オプションが使われます。大文字小文字の区別
431 を明示的に指定したい場合は比較演算子に "#" (区別する) または "?" (区別しない)
432 をつけます。大文字小文字を区別せずに等しいかどうかを比較したい場合は "==?" を
433 使います。"!~#" ならパターンにマッチしないことを、大文字と小文字を区別して確認
434 できます。演算子の一覧は |expr-==| を参照してください。
437 他のループコマンド
438 ------------------
440 ":while" コマンドは既に説明しました。":while" ループの中では二つのステートメン
441 トが使えます:
443         :continue               ループの先頭にジャンプしてループを継続する。
444         :break                  ":endwhile" までジャンプしてループを脱ける。
446 例: >
448         :while counter < 40
449         :  call do_something()
450         :  if skip_flag
451         :    continue
452         :  endif
453         :  if finished_flag
454         :    break
455         :  endif
456         :  sleep 50m
457         :endwhile
459 ":sleep" コマンドは Vim を一定時間停止します。"50m" は 50 ミリ秒です。
460 ":sleep 4" なら 4 秒間スリープします。
462 ":for" コマンドを使ってループすることもできます。|41.8|を参照。
464 ==============================================================================
465 *41.5*  式を実行する
467 今まではコマンドを直接書いてきました。":execute" コマンドを使うと、式の評価結
468 果をコマンドとして実行できます。これによってコマンドを動的に生成することができ
469 ます。
470 例えば、変数に格納された文字列を使ってタグジャンプするには次のようにします: >
472         :execute "tag " . tag_name
474 文字列 "tag " と変数 "tag_name" の値を "." で連結しています。仮に "tag_name"
475 の値が "get_cmd" だった場合、次のコマンドが実行されることになります: >
477         :tag get_cmd
479 ":execute" コマンドはコロンコマンドのみ実行できます。":normal" コマンドでノー
480 マルモードコマンドを実行できますが、このコマンドの引数は文字がそのまま使われ、
481 式としては評価されません。例: >
483         :normal gg=G
485 このコマンドは一行目にジャンプしてから "=" オペレータですべての行を整形しま
486 す。
487 ":normal" コマンドで式の値を使いたい場合は ":execute" と組み合わせてください。
488 例: >
490         :execute "normal " . normal_commands
492 変数 "normal_commands" にはノーマルモードコマンドを入れておく必要があります。
493 ":normal" には完結したコマンドを指定するようにしてください。引数が最後まで実行
494 された段階でコマンドは中断されます。例えば、インサートモードを開始した場合はイ
495 ンサートモードを終了しなくてはなりません。次のコマンドは正しく動作します: >
497         :execute "normal Inew text \<Esc>"
499 これは現在行に "new text" を挿入します。特殊キー "\<ESC>" を使っていることに注
500 目してください。これによりスクリプトの中で本物の <Esc> 文字を使わないですみま
501 す。
503 文字列を実行するのではなく、その式の値を得たい場合は、eval() 関数を使います: >
505         :let optname = "path"
506         :let optval = eval('&' . optname)
508 文字 "&" と "path" を連結しているので eval() の引数は "&path" になります。返り
509 値は 'path' オプションの値です。
510 次のようにすることもできます: >
511         :exe 'let optval = &' . optname
513 ==============================================================================
514 *41.6*  関数を使う
516 たくさんの関数があらかじめ定義され、豊富な機能が提供されています。このセクショ
517 ンの説明にもいくつか登場します。関数の一覧は |functions| を参照してください。
519 関数は ":call" コマンドで呼び出します。引数はカッコで囲み、それぞれをカンマで
520 区切ります。例: >
522         :call search("Date: ", "W")
524 これは "Date: " と "W" を引数にして search() 関数を呼び出しています。search()
525 関数は一つ目の引数を検索パターンとして使い、二つ目の引数をフラグとして使いま
526 す。"W" フラグを指定するとファイル末尾で検索が終了します (折り返さない)。
528 関数は式の中で使うこともできます。例: >
530         :let line = getline(".")
531         :let repl = substitute(line, '\a', "*", "g")
532         :call setline(".", repl)
534 getline() 関数はカレントバッファから行を取得する関数です。引数には行番号を指定
535 します。この例では "." ですが、これはカーソルのある行を示します。
536 substitute() 関数は ":substitute" コマンドとほぼ同じです。最初の引数は置換対象
537 の文字列、二つ目の引数はパターン、三つ目は置き換え文字列、最後はフラグです。
538 setline() 関数は行の内容を置き換えます。最初の引数は行番号、二つ目の引数は置き
539 換える文字列です。この例では、substitute() の結果で現在行を置き換えています。
540 上記の三行のコマンドは次のコマンドと同じことをしています: >
542         :substitute/\a/*/g
544 substitute() コマンドの前後にいろいろな処理を入れたりすると、もっと面白いこと
545 ができるようになります。
548 関数一覧                                            *function-list*
549 --------
551 たくさんの関数があります。ここでは機能別に分類して紹介します。アルファベット順
552 の一覧は |functions| を参照してください。関数の名前の上で CTRL-] を押すと、詳
553 細な説明にジャンプできます。
555 文字列繰作:
556         nr2char()               ASCII値から文字を得る
557         char2nr()               文字のASCII値を得る
558         str2nr()                文字列を数値に変換する
559         str2float()             文字列を浮動小数点数に変換する
560         printf()                書式付き文字列を整形する
561         escape()                文字列の特定の文字を '\' でエスケープ
562         shellescape()           シェルコマンドで使えるように文字列をエスケープ
563         fnameescape()           Vim コマンド用にファイル名をエスケープ
564         tr()                    ある文字の集合から別の文字の集合へ置換する
565         strtrans()              文字列を印刷可能な状態とする
566         tolower()               文字列を小文字にする
567         toupper()               文字列を大文字にする
568         match()                 文字列の中でパターンにマッチした位置
569         matchend()              文字列の中でパターンにマッチした末尾の位置
570         matchstr()              文字列の中でパターンにマッチした文字列
571         matchlist()             matchstr()と同様だが、部分マッチも返す
572         stridx()                文字列の中で部分文字列が見つかった最初の位置
573         strridx()               文字列の中で部分文字列が見つかった最後の位置
574         strlen()                文字列の長さ
575         substitute()            パターンにマッチする文字列を置換
576         submatch()              ":substitute" の中で部分マッチを得る
577         strpart()               文字列の一部分を得る
578         expand()                特殊キーワードを展開する
579         iconv()                 テキストのエンコーディングを変換する
580         byteidx()               文字列中の文字のバイトインデックス
581         repeat()                文字列を複数回繰り返す
582         eval()                  文字列を式として評価する
584 リスト操作:
585         get()                   要素を取得。存在しないインデックスでもエラーを
586                                 出さない
587         len()                   リスト中の要素の個数
588         empty()                 リストが空であるか判定する
589         insert()                リストの任意の位置に要素を挿入する
590         add()                   リストに要素を追加する
591         extend()                リストにリストを連結する
592         remove()                リストから1個以上の要素を取り除く
593         copy()                  リストの浅いコピーを作成する
594         deepcopy()              リストの完全なコピーを作成する
595         filter()                リストから選択された要素を取り除く
596         map()                   リストの各要素を変換する
597         sort()                  リストをソートする
598         reverse()               リストの並び順を反転させる
599         split()                 文字列を分割し、リストにする
600         join()                  リストの要素を連結し、文字列にする
601         range()                 数列リストを返す
602         string()                リストの文字列表現
603         call()                  リストを引数として関数を呼ぶ
604         index()                 リスト中の要素のインデックス
605         max()                   リスト中の最大値
606         min()                   リスト中の最小値
607         count()                 ある要素がリスト中に出現する回数を返す
608         repeat()                リストを複数回繰り返す
610 辞書操作:
611         get()                   辞書の要素を返す。存在しないキーでもエラーを出
612                                 さない
613         len()                   辞書の要素の個数
614         has_key()               あるキーが辞書に含まれているか判定する
615         empty()                 辞書が空であるか判定する
616         remove()                辞書から要素を取り除く
617         extend()                ある辞書の要素をすべて別の辞書に追加する
618         filter()                辞書から選択された要素を取り除く
619         map()                   辞書の各要素を変換する
620         keys()                  辞書の全キーのリストを取得する
621         values()                辞書の全値のリストを取得する
622         items()                 辞書の全キー・値のペアを取得する
623         copy()                  辞書の浅いコピーを作成する
624         deepcopy()              辞書の完全なコピーを作成する
625         string()                辞書の文字列表現
626         max()                   辞書中の最大値
627         min()                   辞書中の最小値
628         count()                 ある値が出現する回数を返す
630 浮動小数点数の計算:
631         float2nr()              Float を Number に変換
632         abs()                   絶対値 (Numberも処理可能)
633         round()                 丸め
634         ceil()                  切り上げ
635         floor()                 切り下げ
636         trunc()                 少数切り捨て
637         log10()                 10 を底とする対数
638         pow()                   x の y 乗
639         sqrt()                  平方根
640         sin()                   sine (サイン)
641         cos()                   cosine (コサイン)
642         atan()                  arc tangent (アークタンジェント)
644 変数:
645         type()                  変数の型
646         islocked()              変数がロックされているか判定する
647         function()              関数名からFuncrefを取得する
648         getbufvar()             指定バッファの変数値を得る
649         setbufvar()             指定バッファに変数を設定する
650         getwinvar()             指定ウィンドウの変数値を得る
651         gettabwinvar()          指定ウィンドウ・タブページから変数値を取得する
652         setwinvar()             指定ウィンドウに変数を設定する
653         settabwinvar()          指定ウィンドウ・タブページに変数を設定する
654         garbagecollect()        開放可能なメモリを解放する
656 カーソルとマークの位置:
657         col()                   カーソルやマークの列番号を得る
658         virtcol()               カーソルやマークの画面上の列番号を得る
659         line()                  カーソルやマークの行番号を得る
660         wincol()                カーソルのウィンドウでの列番号
661         winline()               カーソルのウィンドウでの行番号
662         cursor()                カーソルを指定した位置に移動させる
663         getpos()                カーソルやマークなどの位置を取得する
664         setpos()                カーソルやマークなどの位置を設定する
665         byte2line()             指定のバイト位置の行番号を得る
666         line2byte()             指定の行のバイト位置を得る
667         diff_filler()           ある行より上の詰め行の数を取得する
669 カレントバッファで動作するもの:
670         getline()               バッファから行を得る
671         setline()               バッファの行を置き換える
672         append()                行または行のリストをバッファに追加する
673         indent()                行のインデントを得る
674         cindent()               C 言語におけるインデントを得る
675         lispindent()            Lisp 言語におけるインデントを得る
676         nextnonblank()          次の非空行を探す
677         prevnonblank()          前の非空行を探す
678         search()                パターンにマッチする場所を探す
679         searchpos()             パターンにマッチする場所を探す
680         searchpair()            start/skip/end の対を探す
681         searchpairpos()         start/skip/end の対を探す
682         searchdecl()            名前が宣言されている場所を探す
684 システム関数とファイル繰作:
685         glob()                  ワイルドカードを展開する
686         globpath()              複数のディレクトリを対象にワイルドカードを展開
687         findfile()              複数のディレクトリからファイルを探す
688         finddir()               複数のディレクトリからディレクトリを探す
689         resolve()               ショートカットのリンク先を得る
690         fnamemodify()           ファイル名を修飾する
691         pathshorten()           パス中のディレクトリ名を短くする
692         simplify()              パスの意味を変えずに簡略化する
693         executable()            実行形式ファイルかどうかをチェックする
694         filereadable()          ファイルが読み込み可能かどうかをチェックする
695         filewritable()          ファイルが書き込み可能かどうかをチェックする
696         getfperm()              ファイルのパーミッションを得る
697         getftype()              ファイルの種類を得る
698         isdirectory()           ディレクトリの存在をチェックする
699         getfsize()              ファイルのサイズを得る
700         getcwd()                カレントディレクトリを得る
701         tempname()              一時ファイルの名前を得る
702         mkdir()                 ディレクトリを作成する
703         delete()                ファイルを削除する
704         rename()                ファイルの名前を変更する
705         system()                シェルコマンドを実行し、その結果を得る
706         hostname()              システムの名称を得る
707         readfile()              ファイルを読み込み、行のリストを得る
708         writefile()             行のリストをファイルに書き込む
710 日付と時刻:
711         getftime()              ファイルの最終更新日時を得る
712         localtime()             現在時刻を秒単位で得る
713         strftime()              時刻を文字列に変換する
714         reltime()               現在時刻または経過時間を正確に取得する
715         reltimestr()            reltime()の結果を文字列に変換する
717 バッファ、ウィンドウ、引数リスト:
718         argc()                  引数リストの大きさ
719         argidx()                引数リスト中の現在の位置
720         argv()                  引数リストの中身を得る
721         bufexists()             バッファの存在をチェックする
722         buflisted()             バッファが存在し、リストされているかどうか
723         bufloaded()             バッファが存在し、ロードされているかどうか
724         bufname()               バッファの名前を得る
725         bufnr()                 バッファの番号を得る
726         tabpagebuflist()        タブページ中のバッファのリストを返す
727         tabpagenr()             タブページの番号を取得する
728         tabpagewinnr()          タブページを対象にwinnr()と同様
729         winnr()                 カレントウィンドウの番号を得る
730         bufwinnr()              バッファのウィンドウ番号を得る
731         winbufnr()              ウィンドウのバッファ番号を得る
732         getbufline()            バッファの行のリストを得る
734 コマンドライン:
735         getcmdline()            現在のコマンドラインを取得
736         getcmdpos()             コマンドラインにおけるカーソル位置を取得
737         setcmdpos()             コマンドラインにおけるカーソル位置を設定
738         getcmdtype()            現在のコマンドラインの種類を返す
740 Quickfixとロケーションリスト:
741         getqflist()             quickfixエラーのリスト
742         setqflist()             quickfixを変更する
743         getloclist()            ロケーションリストの項目のリスト
744         setloclist()            ロケーションリストを変更する
746 インサートモード補完:
747         complete()              補完候補を設定する
748         complete_add()          補完候補を追加する
749         complete_check()        補完処理を終えるべきかどうかをチェックする
750         pumvisible()            ポップアップメニューが表示されているかチェック
752 折り畳み:
753         foldclosed()            行が折り畳まれているかどうかをチェックする
754         foldclosedend()         foldclosed()と同様。折り畳み末尾の行番号を返す
755         foldlevel()             行の折り畳みレベルを得る
756         foldtext()              閉じた折り畳みを代替表示するテキストを生成
757         foldtextresult()        閉じた折り畳みを代替表示するテキストを得る
759 シンタックスハイライト:
760         clearmatches()          |matchadd()|と|:match|コマンドで定義されたマッ
761                                 チをクリアする
762         getmatches()            |matchadd()|と|:match|コマンドで定義されたすべ
763                                 てのマッチを得る
764         hlexists()              ハイライトグループの存在をチェック
765         hlID()                  ハイライトグループのIDを得る
766         synID()                 指定位置のシンタックスIDを得る
767         synIDattr()             シンタックスIDから指定の属性を得る
768         synIDtrans()            変換したシンタックスIDを得る
769         diff_hlID()             diffモードの指定位置のシンタックスIDを得る
770         matchadd()              強調表示するパターンを定義する
771         matcharg()              |:match|の引数の情報を得る
772         matchdelete()           |matchadd()|と|:match|コマンドで定義されたマッ
773                                 チを削除する
774         setmatches()            |getmatches()|で得たマッチを使って復元する
776 スペリング:
777         spellbadword()          カーソル位置以降のスペルミスを探す
778         spellsuggest()          スペル訂正の候補を返す
779         soundfold()             単語の同音等値(sound-a-like equivalent)を返す
781 履歴:
782         histadd()               履歴に項目を追加
783         histdel()               履歴から項目を削除
784         histget()               履歴の項目を得る
785         histnr()                履歴リストの最大インデックスを得る
787 対話インターフェース:
788         browse()                ファイル選択ダイアログを開く
789         browsedir()             ディレクトリ選択ダイアログを開く
790         confirm()               ユーザーに選択をさせる
791         getchar()               ユーザーが入力した文字を得る
792         getcharmod()            最後に入力した文字の修飾子(modifier)を得る
793         feedkeys()              先行入力キューに文字を入れる
794         input()                 ユーザーが入力した行を得る
795         inputlist()             ユーザーにリストから項目を選択させる
796         inputsecret()           ユーザーが入力した行を得る。ただし表示はしない
797         inputdialog()           ダイアログを使ってユーザーが入力した行を得る
798         inputsave()             先行入力キューを保存して空にする
799         inputrestore()          inputsave()で保存した状態に戻す
801 GUI:
802         getfontname()           現在使われているフォントの名前を取得
803         getwinposx()            GUIのVimウィンドウのX座標
804         getwinposy()            GUIのVimウィンドウのY座標
806 Vimサーバ:
807         serverlist()            サーバ名のリストを返す
808         remote_send()           Vimサーバにコマンド文字を送る
809         remote_expr()           Vimサーバで式を評価する
810         server2client()         Vimサーバのクライアントに応答を返す
811         remote_peek()           Vimサーバから返信があったかどうかをチェック
812         remote_read()           Vimサーバからの返信を読む
813         foreground()            Vimのウィンドウを前面に持ってくる
814         remote_foreground()     Vimサーバのウィンドウを前面に持ってくる
816 ウィンドウサイズと位置:
817         winheight()             ウィンドウの高さを取得
818         winwidth()              ウィンドウの幅を取得
819         winrestcmd()            ウィンドウサイズを復元するコマンドを返す
820         winsaveview()           カレントウィンドウのビューを取得
821         winrestview()           カレントウィンドウのビューを復元
823 その他:
824         mode()                  現在の編集モードを得る
825         visualmode()            最後に使われたビジュアルモードの種類
826         hasmapto()              マップの存在をチェック
827         mapcheck()              マッチするマップの存在をチェック
828         maparg()                マップのrhs(展開結果)を得る
829         exists()                変数、関数の存在をチェック
830         has()                   機能がサポートされているかをチェック
831         changenr()              最近の変更番号を返す
832         cscope_connection()     cscope接続をチェック
833         did_filetype()          FileTypeオートコマンドが使用されたかどうか
834         eventhandler()          イベントハンドラによって起動されたかどうか
835         getpid()                Vim のプロセスIDを得る
837         libcall()               外部ライブラリの関数を呼ぶ
838         libcallnr()             同上、数値を返す
840         getreg()                レジスタの値を得る
841         getregtype()            レジスタのタイプを得る
842         setreg()                レジスタの値を設定する
844         taglist()               マッチするタグのリストを取得
845         tagfiles()              タグファイルのリストを取得
847 ==============================================================================
848 *41.7*  関数を定義する
850 自分で関数を定義することができます。基本的な関数定義は次のとおり: >
852         :function {name}({var1}, {var2}, ...)
853         :  {body}
854         :endfunction
856         Note:
857         関数名は大文字で開始する必要があります。
859 小さな関数を定義してみましょう。二つの数値のうち小さい方を返す関数を作ります。
860 関数は次のような行で始まります: >
862         :function Min(num1, num2)
864 関数の名前が "Min" であり、二つの引数 ("num1"と"num2") を取る、ということを表
865 しています。
866 最初にしなければならないのは、どちらの数値が小さいかをチェックすることです: >
868         :  if a:num1 < a:num2
870 "a:" は特殊なプレフィクスで、この変数が関数の引数であることを示します。小さい
871 方の値を変数 "smaller" に代入しましょう: >
873         :  if a:num1 < a:num2
874         :    let smaller = a:num1
875         :  else
876         :    let smaller = a:num2
877         :  endif
879 変数 "smaller" はローカル変数です。関数の中で使われた変数はローカル変数になり
880 ます。ただし、"g:"、"a:"、"s:" などのプレフィクスを付けた場合は別です。
882         Note:
883         関数の内からグローバル変数にアクセスするには "g:" を付ける必要がありま
884         す。つまり、関数内では "g:today" はグローバル変数 "today" を示し、
885         "today" ならそれとは別の変数、すなわちローカル変数になります。
887 ":return" ステートメントを使って、小さい方の値を呼び出し元に返しましょう。そし
888 て、関数を閉じます: >
890         :  return smaller
891         :endfunction
893 関数定義の全体は次のようになります: >
895         :function Min(num1, num2)
896         :  if a:num1 < a:num2
897         :    let smaller = a:num1
898         :  else
899         :    let smaller = a:num2
900         :  endif
901         :  return smaller
902         :endfunction
904 関数を短く書きたい場合は、次のようにもできます: >
906         :function Min(num1, num2)
907         :  if a:num1 < a:num2
908         :    return a:num1
909         :  endif
910         :  return a:num2
911         :endfunction
913 ユーザー定義関数は組み込み関数とまったく同じ方法で呼び出すことができます。違う
914 のは名前だけです。Min 関数は次のように使用できます: >
916         :echo Min(5, 8)
918 関数が実行され、関数の中身が Vim によって解釈されます。未定義の変数や関数を使
919 うなどの間違いがあったときは、エラーメッセージが表示されます。関数定義の時点で
920 はそれらのエラーは検出されません。
922 関数が ":endfunction" まで実行されたとき、あるいは引数無しで ":return" を使っ
923 たときは 0 が返ります。
925 既存の関数を再定義したい場合は ":function" コマンドに "!" を付けてください: >
927         :function!  Min(num1, num2, num3)
930 範囲指定を使う
931 --------------
933 ":call" コマンドは行範囲を受け取ることができます。範囲指定の使用方法は二つあり
934 ます。関数を定義するときに "range" キーワードを使った場合は、関数自身が範囲指
935 定を処理します。
936 関数には "a:firstline" と "a:lastline" という二つの変数が暗黙的に渡されます。
937 この二つの変数には範囲指定された行番号が代入されています。例: >
939         :function Count_words() range
940         :  let lnum = a:firstline
941         :  let n = 0
942         :  while lnum <= a:lastline
943         :    let n = n + len(split(getline(lnum)))
944         :    let lnum = lnum + 1
945         :  endwhile
946         :  echo "found " . n . " words"
947         :endfunction
949 この関数は次のように呼び出すことができます: >
951         :10,30call Count_words()
953 関数が一度だけ実行され、単語の数が表示されます。
954 関数を定義するときに "range" キーワードを使わなかった場合は、指定された範囲の
955 それぞれの行に対して関数が呼ばれます (カーソルはその行の上)。例: >
957         :function  Number()
958         :  echo "line " . line(".") . " contains: " . getline(".")
959         :endfunction
961 次のように実行すると: >
963         :10,15call Number()
965 関数は 6 回実行されます。
968 可変長引数
969 ----------
971 可変個の引数を取る関数を定義できます。例えば、次の関数は、必ず 1 つの引数
972 (start) を取り、最大で 20 個までの引数を取ることができます: >
974         :function Show(start, ...)
976 変数 "a:1" に 1 つ目のオプション引数が代入されます。2 つ目が "a:2" で、3 つ目
977 が "a:3" です。"a:0" にはオプション引数の数が入ります。
978 例: >
980         :function Show(start, ...)
981         :  echohl Title
982         :  echo "Show is " . a:start
983         :  echohl None
984         :  let index = 1
985         :  while index <= a:0
986         :    echon "  Arg " . index . " is " . a:{index}
987         :    let index = index + 1
988         :  endwhile
989         :  echo ""
990         :endfunction
992 この関数は ":echohl" を使って ":echo" の出力に色を付けています。":echohl None"
993 で色付けをやめます。":echon" コマンドは ":echo" と同じ機能ですが、改行を出力し
994 ません。
996 変数 a:000 を使うこともできます。これは "..." 引数がすべて入ったリストです。
997 |a:000|を参照。
1000 関数の一覧
1001 ----------
1003 ":function" コマンドでユーザー定義関数の一覧を表示できます: >
1005         :function
1006 <       function Show(start, ...) ~
1007         function GetVimIndent() ~
1008         function SetSyn(name) ~
1010 関数の中身を見たいときは関数名を指定してください: >
1012         :function SetSyn
1013 <       1     if &syntax == '' ~
1014         2       let &syntax = a:name ~
1015         3     endif ~
1016            endfunction ~
1019 デバッグ
1020 --------
1022 エラーメッセージが表示されたとき、あるいはデバッグ中に、行番号が表示されると便
1023 利です。デバッグモードについては |debug-scripts| を参照してください。
1024 'verbose' オプションに 12 以上の値を設定すると、すべての関数呼び出しが表示され
1025 ます。15 以上にすると、実行されたすべての行が表示されます。
1028 関数の削除
1029 ----------
1031 例えば Show() 関数を削除するのは次のようにします: >
1033         :delfunction Show
1035 関数が存在しない場合はエラーになります。
1038 関数への参照
1039 ------------
1041 変数に関数を代入できると便利なことがあります。それには function() 関数を使いま
1042 す。function() は関数の名前を受け取り、関数への参照を返します: >
1044         :let result = 0         " or 1
1045         :function! Right()
1046         :  return 'Right!'
1047         :endfunc
1048         :function! Wrong()
1049         :  return 'Wrong!'
1050         :endfunc
1051         :
1052         :if result == 1
1053         :  let Afunc = function('Right')
1054         :else
1055         :  let Afunc = function('Wrong')
1056         :endif
1057         :echo call(Afunc, [])
1058 <       Wrong! ~
1060 Note 関数への参照を保持する変数の名前は大文字で始めなければなりません。そうで
1061 ないと組み込み関数の名前と紛らわしくなります。
1062 変数が参照している関数を呼び出すには call() 関数を使います。call() 関数の最初
1063 の引数は関数への参照で、2 番目の引数は引数のリストです。
1065 関数への参照は、次節で説明される辞書と組み合わせたときもっとも役に立ちます。
1067 ==============================================================================
1068 *41.8*  リストと辞書
1070 ここまでは基本型(文字列と数値)を扱ってきました。Vim は二つの複合型、リストと辞
1071 書もサポートしています。
1073 リストとは、要素を順番に並べたものです。要素はどのような型でも構いません。数値
1074 のリスト、リストのリスト、あるいは複数の型が混在したリストでも作れます。例え
1075 ば、3 個の文字列からなるリストを作るには次のようにします: >
1077         :let alist = ['aap', 'mies', 'noot']
1079 リストの要素は角括弧で囲み、コンマで区切ります。空のリストを作るには次のように
1080 します: >
1082         :let alist = []
1084 関数add()を使うとリストに要素を追加することができます: >
1086         :let alist = []
1087         :call add(alist, 'foo')
1088         :call add(alist, 'bar')
1089         :echo alist
1090 <       ['foo', 'bar'] ~
1092 リストの連結には + を使います: >
1094         :echo alist + ['foo', 'bar']
1095 <       ['foo', 'bar', 'foo', 'bar'] ~
1097 直接リストを拡張するには次のようにします: >
1099         :let alist = ['one']
1100         :call extend(alist, ['two', 'three'])
1101         :echo alist
1102 <       ['one', 'two', 'three'] ~
1104 add()とは効果が異なることに注意してください: >
1106         :let alist = ['one']
1107         :call add(alist, ['two', 'three'])
1108         :echo alist
1109 <       ['one', ['two', 'three']] ~
1111 add()の第二引数は1つの要素として追加されます。
1114 FOR ループ
1115 ----------
1117 リストを使ってできる素晴らしいことの1つが、リストに対する繰り返しです: >
1119         :let alist = ['one', 'two', 'three']
1120         :for n in alist
1121         :  echo n
1122         :endfor
1123 <       one ~
1124         two ~
1125         three ~
1127 上の例は、リスト"alist"の各要素に対して、その値を変数"n"に代入しながらループを
1128 行います。forループの書式は次の通りです: >
1130         :for {varname} in {listexpression}
1131         :  {commands}
1132         :endfor
1134 ある回数だけループするには、その長さのリストを使います。関数range()を使うと、
1135 そのようなリストを作成できます: >
1137         :for a in range(3)
1138         :  echo a
1139         :endfor
1140 <       0 ~
1141         1 ~
1142         2 ~
1144 range()が生成するリストの最初の要素は0であることに注意してください。そのため、
1145 最後の要素はリストの長さより1小さい値になります。
1146 最大値、ステップ幅を指定することもでき、逆方向に進むこともできます: >
1148         :for a in range(8, 4, -2)
1149         :  echo a
1150         :endfor
1151 <       8 ~
1152         6 ~
1153         4 ~
1155 より有用な例として、バッファ中の行に対するループ: >
1157         :for line in getline(1, 20)
1158         :  if line =~ "Date: "
1159         :    echo matchstr(line, 'Date: \zs.*')
1160         :  endif
1161         :endfor
1163 1行目から20行目(両端を含む)を調べ、そこに含まれる日付を全て表示しています。
1166 辞書
1167 -----
1169 辞書はキーと値のペアを保持します。キーを指定することで高速に値を検索できます。
1170 辞書は波括弧で作ります: >
1172         :let uk2nl = {'one': 'een', 'two': 'twee', 'three': 'drie'}
1174 そして角括弧の中にキーを書くことで単語を検索します: >
1176         :echo uk2nl['two']
1177 <       twee ~
1179 辞書の定義の書式は次の通りです: >
1181         {<key> : <value>, ...}
1183 空の辞書とは、どんなキーも持たない辞書のことです: >
1185         {}
1187 辞書にはいろいろな使い道があります。辞書を扱う関数もたくさんあります。例えば、
1188 キーのリストを取得してそれに対してループするには次のようにします: >
1190         :for key in keys(uk2nl)
1191         :  echo key
1192         :endfor
1193 <       three ~
1194         one ~
1195         two ~
1197 キーはソートされていません。特定の順序に並べるにはリストをソートします: >
1199         :for key in sort(keys(uk2nl))
1200         :  echo key
1201         :endfor
1202 <       one ~
1203         three ~
1204         two ~
1206 要素が定義された順序を得ることはできません。そのような目的にはリストを使ってく
1207 ださい。リストは順序を保って要素を保持します。
1210 辞書の関数
1211 ----------
1213 辞書の要素は角括弧でインデックスを指定して取得します: >
1215         :echo uk2nl['one']
1216 <       een ~
1218 記号を使わない方法もあります: >
1220         :echo uk2nl.one
1221 <       een ~
1223 この方法はキーがアルファベット、数字、アンダースコアなどの ASCII 文字だけで構
1224 成されている場合に使えます。この方法で値を代入することもできます: >
1226         :let uk2nl.four = 'vier'
1227         :echo uk2nl
1228 <       {'three': 'drie', 'four': 'vier', 'one': 'een', 'two': 'twee'} ~
1230 関数の定義と辞書への代入を同時に記述することができます: >
1232         :function uk2nl.translate(line) dict
1233         :  return join(map(split(a:line), 'get(self, v:val, "???")'))
1234         :endfunction
1236 これを実行してみましょう: >
1238         :echo uk2nl.translate('three two five one')
1239 <       drie twee ??? een ~
1241 ":function" の行の末尾に "dict" と書かれています。これは、その関数が辞書から使
1242 われることを示します。ローカル変数 "self" がその辞書を指すようになります。
1243 次に、複雑なreturnコマンドを分解してみましょう: >
1245         split(a:line)
1247 関数split()は文字列を空白文字で区切り、リストにして返します。そのため、この例
1248 での戻り値は次のようになります: >
1250         :echo split('three two five one')
1251 <       ['three', 'two', 'five', 'one'] ~
1253 このリストがmap()関数の第一引数になります。map()はリストの各要素を "v:val" に
1254 代入した状態で第二引数を評価します。これによりforループより短いコードが書けま
1255 す。このコードは: >
1257         :let alist = map(split(a:line), 'get(self, v:val, "???")')
1259 次のコードと同じです: >
1261         :let alist = split(a:line)
1262         :for idx in range(len(alist))
1263         :  let alist[idx] = get(self, alist[idx], "???")
1264         :endfor
1266 関数get()はそのキーが辞書に入っているかをチェックします。入っていればその値を
1267 返します。入っていなければデフォルト値(この例では'???')を返します。キーが入っ
1268 ていなくてもエラーを起こしたくないような場合に便利です。
1270 関数join()はsplit()の逆の処理をします。つまり単語のリストをスペースでつなげま
1271 す。
1272 split()、map()、join() を組み合わせると、単語からなる行を簡潔に処理することが
1273 できます。
1276 オブジェクト指向プログラミング
1277 ------------------------------
1279 辞書には値と関数を入れることができるので、辞書をオブジェクトとして使うことがで
1280 きます。
1281 上述の例ではオランダ語から英語に翻訳するために辞書を使いました。同じことが他の
1282 言語でもできると面白いかもしれませんね。まず翻訳関数を持ったオブジェクト (つま
1283 り辞書) を作ります。翻訳する単語はまだ定義しません: >
1285         :let transdict = {}
1286         :function transdict.translate(line) dict
1287         :  return join(map(split(a:line), 'get(self.words, v:val, "???")'))
1288         :endfunction
1290 単語を翻訳するのに 'self.words' を使う点が上述の例と少し違います。しかし、
1291 self.words はまだありません。よって、これは抽象クラスと呼ぶことができます。
1293 オランダ語を翻訳するオブジェクトをインスタンス化してみましょう: >
1295         :let uk2nl = copy(transdict)
1296         :let uk2nl.words = {'one': 'een', 'two': 'twee', 'three': 'drie'}
1297         :echo uk2nl.translate('three one')
1298 <       drie een ~
1300 さらにドイツ語の翻訳機を作ります: >
1302         :let uk2de = copy(transdict)
1303         :let uk2de.words = {'one': 'ein', 'two': 'zwei', 'three': 'drei'}
1304         :echo uk2de.translate('three one')
1305 <       drei ein ~
1307 copy() 関数を使って "transdict" 辞書をコピーし、そのコピーに対して単語を追加し
1308 ています。元の辞書はもちろん変更されません。
1310 さらに一歩進んで、適切な言語を選択できるようにしてみます: >
1312         :if $LANG =~ "de"
1313         :  let trans = uk2de
1314         :else
1315         :  let trans = uk2nl
1316         :endif
1317         :echo trans.translate('one two three')
1318 <       een twee drie ~
1320 "trans"は2つのオブジェクト(辞書)のうちどちらか1つを参照します。コピーは作られ
1321 ていません。リストと辞書の同一性についてのより詳しい情報は|list-identity|と
1322 |dict-identity|にあります。
1324 未対応の言語を使う場合は、translate() 関数を上書きして何もしないようにするとい
1325 いかもしれません: >
1327         :let uk2uk = copy(transdict)
1328         :function! uk2uk.translate(line)
1329         :  return a:line
1330         :endfunction
1331         :echo uk2uk.translate('three one wladiwostok')
1332 <       three one wladiwostok ~
1334 ! を使って既に存在している関数への参照を上書きしています。続いて、未対応の言語
1335 に対して "uk2uk" を使うように変更します: >
1337         :if $LANG =~ "de"
1338         :  let trans = uk2de
1339         :elseif $LANG =~ "nl"
1340         :  let trans = uk2nl
1341         :else
1342         :  let trans = uk2uk
1343         :endif
1344         :echo trans.translate('one two three')
1345 <       one two three ~
1347 さらなる情報については|List|と|Dictionaries|を参照してください。
1349 ==============================================================================
1350 *41.9*  例外
1352 まずは例題を見てください: >
1354         :try
1355         :   read ~/templates/pascal.tmpl
1356         :catch /E484:/
1357         :   echo "パスカル用のテンプレートファイルは見つかりませんでした。"
1358         :endtry
1360 ":read" コマンドはファイルがなければ失敗します。そのエラーをキャッチして、エ
1361 ラーメッセージの代わりにより親切なメッセージを表示しています。
1363 ":try" と ":endtry" の間で起きたエラーは例外に変わります。例外は文字列です。エ
1364 ラーが例外に変わったとき、文字列にはエラーメッセージが含まれます。また、全ての
1365 エラーメッセージは番号を持っています。例題では "E484:" を含んだエラーをキャッ
1366 チしています。この番号は変わらないことが保証されています (テキストは翻訳される
1367 などして変わるかもしれません)。
1369 ":read" コマンドが他のエラーを起こした場合、"E484:" というパターンはマッチしな
1370 いでしょう。したがって、その例外はキャッチされず、通常のエラーメッセージが表示
1371 されます。
1373 次のように書くこともできます: >
1375         :try
1376         :   read ~/templates/pascal.tmpl
1377         :catch
1378         :   echo "パスカル用のテンプレートファイルは見つかりませんでした。"
1379         :endtry
1381 全ての例外がキャッチされます。しかしこれでは "E21: Cannot make changes,
1382 'modifiable' is off" のような有効なエラーに気づくことができません。
1384 ":finally" という便利なコマンドもあります: >
1386         :let tmp = tempname()
1387         :try
1388         :   exe ".,$write " . tmp
1389         :   exe "!filter " . tmp
1390         :   .,$delete
1391         :   exe "$read " . tmp
1392         :finally
1393         :   call delete(tmp)
1394         :endtry
1396 カーソル行からファイル末尾までを "filter" コマンド (ファイル名を引数に取るコマ
1397 ンド) でフィルタ処理しています。":try" と ":finally" の間で問題が起きても、
1398 ユーザーが CTRL-C を押して操作をキャンセルしても、"call delete(tmp)" は必ず呼
1399 ばれます。一時ファイルが残ってしまう心配はありません。
1401 例外についてさらに詳しい情報はリファレンスマニュアルの|exception-handling|を
1402 参照してください。
1404 ==============================================================================
1405 *41.10* 注意事項
1407 Vim スクリプトにおいて注意すべきことの概要を簡単に説明します。他の場所にも同じ
1408 ような説明はありますが、手頃なチェックリストに使えるでしょう。
1410 改行記号はシステムによって異なります。Unix では <NL> 文字が使われますが、
1411 MS-DOS 、Windows、OS/2 などでは <CR><LF> が使われます。末尾が <CR> になってい
1412 るマップを使うときは注意してください。|:source_crnl| 参照。
1415 空白
1416 -----
1418 空の行はあっても構いません。無視されます。
1420 行頭の空白 (スペースとTAB) は常に無視されます。引数と引数の間には空白がいくつ
1421 あっても構いません (例えば下記の 'set' と 'cpoptions' の間) 。空白は一つのス
1422 ペースにまとめられ、セパレータの役目をします。最後の文字より後ろにある空白文字
1423 は状況によって無視されたりされなかったりします。下記参照。
1425 ":set" コマンドで "=" 記号を使うとき: >
1427         :set cpoptions    =aABceFst
1429 "=" の直前にある空白は無視されます。しかし、"=" の後ろに空白をはさむことはでき
1430 ません。
1432 オプション値に空白を含めるときは、バックスラッシュ ("\") でエスケープする必要
1433 があります: >
1435         :set tags=my\ nice\ file
1437 次のように書くと: >
1439         :set tags=my nice file
1441 これはエラーになります。このコマンドは次のように解釈されてしまいます: >
1443         :set tags=my
1444         :set nice
1445         :set file
1448 コメント
1449 --------
1451 コメントは " (ダブルクオート) 記号で開始します。行末までのすべての文字がコメン
1452 トとして解釈され、無視されます。ただし、コメントを書くことができないコマンドも
1453 あります (以下に例を示します)。コメントは行のどこからでも開始できます。
1455 コメントとして簡単な注釈を付けたとします。例: >
1457         :abbrev dev development         " shorthand
1458         :map <F3> o#include             " insert include
1459         :execute cmd                    " do it
1460         :!ls *.c                        " list C files
1462 短縮形 'dev' は 'development     " shorthand' に展開されます。<F3> には 'o#
1463 ....' から '" insert include' までの全部がマップされます。"execute" コマンドは
1464 エラーを起こします。"!" コマンドはすべての文字をシェルに渡すので、" 記号が閉じ
1465 られていないことでエラーが起こります。
1466 ":map"、":abbreviate"、":execute"、"!" などのコマンドはその後ろにコメントを書
1467 くことができません (そのようなコマンドは他にもあります)。ただし、無理やりコメ
1468 ントを書く方法もあります: >
1470         :abbrev dev development|" shorthand
1471         :map <F3> o#include|" insert include
1472         :execute cmd                    |" do it
1474 '|' 文字でコマンドを区切り、次のコマンドを書くことができます。この例では二つ目
1475 のコマンドはコメントのみです。"!" の場合は |:execute| と '|' を使わなければな
1476 りません: >
1477         :exe '!ls *.c'                  |" list C files
1479 ":map" と ":abbreviate" の場合は '|' の前に空白を置かないように注意してくださ
1480 い。これらのコマンドは行末か '|' までのすべての文字を使います。そのため、意図
1481 せずに末尾に空白を入れてしまうかもしれません: >
1483         :map <F4> o#include
1485 vimrc を編集するときに 'list' オプションをオンに設定しておくと、この問題が発見
1486 しやすくなります。
1488 Unix では特別なコメント書式を使って Vim スクリプトを実行形式にすることができま
1489 す: >
1490         #!/usr/bin/env vim -S
1491         echo "this is a Vim script"
1492         quit
1494 "#" コマンドは行を行番号付きで表示しますが、'!' をつけると何もしなくなります。
1495 よってファイルを実行するためのシェルコマンドを記述することができます。
1496 |:#!| |-S|
1499 落とし穴
1500 --------
1502 次の例には大きな問題があります: >
1504         :map ,ab o#include
1505         :unmap ,ab
1507 この unmap コマンドはうまく動きません。なぜなら ",ab " を unmap しようとしてい
1508 るからです。そのようなマップは存在しません。エラーが表示されますが、スペースは
1509 目に見えないので、エラーの原因を見つけるのは困難です。
1511 ":unmap" コマンドの後にコメントを書いた場合も同様です: >
1513         :unmap ,ab     " comment
1515 コメントは無視されますが、Vim は ',ab     ' を unmap しようとします。次のよう
1516 に書いてください: >
1518         :unmap ,ab|    " comment
1521 ビューの復元
1522 ------------
1524 何らかの変更を加えてから、カーソルのあった場所に戻りたい時があります。そのとき
1525 に、画面に表示されていた行範囲も復元されるとすてきです。
1526 次の例は、現在行をヤンクしてファイルの先頭にプットし、ビューを復元します: >
1528         map ,p ma"aYHmbgg"aP`bzt`a
1530 これは次のことをしています: >
1531         ma"aYHmbgg"aP`bzt`a
1532 <       ma                      現在のカーソル位置にマーク a を設定
1533           "aY                   現在行をレジスタ a にヤンク
1534              Hmb                ウィンドウの一行目に移動してマーク b を設定
1535                 gg              ファイルの一行目に移動
1536                   "aP           ヤンクした行をその上にプット
1537                      `b         ウィンドウの一行目に戻る
1538                        zt       ウィンドウの表示範囲を以前と同じにする
1539                          `a     保存しておいたカーソル位置に移動
1542 パッケージング
1543 --------------
1545 関数の名前が他の人の関数とかぶらないように、次の方法を使ってください:
1546 - ユニークな文字列を名前の前に付ける。私はよく略語を使います。例えば、オプショ
1547   ンウィンドウ (option window) のための関数なら "OW_" などです。
1548 - 関数を一つのファイルにまとめて、関数がロードされているかどうかを示すグローバ
1549   ル変数を設定する。ファイルが二回目に読み込まれたとき、最初にそれらの関数をア
1550   ンロードする。
1551 例: >
1553         " This is the XXX package
1555         if exists("XXX_loaded")
1556           delfun XXX_one
1557           delfun XXX_two
1558         endif
1560         function XXX_one(a)
1561                 ... body of function ...
1562         endfun
1564         function XXX_two(b)
1565                 ... body of function ...
1566         endfun
1568         let XXX_loaded = 1
1570 ==============================================================================
1571 *41.11* プラグインを書く                                *write-plugin*
1573 Vim スクリプトを書いて、それを多くの人に使ってもらうことができます。そのような
1574 スクリプトはプラグインと呼ばれます。Vim ユーザーはあなたのスクリプトをプラグイ
1575 ンディレクトリにコピーするだけで、すぐにその機能を使うことができます。
1576 |add-plugin| 参照。
1578 プラグインには二種類あります:
1580       グローバルプラグイン : すべてのファイルで共通
1581   ファイルタイププラグイン : ファイルの種類別
1583 この節ではグローバルプラグインについて説明します。ほとんどの説明はファイルタイ
1584 ププラグインに対してもあてはまります。ファイルタイププラグイン特有の説明は次節
1585 にあります |write-filetype-plugin|。
1588 名前
1589 -----
1591 最初にプラグインの名前を決めなければなりません。プラグインが提供する機能が名前
1592 から分かるようにしてください。また、他の人が作ったプラグインと名前がかぶらない
1593 ようにしてください。古い Windows システムでの問題を避けるため、名前は 8 文字以
1594 内にしてください。
1596 例えばタイプミス (type mistake) を修正 (correct) するためのスクリプトなら
1597 "typecorr.vim" という名前を付けたりします。ここではこれを例題として使います。
1599 プラグインが誰でも使えるようにするため、いくつかのガイドラインに従ってくださ
1600 い。ガイドラインは段階的に説明していきます。例題プラグインの完全なソースは最後
1601 に示します。
1604 ボディ
1605 ------
1607 まずはプラグインの本体部分を見てみましょう。行番号は実際の番号です: >
1609  14     iabbrev teh the
1610  15     iabbrev otehr other
1611  16     iabbrev wnat want
1612  17     iabbrev synchronisation
1613  18             \ synchronization
1614  19     let s:count = 4
1616 もちろん、実際のスクリプトはもっと巨大です。
1618 行番号は説明のために追加したものです。プラグインを書くときは行番号を付けないで
1619 ください。
1622 へッダ
1623 ------
1625 新しい単語を追加していくと、プラグインには複数のバージョンが存在することになり
1626 ます。ファイルを配布したとき、それを使った人は、誰がこの素晴らしいプラグインを
1627 書いたのかを知りたいと思うでしょうし、感想を伝えたいと思うかもしれません。
1628 というわけで、次のようなヘッダをプラグインに書いてください: >
1630   1     " Vim global plugin for correcting typing mistakes
1631   2     " Last Change:  2000 Oct 15
1632   3     " Maintainer:   Bram Moolenaar <Bram@vim.org>
1634 著作権とライセンスについて: プラグインがとても便利で、そして再配布を制限するほ
1635 どのものでない場合は、パブリックドメインか Vim ライセンス (|license|) の適用を
1636 検討してみてください。次の短い宣言をプラグインの先頭付近に書いておくだけで十分
1637 です: >
1639   4     " License:      This file is placed in the public domain.
1642 行連結、副作用の回避                                      *use-cpo-save*
1643 --------------------
1645 上の例の 18 行目では行連結 (|line-continuation|) が使われています。ユーザーの
1646 環境で 'compatible' オプションがオンに設定されていると、この行でエラーが発生し
1647 ます。'compatible' オプションの設定には副作用があるので、勝手に設定をオフにす
1648 ることはできません。問題を避けるには、一時的に 'cpoptions' の値を Vim の初期値
1649 に設定し、後で元に戻します。そうすれば、行連結を使うことができ、スクリプトはほ
1650 とんどの環境で動作するようになります。設定の変更は次のようにします: >
1652  11     let s:save_cpo = &cpo
1653  12     set cpo&vim
1654  ..
1655  42     let &cpo = s:save_cpo
1657 最初に 'cpoptions' の値を s:save_cpo 変数に保存します。プラグインの最後でオプ
1658 ションの値を元に戻します。
1660 スクリプトローカル変数 (|s:var|) を使っていることに注目してください。グローバ
1661 ル変数は他の場所で使われている可能性があります。スクリプトの中だけで使う場合は
1662 スクリプトローカル変数を使ってください。
1665 ロードしない
1666 ------------
1668 ユーザーが常にプラグインをロードしたいと思うとは限りません。また、システム管理
1669 者がシステムのプラグインディレクトリにプラグインを入れたが、ユーザーは自分で入
1670 れたプラグインを使いたいということもあります。したがって、指定したプラグインだ
1671 けを無効にできる必要があります。次のようにします: >
1673   6     if exists("loaded_typecorr")
1674   7       finish
1675   8     endif
1676   9     let loaded_typecorr = 1
1678 これはスクリプトの二重ロードを避ける効果もあります。スクリプトを二重にロードす
1679 ると、関数の再定義エラーが発生したり、自動コマンドが二重に追加されることでトラ
1680 ブルが起きたりします。
1683 マップ
1684 ------
1686 さて、プラグインをもっと魅力あるものに仕上げましょう。マップを追加して、カーソ
1687 ルの下の単語に対する修正を追加できるようにします。単純にキーを選んでマップを設
1688 定することもできますが、そのキーは既にユーザーが使っているかもしれません。マッ
1689 プに使用するキーをユーザーが選択できるようにするには、<Leader> を使います: >
1691  22       map <unique> <Leader>a  <Plug>TypecorrAdd
1693 "<Plug>TypecorrAdd" は目的の動作をします。詳しくは後で説明します。
1695 使用したいキーを "mapleader" 変数に設定することで、マップの最初のキーを設定で
1696 きます。例えば、次のように設定すると: >
1698         let mapleader = "_"
1700 マップは "_a" と定義されます。変数が設定されていない場合は初期設定 (バックス
1701 ラッシュ) が使われます。つまり "\a" というマップが定義されます。
1703 Note: 上記のコマンドでは <unique> が使われています。これは、同じマップが既に定
1704 義されていた場合にエラーを表示します。|:map-<unique>|
1706 マップするキーをユーザーが自分で定義できるようにするには、次のようにします: >
1708  21     if !hasmapto('<Plug>TypecorrAdd')
1709  22       map <unique> <Leader>a  <Plug>TypecorrAdd
1710  23     endif
1712 "<Plug>TypecorrAdd" に対するマップが既にあるかどうかを調べ、無い場合のみ
1713 "<Leader>a" にマップを定義します。ユーザーは自分の vimrc ファイルの中でマップ
1714 を定義することができます: >
1716         map ,c  <Plug>TypecorrAdd
1718 すると、マップのキーとして ",c" が使われます。"_a" や "\a" は使われません。
1721 ピース
1722 ------
1724 スクリプトが大きくなると、それを部品ごとに分けたくなります。それには関数やマッ
1725 プを使います。しかし、そうすると関数やマップが他のスクリプトのものと衝突する可
1726 能性があります。例えば、Add() という関数を追加したとき、他のスクリプトでも同じ
1727 名前の関数が定義されているかもしれません。そのような場合は、名前の前に "s:" を
1728 付けて、スクリプトの中だけで使える関数を定義します。
1730 新しい修正を追加するための関数を定義します: >
1732  30     function s:Add(from, correct)
1733  31       let to = input("type the correction for " . a:from . ": ")
1734  32       exe ":iabbrev " . a:from . " " . to
1735  ..
1736  36     endfunction
1738 s:Add() 関数は同じスクリプトの中から呼び出すことができます。他のスクリプトが
1739 s:Add() を定義していた場合、それはそのスクリプトにローカルであり、関数が定義さ
1740 れたスクリプトの中からのみ呼び出すことができます。さらにグローバルの Add() 関
1741 数 ("s:"無し) を定義することもでき、それはまた別の関数になります。
1743 マップ定義では <SID> が使えます。これは、現在のスクリプトを識別するためのスク
1744 リプト ID を生成します。私たちの入力修正プラグインでは <SID> を次のように使い
1745 ます: >
1747  24     noremap <unique> <script> <Plug>TypecorrAdd  <SID>Add
1748  ..
1749  28     noremap <SID>Add  :call <SID>Add(expand("<cword>"), 1)<CR>
1751 ユーザーが "\a" と入力すると、次の手順でキー入力が呼び出されます: >
1753         \a  ->  <Plug>TypecorrAdd  ->  <SID>Add  ->  :call <SID>Add()
1755 他のスクリプトで <SID>Add をマップすると、別のスクリプト ID が使われ、別のマッ
1756 プが生成されます。
1758 Note: s:Add() ではなく <SID>Add() と書いていることに注意してください。マップは
1759 スクリプトの外側でユーザーが入力するものだからです。<SID> はスクリプト ID に変
1760 換され、どのスクリプトの Add() 関数を呼べばいいのかわかるようになっています。
1762 これは少し複雑ですが、複数のプラグインを同時に使用するためには必要なことです。
1763 基本的なルールとしては、マップの中では <SID>Add() を使い、他の場所 (スクリプト
1764 の中、自動コマンド、ユーザー定義コマンド) では s:Add() を使います。
1766 マップと同じ方法で、メニューを追加することもできます: >
1768  26     noremenu <script> Plugin.Add\ Correction      <SID>Add
1770 プラグインのメニューを追加する場合は "Plugin" メニューの下に登録することが推奨
1771 されています。この例ではメニューが一つだけですが、複数のメニューを追加する場合
1772 は、サブメニューの使用が推奨されています。例えば、"Plugin.CVS" 以下に
1773 "Plugin.CVS.checkin" や "Plugin.CVS.checkout" などの CVS の操作を登録します。
1775 Note: 28 行目では ":noremap" を使って、他のマップでトラブルが起きないようにし
1776 ています。例えば、誰かが ":call" をマップしているかもしれないからです。24 行目
1777 でも ":noremap" を使っていますが、ここでは "<SID>Add" を再マップして欲しいの
1778 で、"<script>" を使っています。これを使うとスクリプトローカルなマップだけが再
1779 マップされます |:map-<script>|。26 行目でも ":noremenu" で同様のことをしていま
1780 す |:menu-<script>|。
1783 <SID> と <Plug>                                          *using-<Plug>*
1784 ---------------
1786 <SID> と <Plug> は、入力したキーに対するマップと、他のマップの中だけで使われる
1787 マップが干渉しないようにするために使われます。<SID> と <Plug> の違いに注意して
1788 ください:
1790 <Plug>  これはスクリプトの外側からも見えます。ユーザーが自分でプラグインの機能
1791         をマップできるようにするような場合に使います。<Plug> は特殊なコード
1792         で、キーボードから入力されることはありません。
1793         キー列が他のプラグインとかぶらないように、<Plug> スクリプト名 マップ
1794         名、という形式で使ってください。
1795         我々の例では、スクリプト名が "Typecorr"、マップ名が "Add" なので、
1796         "<Plug>TypecorrAdd" というキー列になります。スクリプト名とマップ名の最
1797         初の文字だけを大文字にして、どこがマップ名なのかわかるようにします。
1799 <SID>   これはスクリプト ID (スクリプト固有の識別子) です。
1800         Vim は内部で <SID> を "<SNR>123_" に変換します ("123"の部分はいろいろ
1801         な数字が入ります)。つまり、関数 "<SID>Add()" は、あるスクリプトでは
1802         "<SNR>11_Add()" という名前になり、別のスクリプトでは "<SNR>22_Add()"
1803         になります。これは ":function" コマンドで関数一覧を表示すると確認する
1804         ことができます。<SID> の変換はマップの中でも同様におこなわれるので、
1805         マップの中からスクリプトローカル関数を呼び出すことができます。
1808 ユーザ定義コマンド
1809 ------------------
1811 修正を追加するためのユーザー定義コマンドを追加します: >
1813  38     if !exists(":Correct")
1814  39       command -nargs=1  Correct  :call s:Add(<q-args>, 0)
1815  40     endif
1817 ユーザー定義コマンドは、同じ名前のコマンドがまだない場合のみ定義できます。既に
1818 定義されている場合はエラーになります。":command!" を使ってユーザー定義関数を上
1819 書きするのは良いアイデアとは言えません。ユーザーは、自分が定義したコマンドがな
1820 ぜ動かないのか不思議に思うでしょう。|:command|
1823 スクリプト変数
1824 --------------
1826 先頭に "s:" が付いた変数はスクリプト変数です。これはスクリプトの中だけで使えま
1827 す。スクリプトの外からは見えません。同じ名前の変数を複数のスクリプトで使ってし
1828 まうようなトラブルを避けることができます。Vim が実行されている間、変数は保持さ
1829 れます。そして、同じスクリプトが再読み込みされると、再び同じ変数が使われます。
1830 |s:var|
1832 スクリプト変数は、同じスクリプトの中で定義された関数、自動コマンド、ユーザー定
1833 義コマンドでも使えます。我々の例に、修正の数を数えるための数行のコードを追加し
1834 ます: >
1836  19     let s:count = 4
1837  ..
1838  30     function s:Add(from, correct)
1839  ..
1840  34       let s:count = s:count + 1
1841  35       echo s:count . " corrections now"
1842  36     endfunction
1844 最初に s:count はスクリプトの中で 4 で初期化されます。その後、s:Add() 関数が呼
1845 び出されると、s:count が増加します。関数がどこから呼ばれたかに関わらず、関数が
1846 定義されたスクリプトのローカル変数が使われます。
1849 まとめ
1850 ------
1852 例題の完成形は以下のようになります: >
1854   1     " Vim global plugin for correcting typing mistakes
1855   2     " Last Change:  2000 Oct 15
1856   3     " Maintainer:   Bram Moolenaar <Bram@vim.org>
1857   4     " License:      This file is placed in the public domain.
1858   5
1859   6     if exists("loaded_typecorr")
1860   7       finish
1861   8     endif
1862   9     let loaded_typecorr = 1
1863  10
1864  11     let s:save_cpo = &cpo
1865  12     set cpo&vim
1866  13
1867  14     iabbrev teh the
1868  15     iabbrev otehr other
1869  16     iabbrev wnat want
1870  17     iabbrev synchronisation
1871  18             \ synchronization
1872  19     let s:count = 4
1873  20
1874  21     if !hasmapto('<Plug>TypecorrAdd')
1875  22       map <unique> <Leader>a  <Plug>TypecorrAdd
1876  23     endif
1877  24     noremap <unique> <script> <Plug>TypecorrAdd  <SID>Add
1878  25
1879  26     noremenu <script> Plugin.Add\ Correction      <SID>Add
1880  27
1881  28     noremap <SID>Add  :call <SID>Add(expand("<cword>"), 1)<CR>
1882  29
1883  30     function s:Add(from, correct)
1884  31       let to = input("type the correction for " . a:from . ": ")
1885  32       exe ":iabbrev " . a:from . " " . to
1886  33       if a:correct | exe "normal viws\<C-R>\" \b\e" | endif
1887  34       let s:count = s:count + 1
1888  35       echo s:count . " corrections now"
1889  36     endfunction
1890  37
1891  38     if !exists(":Correct")
1892  39       command -nargs=1  Correct  :call s:Add(<q-args>, 0)
1893  40     endif
1894  41
1895  42     let &cpo = s:save_cpo
1897 33 行目は説明がまだでした。これは、新しい修正をカーソルの下の単語に適用しま
1898 す。|:normal| コマンドを使って新しい略語を適用しています。Note: マップと略語は
1899 その場で展開されます。":noremap" で定義されたマップから関数が呼び出されたとし
1900 ても動作は同じです。
1902 'fileformat' オプションを "unix" に設定することが推奨されています。そうすれ
1903 ば、Vim スクリプトはどこでも動作します。'fileformat' が "dos" に設定されたスク
1904 リプトは Unix では動作しません。|:source_crnl| も参照。設定が正しいことを確実
1905 にするため、ファイルを保存する前に次のコマンドを実行してください: >
1907         :set fileformat=unix
1910 ドキュメント                                          *write-local-help*
1911 ------------
1913 プラグインのドキュメントを書くのは良いアイデアです。ユーザーが動作を変更できる
1914 ような場合には特に重要です。|add-local-help| ではどのようにしてドキュメントが
1915 インストールされるか説明されています。
1917 プラグインヘルプファイルの例を示します ("typecorr.txt"): >
1919   1     *typecorr.txt*  Plugin for correcting typing mistakes
1920   2
1921   3     If you make typing mistakes, this plugin will have them corrected
1922   4     automatically.
1923   5
1924   6     There are currently only a few corrections.  Add your own if you like.
1925   7
1926   8     Mappings:
1927   9     <Leader>a   or   <Plug>TypecorrAdd
1928  10             Add a correction for the word under the cursor.
1929  11
1930  12     Commands:
1931  13     :Correct {word}
1932  14             Add a correction for {word}.
1933  15
1934  16                                                     *typecorr-settings*
1935  17     This plugin doesn't have any settings.
1937 書式に気をつけなければならないのは一行目だけです。一行目はコピーされ、help.txt
1938 の "LOCAL ADDITIONS:" の項に埋め込まれます |local-additions|。最初の "*" は一
1939 行目の一桁目に書いてください。ヘルプを追加したら ":help" を実行して項目が追加
1940 されたことを確認してください。
1942 ヘルプの中で ** で文字を囲むとタグを追加することができます。ただし、既存のヘル
1943 プタグと同じものを使わないでください。"typecorr-settings" のように、プラグイン
1944 の名前を使ってタグを作るといいかもしれません。
1946 ヘルプの他の部分を参照するときは || で囲みます。そうすれば、ユーザーは簡単にヘ
1947 ルプの関連した部分を参照することができます。
1950 ファイルタイプの認識                                      *plugin-filetype*
1951 --------------------
1953 ファイルタイプが Vim によって認識されない場合は、別ファイルにファイルタイプを
1954 認識するためにコードを作成する必要があります。通常は、自動コマンドを使って、
1955 ファイル名がパターンにマッチしたときにファイルタイプを設定します。例: >
1957         au BufNewFile,BufRead *.foo                     set filetype=foofoo
1959 この一行を 'runtimepath' の最初のディレクトリの "ftdetect/foofoo.vim" に書き
1960 込みます。例えば、Unix なら "~/.vim/ftdetect/foofoo.vim" などです。ファイルタ
1961 イプとスクリプトファイルの名前を同じにする決まりになっています。
1963 必要ならより複雑な処理をすることもできます。例えば、ファイルの中身を見て言語を
1964 判定したりできます。|new-filetype| も参照。
1967 要約                                                      *plugin-special*
1968 -----
1970 プラグインで使用する特有事項の要約を示します:
1972 s:name                  スクリプトローカル変数。
1974 <SID>                   スクリプトID。マップや関数をスクリプトローカルにする
1975                         のに使う。
1977 hasmapto()              スクリプトが提供している機能に対して、ユーザーが既に
1978                         マップを定義したかどうかをチェックする関数。
1980 <Leader>                "mapleader" の値。ユーザーがその変数にキーを設定するこ
1981                         とで、プラグインのマップの開始キーを指定できる。
1983 :map <unique>           マップが既に定義されているなら警告を発する。
1985 :noremap <script>       スクリプトローカルマップだけを使う。グローバルマップは
1986                         使わない。
1988 exists(":Cmd")          ユーザー定義コマンドが既にあるかどうかをチェックする。
1990 ==============================================================================
1991 *41.12* ファイルタイププラグインを書く *write-filetype-plugin* *ftplugin*
1993 ファイルタイププラグインはグローバルプラグインと似ていますが、カレントバッファ
1994 のマップやオプションだけを設定します。ファイルタイププラグインの使用方法につい
1995 ては |add-filetype-plugin| を参照してください。
1997 先に |41.10| 節のグローバルプラグインの項を読んでください。そこで説明されてい
1998 ることはすべてファイルタイププラグインにもあてはまります。この節ではファイルタ
1999 イププラグイン特有の事項だけを説明します。ファイルタイププラグインはカレント
2000 バッファに対してのみ機能するということが最も大切です。
2003 無効化
2004 ------
2006 ファイルタイププラグインを書いて多くの人に使ってもらおうとするなら、プラグイン
2007 を無効化できるようにしておく必要があります。プラグインの先頭に次のような記述を
2008 追加してください: >
2010         " このバッファに対してまだ実行されていない場合のみ処理を実行する
2011         if exists("b:did_ftplugin")
2012           finish
2013         endif
2014         let b:did_ftplugin = 1
2016 これは同じプラグインが同じバッファで二重にロードされるのを防ぐためにも必要です
2017 (":edit"コマンドを引数なしで実行したときに発生します)。
2019 ユーザーは、次の一行だけを書いたファイルタイププラグインを作成することで、標準
2020 プラグインのロードを無効化できます: >
2022         let b:did_ftplugin = 1
2024 ただし、そのファイルを保存したファイルタイププラグインディレクトリが、
2025 'runtimepath' の中で $VIMRUNTIME よりも前にある必要があります。
2027 標準プラグインを使いつつ、その設定を一つだけ変更したいという場合は、スクリプト
2028 の中で設定を変更することができます: >
2030         setlocal textwidth=70
2032 このファイルを "after" ディレクトリに保存すると、(例えば filetype=vim なら) 標
2033 準配布の "vim.vim" が読み込まれた後に、保存したファイルが読み込まれるようにな
2034 ります |after-directory|。Unix ならファイルのパスは
2035 "~/.vim/after/ftplugin/vim.vim" です。Note: 標準プラグインは "b:did_ftplugin"
2036 を設定しますが、ここではそれを無視しています。
2039 オプション
2040 ----------
2042 ファイルタイププラグインでは、カレントバッファの設定だけを変更するため、次のコ
2043 マンドを使ってオプションを設定してください: >
2045         :setlocal
2047 そして、バッファローカルなオプションだけを設定してください (どのオプションがそ
2048 うなのかはヘルプで確認してください)。|:setlocal| コマンドでグローバルオプショ
2049 ンやウィンドウローカルオプションを設定すると、たくさんのバッファの設定が変更さ
2050 れます。ファイルタイププラグインはそのような動作をすべきではありません。
2052 オプションの値がフラグや設定項目のリストなら、"+=" や "-=" を使うことで既存の
2053 設定を維持することができます。ユーザーがそのオプションの設定を変更している可能
2054 性もあるので注意してください。最初に初期設定に戻してから設定を変更するといいか
2055 もしれません。例: >
2057         :setlocal formatoptions& formatoptions+=ro
2060 マップ
2061 ------
2063 カレントバッファの中だけで機能するマップを作るには次のコマンドを使います: >
2065         :map <buffer>
2067 上述したように、マップは二段階に分けて作る必要があります。ファイルタイププラグ
2068 インで機能を定義する例を示します: >
2070         if !hasmapto('<Plug>JavaImport')
2071           map <buffer> <unique> <LocalLeader>i <Plug>JavaImport
2072         endif
2073         noremap <buffer> <unique> <Plug>JavaImport oimport ""<Left><Esc>
2075 |hasmapto()| を使って、ユーザーが既に <Plug>JavaImport に対してマップを定義し
2076 ているかどうかを調べます。未定義ならファイルタイププラグインの標準のマップを定
2077 義します。マップは <LocalLeader> で開始します。そうすることで、ファイルタイプ
2078 プラグインのマップを開始するキーをユーザーが選択できます。初期設定はバックス
2079 ラッシュです。
2080 "<unique>" を使って、マップが既に存在したとき、あるいは既存のマップと重複した
2081 ときにエラーメッセージが表示されるようにします。
2082 |:noremap| を使って、ユーザーが定義した他のマップの影響を受けないようにしま
2083 す。":noremap <script>" を使うと、スクリプトの中で定義した <SID> で始まるマッ
2084 プだけが再マップされます。
2086 ユーザーがファイルタイププラグインのマップを無効化できる仕組みを提供しなければ
2087 なりません。例えば、"mail" ファイルタイプのプラグインなら次のようにします: >
2089         " マップを追加する。ユーザーが望まない場合は追加しない。
2090         if !exists("no_plugin_maps") && !exists("no_mail_maps")
2091           " "> " を挿入して引用する
2092           if !hasmapto('<Plug>MailQuote')
2093             vmap <buffer> <LocalLeader>q <Plug>MailQuote
2094             nmap <buffer> <LocalLeader>q <Plug>MailQuote
2095           endif
2096           vnoremap <buffer> <Plug>MailQuote :s/^/> /<CR>
2097           nnoremap <buffer> <Plug>MailQuote :.,$s/^/> /<CR>
2098         endif
2100 ここでは二つのグローバル変数が使われています:
2101   no_plugin_maps        すべてのファイルタイププラグインのマップを無効化
2102   no_mail_maps          特定のファイルタイププラグインのマップを無効化
2105 ユーザー定義コマンド
2106 --------------------
2108 ファイルタイプ用のユーザー定義コマンドを追加して、それを一つのバッファの中だけ
2109 で使えるようにするには、|:command| の引数に "-buffer" を指定します。例: >
2111         :command -buffer  Make  make %:r.s
2114 変数
2115 -----
2117 ファイルタイププラグインは対応するすべてのバッファに対して実行されます。スクリ
2118 プトローカル変数 |s:var| はすべての実行で共有されます。バッファごとの変数を使
2119 いたい場合はバッファローカル変数 |b:var| を使ってください。
2122 関数
2123 -----
2125 関数は一度だけ定義すれば十分です。しかし、ファイルタイププラグインは対応する
2126 ファイルが開かれるたびに読み込まれます。次のようにすると関数が一度だけ定義され
2127 るようになります: >
2129         :if !exists("*s:Func")
2130         :  function s:Func(arg)
2131         :    ...
2132         :  endfunction
2133         :endif
2136 アンドゥ                                            *undo_ftplugin*
2137 --------
2139 ユーザーが ":setfiletype xyz" としたとき、それ以前のファイルタイプの効果は無効
2140 になるべきです。b:undo_ftplugin 変数にコマンドを設定し、ファイルタイププラグイ
2141 ンの設定をアンドゥするようにしてください。例: >
2143         let b:undo_ftplugin = "setlocal fo< com< tw< commentstring<"
2144                 \ . "| unlet b:match_ignorecase b:match_words b:match_skip"
2146 ":setlocal" でオプション名の後に "<" を付けると、そのオプションをグローバルな
2147 値でリセットします。オプションをリセットするにはこの方法が一番です。
2149 このように行継続を使うには 'cpoptions' から "C" フラグを取り除く必要がありま
2150 す。上述の |use-cpo-save| を参照してください。
2153 ファイル名
2154 ----------
2156 ファイルタイププラグインのファイル名にはファイルタイプ名が含まれていなければな
2157 りません |ftplugin-name|。次の三つのうちのどれかにしてください:
2159         .../ftplugin/stuff.vim
2160         .../ftplugin/stuff_foo.vim
2161         .../ftplugin/stuff/bar.vim
2163 "stuff" はファイルタイプ名、"foo" と "bar" は任意の名前です。
2166 要約                                                      *ftplugin-special*
2167 -----
2169 ファイルタイププラグインの特有事項を要約します:
2171 <LocalLeader>           "maplocalleader" の値。ユーザーがその変数にキーを設定
2172                         することで、ファイルタイププラグインのマップの開始キー
2173                         を指定できる。
2175 :map <buffer>           バッファローカルなマップを定義する。
2177 :noremap <script>       同スクリプトで定義している <SID> で始まるマップだけを
2178                         再マップする。
2180 :setlocal               カレントバッファのオプションのみ設定する。
2182 :command -buffer        バッファローカルなユーザー定義コマンドを定義する。
2184 exists("*s:Func")       関数が定義済かどうかをチェックする。
2186 プラグイン全般に関する事項は |plugin-special| を参照してください。
2188 ==============================================================================
2189 *41.13* コンパイラプラグインを書く           *write-compiler-plugin*
2191 コンパイラプラグインは特定のコンパイラを使うためのオプションを設定します。ユー
2192 ザーは |:compiler| コマンドでその設定を読み込むことができます。設定されるオプ
2193 ションは主に 'errorformat' と 'makeprg' です。
2195 百聞は一見に如かず。次のコマンドですべての標準コンパイラプラグインを開くことが
2196 できます: >
2198         :next $VIMRUNTIME/compiler/*.vim
2200 |:next| を使って次のプラグインファイルに移動してください。
2202 これらのファイルには二つの特有事項があります。一つは、標準ファイルに対して設定
2203 を追加したり上書きしたりできる仕組みです。標準ファイルの先頭は次のようになって
2204 います: >
2206         :if exists("current_compiler")
2207         :  finish
2208         :endif
2209         :let current_compiler = "mine"
2211 コンパイラファイルを書いて、それを個人用のランタイムディレクトリ (例えば Unix
2212 なら ~/.vim/compiler) に置いたとき、"current_compiler" 変数を設定することで標
2213 準ファイルの設定をスキップすることができます。
2214                                                         *:CompilerSet*
2215 二つ目は、":compiler!" が使われたときは ":set" を使い、":compiler" が使われた
2216 ときは ":setlocal" を使う仕組みです。Vim はそのために ":CompilerSet" という
2217 ユーザーコマンドを定義します。古い Vim はそれを定義しないので、プラグインの中
2218 で定義してください。例: >
2220   if exists(":CompilerSet") != 2
2221     command -nargs=* CompilerSet setlocal <args>
2222   endif
2223   CompilerSet errorformat&              " use the dfault 'errorformat'
2224   CompilerSet makeprg=nmake
2226 コンパイラプラグインを書いて、それを Vim の配布物に含めたり、システムのランタ
2227 イムディレクトリに入れたりする場合は、上記の方法を使ってください。
2228 "current_compiler" がユーザープラグインで設定された場合は何も実行しないように
2229 します。
2231 コンパイラプラグインを書いて標準プラグインの設定を上書きする場合は
2232 "current_compiler" をチェックしないようにします。そのプラグインは最後に読み込
2233 まれないといけないので、'runtimepath' の最後にあるディレクトリに置きます。例え
2234 ば、Unix なら ~/.vim/after/compiler などです。
2236 ==============================================================================
2237 *41.14* プラグインを書く (高速ロード版)               *write-plugin-quickload*
2239 プラグインが成長し、とても大きくなることがあります。すると、起動速度は遅くなっ
2240 てきます。例えそのプラグインをたまにしか使わないとしても遅くなります。そういう
2241 ときはクイックロードプラグインの出番です。
2243 基本的なアイデアはプラグインを二回に分けて読み込むということです。一回目はユー
2244 ザー定義コマンドやマップを定義して機能を提供します。二回目は機能を実装する関数
2245 を定義します。
2247 スクリプトを二回読み込むことがクイックロードだというと驚かれるかもしれません。
2248 この手法の意味は、一回目は高速に読み込み、スクリプトの重い部分は二回目に後回し
2249 にするということです。二回目の読み込みは、ユーザが実際にその機能を使用したとき
2250 に発生します。あなたがその機能を常に使うなら、これは逆に遅くなってしまいます。
2252 Note Vim 7 以降では代わりの方法があります。|41.15| で説明されている |autoload|
2253 機能を使う方法です。
2255 次に例を示します: >
2257         " クイックロードのデモ用のグローバルプラグイン
2258         " Last Change:  2005 Feb 25
2259         " Maintainer:   Bram Moolenaar <Bram@vim.org>
2260         " License:      This file is placed in the public domain.
2262         if !exists("s:did_load")
2263                 command -nargs=* BNRead  call BufNetRead(<f-args>)
2264                 map <F19> :call BufNetWrite('something')<CR>
2266                 let s:did_load = 1
2267                 exe 'au FuncUndefined BufNet* source ' . expand('<sfile>')
2268                 finish
2269         endif
2271         function BufNetRead(...)
2272                 echo 'BufNetRead(' . string(a:000) . ')'
2273                 " read 機能をここに書く
2274         endfunction
2276         function BufNetWrite(...)
2277                 echo 'BufNetWrite(' . string(a:000) . ')'
2278                 " write 機能をここに書く
2279         endfunction
2281 このスクリプトが最初に読み込まれたとき、"s:did_load" は設定されていません。
2282 "if" と "endif" の間のコマンドが実行されます。|:finish| コマンドによって終了
2283 し、スクリプトの残りの部分は実行されません。
2285 二回目に読み込まれたときは "s:did_load" が存在するので、"endif" 以降のコマンド
2286 が実行されます。この部分では (長くなる可能性のある) BufNetRead() 関数と
2287 BufNetWrite() 関数を定義します。
2289 このスクリプトをプラグインディレクトリに置くと、Vim の起動時に実行されます。処
2290 理の流れは次のようになります:
2292 1. 起動時にスクリプトが読み込まれる。"BNRead" コマンドが定義され、<F19> キーに
2293    マップが設定される。自動コマンドの |FuncUndefined| が定義される。":finish"
2294    コマンドによってスクリプトが終了する。
2296 2. ユーザーが BNRead コマンド実行する、または <F19> キーを押す。BufNetRead()
2297    関数か BufNetWrite() 関数が呼び出される。
2299 3. Vim はその関数を見つけることができず、自動コマンドの |FuncUndefined| イベン
2300    トを発行する。関数名が "BufNet*" というパターンにマッチするので、"source
2301    fname" コマンドが実行される。"fname" はスクリプトの名前になります。スクリプ
2302    トがどこに保存されていても、"<sfile>" が展開されてファイル名になります
2303    (|expand()|参照)。
2305 4. スクリプトが再び読み込まれる。"s:did_load" 変数が存在するので関数が定義され
2306    る。
2308 遅延ロードされる関数の名前が |FuncUndefined| 自動コマンドのパターンにマッチし
2309 ていることに注意してください。他のプラグインがこのパターンにマッチする関数を定
2310 義しているとうまく動きません。
2312 ==============================================================================
2313 *41.15* ライブラリスクリプトを書く           *write-library-script*
2315 いろいろな場所で同じ機能が必要になることがあります。コードが二、三行以上になる
2316 場合は、それを一つのスクリプトに入れて、他のスクリプトから使えるようにしたくな
2317 ると思います。そのようなスクリプトをライブラリスクリプトと呼びます。
2319 自分でライブラリスクリプトを読み込むことは可能ですが、同じスクリプトを二重に読
2320 み込まないようにする必要があります。それには |exists()| 関数を使います。例: >
2322         if !exists('*MyLibFunction')
2323            runtime library/mylibscript.vim
2324         endif
2325         call MyLibFunction(arg)
2327 'runtimepath' に設定されたディレクトリの中の "library/mylibscript.vim" の中で
2328 MyLibFunction() が定義されている必要があります。
2330 これをより簡単にするために、Vim には autoload という仕組みがあります。同じこと
2331 を次のように書くことができます: >
2333         call mylib#myfunction(arg)
2335 この方がずっと簡単でしょう? Vim は関数の名前を見て、それが未定義なら、
2336 'runtimepath' の中から "autoload/mylib.vim" を探します。そのスクリプトは関数
2337 "mylib#myfunction()" を定義していなければなりません。
2339 mylib.vim には他の関数も入れられます。ライブラリスクリプトの中では自由に関数を
2340 作ることができます。ただし、関数名の '#' より前の部分はスクリプトの名前と同じ
2341 にする必要があります。そうしないと Vim はどのスクリプトを読み込めばいいのかわ
2342 かりません。
2344 ライブラリスクリプトをたくさん書く場合は、サブディレクトリを使うといいかもしれ
2345 ません。例: >
2347         call netlib#ftp#read('somefile')
2349 Unix では、このライブラリスクリプトは次のような場所に置かれます: >
2351         ~/.vim/autoload/netlib/ftp.vim
2353 関数は次のように定義します: >
2355         function netlib#ftp#read(fname)
2356                 "  ftp を使ってファイルを読み込む
2357         endfunction
2359 関数定義と関数呼び出しではまったく同じ名前が使われます。最後の '#' より前の部
2360 分がサブディレクトリとスクリプトの名前に対応しています。
2362 同じ方法で変数を扱うこともできます: >
2364         let weekdays = dutch#weekdays
2366 これによって "autoload/dutch.vim" が読み込まれます。そのスクリプトには例えば次
2367 のようなコードが書かれています: >
2369         let dutch#weekdays = ['zondag', 'maandag', 'dinsdag', 'woensdag',
2370                 \ 'donderdag', 'vrijdag', 'zaterdag']
2372 より詳しくは |autoload| を参照してください。
2374 ==============================================================================
2375 *41.16* Vim スクリプトを配布する                  *distribute-script*
2377 Vim ユーザーは Vim のウェブサイト http://www.vim.org でスクリプトを探します。
2378 便利なスクリプトを作ったら、ぜひ共有しましょう!
2380 Vim スクリプトはどのシステムでも使えます。tar や gzip コマンドは存在しないこと
2381 があります。ファイルをまとめたり圧縮したりするには "zip" ユーティリティが推奨
2382 されています。
2384 可搬性を最大限に高めるには、Vim 自身を使ってスクリプトをパッケージ化します。そ
2385 れには Vimball ユーティリティを使います。|vimball| を参照。
2387 自動更新するための行を書いておくと便利です。|glvs-plugins| を参照。
2389 ==============================================================================
2391 次章: |usr_42.txt|  新しいメニューを追加する
2393 Copyright: see |manual-copyright|  vim:tw=78:ts=8:ft=help:norl: