author thinca
date 2012/11/03
place ujihisa.vim#3
font VL ゴシック 40
font Migu_2M:h34:cSHIFTJIS
colorscheme White2
All about vital.vim
2012/11/03 ujihisa.vim#3 thinca
こんなことありませんか?
- 似たようなコードを何度も書いている
- 複雑な workaround が必要になる
- ぶっちゃけ自分で書くのめんどい
ライブラリが欲しい!
通常のライブラリの欠点
- ユーザに別途入れてもらう必要がある
- 互換性のないバージョンが出ると詰む
- 1度に複数のバージョンの ライブラリは入れられない
- 別のバージョンに複数の プラグインが依存していたら…
そこで vital.vim ですよ
今日のお話
- vital.vim とは
- vital.vim の使い方
- vital モジュールの作り方
- vital.vim の今後
1. vital.vim とは
vital.vim とは
- Vim script のライブラリ群
- モジュールと言う単位で管理される
- モジュールは関数の集まり
- プラグインに組み込んで使う
どんなメリットがあるの?
- プラグイン同梱
- ユーザが個別にインストールせずに済む
- バージョンの混在が可能
- 別のスクリプトが使ってても大丈夫
デメリットは?
- ちょっと大掛かり
- 小物に入れるのはためらわれる
どんなモジュールがあるの?
- Data.List
- Data.String
- DateTime
- System.File
- Web.Http
- ...
どんなモジュールがあるの?
- Data.List
- uniq()
- flatten()
- foldl()
- zip()
- ...
どんなモジュールがあるの?
- それっぽいのがそれなりにある
- けど、まだまだ少ない
2. vital の使い方
手順
- プラグインに組み込む
- 機能を呼び出す
vitalizer
- vital をプラグインに組み込むためのプラグイン
- vital 同梱
- :Vitalize コマンドで組み込める
:Vitalize [options] {target-dir} [{module} ...]
欲しいモジュールのリストを渡す
:Vitalize . Data.List Web.Http
- 指定ディレクトリに vital が インストールされる
- 指定したモジュールのリストは プラグイン側に保存される
2回目以降は引数を省略可能
:Vitalize .
- 以前入れたモジュールの リストを使ってモジュールを更新
後から追加/削除も可能
:Vitalize . +DateTime -Data.List
- DateTime を追加
- Data.List を削除
詳しくは :help
注意
-
モジュールは別のモジュールに 依存している場合がある
- 指定していないモジュールが入る場合も
- 依存は自動で解決される
機能を呼び出す
モジュールは辞書
- モジュールは辞書で提供される
- 辞書に関数がいっぱいついてる
- これを呼び出して使う
※イメージ
let module = {
\ 'uniq': function('s:uniq'),
\ 'flatten': function('s:flatten'),
\ 'foldl': function('s:foldl'),
\ 'zip': function('s:zip'),
\}
vital#of()
- vital のモジュールのローダを生成する
- プラグイン名を渡すことで そのプラグイン用の vital をロードする
- vital のモジュールはこのローダ経由でロードする
" s:V がローダ
let s:V = vital#of('myplugin')
import()
- モジュールをロードして辞書で返す
let s:DT = s:V.import('DateTime')
let s:next_week = s:DT.now().to(1, 'week')
echo s:next_week.to_string()
load()
- 指定した名前のモジュールをロードする
call s:V.load('Data.List')
echo s:V.Data.List.uniq([3,1,5,2,9,1,3,3,2])
3. vital モジュールの作り方
vital モジュールの作り方
- モジュール名を決める
- ファイルを作る
- モジュールを書く
- 書き方のルール
1. モジュール名を決める
- モジュール名は階層式
- Data.List や Web.Http など
- CamelCase
- 名前は割とてきとー
2. ファイルを作る
- モジュール名に対応した位置にファイルを作る
例: Data.OrderedSet の場合
autoload/vital/__latest__/data/ordered_set.vim
- . はディレクトリになる
- 名前は
snake_case
になる
3. モジュールを書く
-
vital のモジュールは関数の集合
-
Vim script にはローカル関数を定義していく
-
ローカル関数!
-
定義した関数が vital のモジュールで使える
書き方のルール
_
で始まる関数は private 関数- モジュールにした際には見えない
_vital_
で始まる関数は予約されている
ロード時の処理
- 関数
_vital_loaded
を定義しておくと モジュールのロード時に呼ばれる - 引数にローダ V が渡される
- 他のモジュールの機能を利用できる
function! s:_vital_loaded(V)
let s:List = a:V.import('Data.List')
endfunction
依存の記述
- 他のモジュールに依存する場合は
_vital_depends
関数を定義する - この関数が依存するモジュールの リストを返すようにする
function! s:_vital_depends()
return ['Data.List']
endfunction
4. vital の今後
モジュールの充実
- Logger
- コマンドラインパーサ
- 乱数
- ...
みなさんの 協力が必要です!
テスト機構見直し
- テストは一応あるが、結構適当
- 複雑な実行方法
- 見づらい結果表示
- 正直つらい
外部モジュール
-
現在 vital は中央集権
-
気軽にオレオレモジュールが作れない
-
外部のモジュールも読めるようにする!
-
vitalize 時に同梱できればOKのはず
まとめ
-
vital はモジュールの数が少ない
-
そもそも開発者が足りてない
-
vital 開発参加者待ってます!