Skip to content

Instantly share code, notes, and snippets.

@thinca thinca/vital.md
Created Nov 3, 2012

Embed
What would you like to do?
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 ですよ

今日のお話

  1. vital.vim とは
  2. vital.vim の使い方
  3. vital モジュールの作り方
  4. 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 の使い方

手順

  1. プラグインに組み込む
  2. 機能を呼び出す

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. モジュール名を決める
  2. ファイルを作る
  3. モジュールを書く
    • 書き方のルール

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 開発参加者待ってます!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.