vim-jp / vimdoc-ja / usr_50

usr_50 - Vim日本語ドキュメント

メインヘルプファイルに戻る English | 日本語 | 編集
usr_50.txt    For Vim バージョン 9.1.  Last change: 2022 Jun 20

                     VIM USER MANUAL - by Bram Moolenaar

                         高度な Vim script の書き方


50.1  例外
50.2  可変長引数の関数
50.3  ビューの復元

次章: usr_51.txt  プラグインを作る
前章: usr_45.txt  言語を選択する (ロケール)
目次: usr_toc.txt

==============================================================================
50.1  例外

まずは例から始めましょう: >

        try
           read ~/templates/pascal.tmpl
        catch /E484:/
           echo "パスカル用のテンプレートファイルは見つかりませんでした。"
        endtry

`read` コマンドはファイルがなければ失敗します。そのエラーをキャッチして、エラー
メッセージの代わりにより詳細な情報のメッセージを表示しています。

`try` と `endtry` の間で起きたエラーは例外に変換されます。例外は文字列です。エ
ラーの場合、文字列はエラーメッセージを含んでいます。そして、全てのエラーメッ
セージは番号を持っています。この場合、キャッチしたエラーには "E484:" が含まれ
ています。この番号は変わらないことが保証されています (テキストは翻訳されるなど
して変わる可能性があります)。

素敵なエラーメッセージを出力し、Vim は `:endtry` 以降のコマンドの実行も続けま
す。それ以外のキャッチされないエラーに遭遇した場合、スクリプト/関数/マッピング
の実行は中断されます。

`read` コマンドが他のエラーを起こした場合、"E484:" というパターンはマッチしな
いでしょう。したがって、その例外はキャッチされず、通常のエラーメッセージの表示
とともに実行が中断されます。

あなたはこれをしたくなるかもしれません: >

        try
           read ~/templates/pascal.tmpl
        catch
           echo "パスカル用のテンプレートファイルは見つかりませんでした。"
        endtry

全ての例外がキャッチされます。しかし "E21: Cannot make changes, 'modifiable'
is off" のようなまったく異なる問題を示す有効なエラーに気づくことができません。
エラーをキャッチする前によく考えてください!

もう1つの便利なメカニズムは `finally` コマンドです: >

        var tmp = tempname()
        try
           exe ":.,$write " .. tmp
           exe "!filter " .. tmp
           :.,$delete
           exe ":$read " .. tmp
        finally
           delete(tmp)
        endtry

これは、ファイル名の引数をとる "filter" コマンドを使用して、カーソルからファイ
ルの終わりまでの行をフィルタリングします。フィルタリングが動作しても、`try` と
`finally` の間で何か問題が発生した場合や、ユーザーが CTRL-C を押してフィルタリ
ングをキャンセルした場合は、常に `delete(tmp)` 呼び出しが実行されます。これに
より、一時ファイルを残さないようにすることができます。

`finally` は例外をキャッチせず、エラーはそれ以降の実行を中断します。

例外についてさらに詳しい情報はリファレンスマニュアルのexception-handling
参照してください。

==============================================================================
50.2  可変長引数の関数

Vim では、可変数の引数を持つ関数を定義できます。例えば、次のコマンドは、1つの
引数(start)を持つ必要があり、最大20個の追加の引数を持つことができる関数を定義
します: >

        def Show(start: string, ...items: list<string>)

変数 "items" は、追加の引数を含む関数内のリストになります。any型のリストと同じ
ように使用できます。例: >

        def Show(start: string, ...items: list<string>)
          echohl Title
          echo "start is " .. start
          echohl None
          for index in range(len(items))
            echon $"  Arg {index} is {items[index]}"
          endfor
          echo
        enddef

このように呼び出しできます: >

        Show('Title', 'one', 'two', 'three')
<       start is Title  Arg 0 is one  Arg 1 is two  Arg 2 is three ~

これは `echohl` コマンドを使用して以降の `echo` コマンドをハイライトするように
指定しています。`echohl None` で再度停止します。`echon` コマンドは `echo` と同
様に動作しますが、改行を出力しません。

引数を1つで呼び出したときは "items" リストは空になります。`range(len(items))`
はインデックス付きのリストを返します。`for` がループするものについては、さらに
詳しく説明します。

==============================================================================
50.3  ビューの復元

場合によっては、ジャンプして変更を加えてから、同じ位置とビューに戻りたいことが
あります。例えば、ファイルヘッダーの何かを変更します。これは、次の 2 つの関数
で実行できます: >

        var view = winsaveview()
        # 移動して、変更を行う
        winrestview(view)

==============================================================================

Next chapter: usr_51.txt  プラグインを作る

Copyright: see manual-copyright  vim:tw=78:ts=8:noet:ft=help:norl: