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