|
1 |
| -*usr_50.txt* For Vim バージョン 9.0. Last change: 2022 May 13 |
| 1 | +*usr_50.txt* For Vim バージョン 9.0. Last change: 2022 Jun 20 |
2 | 2 |
|
3 | 3 | VIM USER MANUAL - by Bram Moolenaar
|
4 | 4 |
|
5 | 5 | 高度な Vim script の書き方
|
6 | 6 |
|
7 | 7 |
|
8 |
| -TODO - この章はいずれ書きます |
9 |
| - |
10 |
| -|50.1| 執筆活動 |
| 8 | +|50.1| 例外 |
| 9 | +|50.2| 可変長引数の関数 |
| 10 | +|50.3| ビューの復元 |
11 | 11 |
|
12 | 12 | 次章: |usr_51.txt| プラグインを作る
|
13 | 13 | 前章: |usr_45.txt| 言語を選択する (ロケール)
|
14 | 14 | 目次: |usr_toc.txt|
|
15 | 15 |
|
16 | 16 | ==============================================================================
|
17 |
| -*50.1* 執筆活動 |
| 17 | +*50.1* 例外 |
| 18 | + |
| 19 | +まずは例から始めましょう: > |
| 20 | +
|
| 21 | + try |
| 22 | + read ~/templates/pascal.tmpl |
| 23 | + catch /E484:/ |
| 24 | + echo "パスカル用のテンプレートファイルは見つかりませんでした。" |
| 25 | + endtry |
| 26 | +
|
| 27 | +`read` コマンドはファイルがなければ失敗します。そのエラーをキャッチして、エラー |
| 28 | +メッセージの代わりにより詳細な情報のメッセージを表示しています。 |
| 29 | + |
| 30 | +`try` と `endtry` の間で起きたエラーは例外に変換されます。例外は文字列です。エ |
| 31 | +ラーの場合、文字列はエラーメッセージを含んでいます。そして、全てのエラーメッ |
| 32 | +セージは番号を持っています。この場合、キャッチしたエラーには "E484:" が含まれ |
| 33 | +ています。この番号は変わらないことが保証されています (テキストは翻訳されるなど |
| 34 | +して変わる可能性があります)。 |
| 35 | + |
| 36 | +素敵なエラーメッセージを出力し、Vim は `:endtry` 以降のコマンドの実行も続けま |
| 37 | +す。それ以外のキャッチされないエラーに遭遇した場合、スクリプト/関数/マッピング |
| 38 | +の実行は中断されます。 |
| 39 | + |
| 40 | +`read` コマンドが他のエラーを起こした場合、"E484:" というパターンはマッチしな |
| 41 | +いでしょう。したがって、その例外はキャッチされず、通常のエラーメッセージの表示 |
| 42 | +とともに実行が中断されます。 |
| 43 | + |
| 44 | +あなたはこれをしたくなるかもしれません: > |
| 45 | +
|
| 46 | + try |
| 47 | + read ~/templates/pascal.tmpl |
| 48 | + catch |
| 49 | + echo "パスカル用のテンプレートファイルは見つかりませんでした。" |
| 50 | + endtry |
| 51 | +
|
| 52 | +全ての例外がキャッチされます。しかし "E21: Cannot make changes, 'modifiable' |
| 53 | +is off" のようなまったく異なる問題を示す有効なエラーに気づくことができません。 |
| 54 | +エラーをキャッチする前によく考えてください! |
| 55 | + |
| 56 | +もう1つの便利なメカニズムは `finally` コマンドです: > |
| 57 | +
|
| 58 | + var tmp = tempname() |
| 59 | + try |
| 60 | + exe ":.,$write " .. tmp |
| 61 | + exe "!filter " .. tmp |
| 62 | + :.,$delete |
| 63 | + exe ":$read " .. tmp |
| 64 | + finally |
| 65 | + delete(tmp) |
| 66 | + endtry |
| 67 | +
|
| 68 | +これは、ファイル名の引数をとる "filter" コマンドを使用して、カーソルからファイ |
| 69 | +ルの終わりまでの行をフィルタリングします。フィルタリングが動作しても、`try` と |
| 70 | +`finally` の間で何か問題が発生した場合や、ユーザーが CTRL-C を押してフィルタリ |
| 71 | +ングをキャンセルした場合は、常に `delete(tmp)` 呼び出しが実行されます。これに |
| 72 | +より、一時ファイルを残さないようにすることができます。 |
| 73 | + |
| 74 | +`finally` は例外をキャッチせず、エラーはそれ以降の実行を中断します。 |
| 75 | + |
| 76 | +例外についてさらに詳しい情報はリファレンスマニュアルの|exception-handling|を |
| 77 | +参照してください。 |
| 78 | + |
| 79 | +============================================================================== |
| 80 | +*50.2* 可変長引数の関数 |
| 81 | + |
| 82 | +Vim では、可変数の引数を持つ関数を定義できます。例えば、次のコマンドは、1つの |
| 83 | +引数(start)を持つ必要があり、最大20個の追加の引数を持つことができる関数を定義 |
| 84 | +します: > |
| 85 | +
|
| 86 | + def Show(start: string, ...items: list<string>) |
| 87 | +
|
| 88 | +変数 "items" は、追加の引数を含む関数内のリストになります。any型のリストと同じ |
| 89 | +ように使用できます。例: > |
| 90 | +
|
| 91 | + def Show(start: string, ...items: list<string>) |
| 92 | + echohl Title |
| 93 | + echo "start is " .. start |
| 94 | + echohl None |
| 95 | + for index in range(len(items)) |
| 96 | + echon $" Arg {index} is {items[index]}" |
| 97 | + endfor |
| 98 | + echo |
| 99 | + enddef |
| 100 | +
|
| 101 | +このように呼び出しできます: > |
| 102 | +
|
| 103 | + Show('Title', 'one', 'two', 'three') |
| 104 | +< start is Title Arg 0 is one Arg 1 is two Arg 2 is three ~ |
| 105 | + |
| 106 | +これは `echohl` コマンドを使用して以降の `echo` コマンドをハイライトするように |
| 107 | +指定しています。`echohl None` で再度停止します。`echon` コマンドは `echo` と同 |
| 108 | +様に動作しますが、改行を出力しません。 |
| 109 | + |
| 110 | +引数を1つで呼び出したときは "items" リストは空になります。`range(len(items))` |
| 111 | +はインデックス付きのリストを返します。`for` がループするものについては、さらに |
| 112 | +詳しく説明します。 |
| 113 | + |
| 114 | +============================================================================== |
| 115 | +*50.3* ビューの復元 |
| 116 | + |
| 117 | +場合によっては、ジャンプして変更を加えてから、同じ位置とビューに戻りたいことが |
| 118 | +あります。例えば、ファイルヘッダーの何かを変更します。これは、次の 2 つの関数 |
| 119 | +で実行できます: > |
18 | 120 |
|
19 |
| -TODO |
| 121 | + var view = winsaveview() |
| 122 | + # 移動して、変更を行う |
| 123 | + winrestview(view) |
20 | 124 |
|
21 | 125 | ==============================================================================
|
22 | 126 |
|
|
0 commit comments