scriptを作り続けていると再利用したい部分、共通化したい部分が出てきます。本日は自分専用のライブラリを作るのに役立つ新たなプラグインを紹介します。とも管理が面倒くさくなります。そこで個々のプラグインにライブラリを組み込むことが出来る、vital.vimたるものが開発されました。これは、使いこなすのが難しい、組み込む時のコマンド:Vitalizeが面倒、モジュール利用前にvital#of('foo')などしないといけない(手軽に呼び出せない)といった欠点があります。手軽に簡易にライブラリを用意したい。複数の同名のautoloadスクリプトの中から、常に最新版を利用するためのプラグイン。全ての同名スクリプトが読み込まれる。その中で一番最新のものが最後まで読み込まれ、そうでないものはファイル頭で読込が終了される。これによってスクリプトは(たとえ同名のスクリプトが複数あったとしても)最新のものが読み込まれていることを保証できる。複数のバージョンが混在していても常に最新版を読み込ませられるというわけです。利用方法uptodate.vimで管理できるのはautoload/以下のスクリプトのみです。g:uptodate_filenamepatterns変数(リスト)を定義します。これに管理したいオートロードスクリプトの、autoload以下のパスを入れたものを定義してください。autoload/lclib.vimというスクリプトを管理下に入れたいのであれば、以下のようにします。['lclib.vim']次にそのスクリプト冒頭に以下の記述をします。後に更新時刻を表す数字が書き込まれます。ここを見てファイルのバージョンを知ります。更新ヘッダはファイル先頭から35行以内*2に記述してください。lib#uptodate#isnot_uptodate(expand(':p'))は現在読み込まれたファイルと同じパターンのファイルをruntime!して、もし今読み込んでいるファイルが最新版でないと判定したら1を返します。して最新版でないと判定されたらfinishされます。そのプラグインのautoload/lib/以下にautoload/lib/uptodate.vimのファイルをコピーすれば準備完了。plugin/uptodate.vimを再読み込みさせてください。以下のように、更新ヘッダが更新時刻を表す数値に書き換われば設定成功です。1373476011.ファイルを更新する度に、更新ヘッダの数字が更新されるのが確認できます。*3そして、更新されるときに、'runtimepath'にある、他のlclib.vimも同時に現在の内容で更新されるようになります。これによって、自分の'runtimepath'内のlclib.vimは常に同じ内容であることが保証されます。後はこのファイルのこれより下の部分にモジュールを定義します。何か処理endfunction動作たとえばbar/autoload/以下と、baz/autoload/以下にlclib.vimをコピーした状態で、lclib#foo()を呼び出したとしましょう。より結局両方のファイルが呼ばれることになります。bar/autoload/lclib.vimの方が先に呼ばれたとします。.ヘッダからbar/autoload/lclib.vimの更新時刻を保持します。次にbaz/autoload/lclib.vimが読み込まれた時、baz/autoload/lclib.vimの更新時刻と保持されていたbarの更新時刻を比較し、barの方が新しかったり同じだったりするとlib#uptodate#isnot_uptodate(expand(':p'))は1を返すので、読込が終了します。なければbaz/autoload/lclib.vimは最後まで読み込まれ、bar側のlib#uptodate#isnot_uptodate(expand(':p'))が1を返してbar/autoload/lclib.vimは読込が終了します。確認する時はこれを参照してください。プラグインごとに通すプラグイン管理を前提にしています。昔ながらの、ダウンロードしたプラグインをvimfiles/以下に直接置く前時代的な管理には対応していませんので悪しがらず。ライブラリ・スクリプトファイルを初めて呼び出した(読み込んだ)ときに全てが完結するようになっています。それ以後に新しく追加したファイルは感知しません。コマンドでスクリプトファイルの再読込を行ってください。このコマンドは引数で与えられたファイルパターンを再読込します。(引数が与えられていない時にはg:uptodate_filepatternsにある全てのパターンが読み込まれます。)常に最新版が読み込まれるので、古いバージョンでしか動かないようなプラグインをサポートしません。後方互換性を意識する必要があります。設計上、同名のファイルが増えれば(ファイル冒頭しか読まないとはいえ)読み込み時に時間がかかるでしょう。速度が気になりだしたら何らかの対策を講じるべきだと思います。常に最新バージョンしか使えないという欠点はありますが、普段使っているautoload関数とまったく同じ感覚でモジュールを使えるのは便利です。テストの中で使う汎用的な関数を呼ぶのに:Vitalizeなんかしてられるか!といった動機で作ったのですが、うまくいったようです。コマンドラインからも手軽に使えるようになったのも大きいです。lclib#get_script_id('%')みたく呼ぶことが出来るのです。*1:名付けにご協力してくださったujihisaさんに感謝*2:この行数は将来変更する可能性があります*3:ファイル更新時間の取得について、はじめはgetftime()を使っていたのだが、GitHubから取得したファイルは取得日時がそのまま更新時間となってしまうので上手くいかなかったために、ヘッダを使う方式にした。»プロフィールid:leafcage世間的にはマイナーなソフトウェアなどが好き。(ツイプロフィール)github/LeafCagevimに関する記事(はてなグループ)はてなブログをはじめよう!leafcageさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。