vital.vimをどんどん使っていこう。


この記事は[Vim Advent Calendar 2013][0] : ATND 3日目の記事になります。

[Vim Advent Calendar 2013][0]の(私の投稿の)1回目ということで、今回は[vital.vim][2]について現時点での状況をまとめてみたいと思います。

# vital.vimとは

[vital.vim][2]は、Vimプラグインの作成する際に必要になるだろう関数をまとめたライブラリ群です。
もちろん、Vimプラグインの作成だけでなく、通常のVim scriptを書くときにも使うことが出来ます。

> https://github.com/vim-jp/vital.vim


# vital.vimの構成

[vital.vim][2]には色んなモジュールがあります。[vital.vim][2]ではライブラリのことをモジュールと呼びます。
2013年12月2日の時点で、[vital.vim][2]には全36個のモジュールが存在します。


* Bitwise
ビットを扱う演算を行うためのモジュールです。

* Data.Base64
Vim scriptからBase64を扱うためのモジュールです。

* Data.Collection
Vim scriptからコレクションを扱うためのモジュールです。

* Data.Dict
辞書操作に関するモジュールです。

* Data.LazyList
リスト操作に関するモジュールです。(遅延評価版)

* Data.List
リスト操作に関するモジュールです。

* Data.OrderedSet
順序あり重複なしの集合を扱うためのモジュールです。

* Data.String
Vim scriptの文字列に関するモジュールです。

* Data.Tree
木構造を扱うためのモジュールです。

* Database.SQLite
Vim scriptからSQLiteを扱うためのモジュールです。

* DateTime
日付・時刻に関するモジュールです。

* Experimental.Functor
関数オブジェクトを操作するためのモジュールです。

* Locale.Message
簡単にロケールに合わせたメッセージに切り替えるためのモジュールです。

* Mapping
キーマッピングに関するモジュールです。

* Math
数学的な演算を行うためのモジュールです。

* OptionParser
コマンドオプションを解析するモジュールです。

* Prelude
各モジュール内で使われる汎用的な関数を集めた標準モジュールです。

* Process
プロセスを扱うためのモジュールです。

* ProcessManager
プロセスを管理するためのモジュールです。

* Random.Xor128
疑似乱数を生成するためのモジュールです。

* System.Cache
キャッシングを簡単に扱うためのモジュールです。

* System.File
ファイル操作を扱うためのモジュールです。

* System.Filepath
ファイルパスを扱うためのモジュールです。

* Text.CSV
CSVファイルを扱うためのモジュールです。

* Text.Lexer
文字列を字句解析するためのモジュールです。

* Text.LTSV
LTSV(Labeled Tab Separated Values)とVim scriptの辞書を相互変換するモジュールです。

* Text.Parser
Text.Lexerモジュールに特化したパーサーです。

* Vim.Buffer
バッファを扱うためのモジュールです。

* Vim.BufferManager
バッファ管理するためのモジュールです。

* Vim.Compat
Vimのバージョンを扱うためのモジュールです。

* Vim.Message
任意のハイライトでechoするのに特化したモジュールです。

* Web.HTML
HTMLをVim scriptの辞書へ変換するためのモジュールです。

* Web.HTTP
HTTP通信を行うためのモジュールです。

* Web.JSON
JSON(JavaScript Object Notation)とVim scriptの辞書を相互変換するモジュールです。

* Web.URI
URIを扱うためのモジュールです。

* Web.XML
XMLをVim scriptの辞書へ変換するためのモジュールです。


# vital.vimの特徴

[vital.vim][2]は、単体で使用することももちろん可能ですが、vital.vimはプラグインに任意のモジュールを埋め込むことも出来ます。
埋め込むことによって何の利点があるかというと、まず、vital.vimに依存しないプラグインを作成することが出来ます。
ここでいう「依存」とはvital.vim本体をruntimepathに含める必要がないという意味です。
よって、プラグインユーザーはvital.vim本体をインストールする必要がありません。
もう１つは、複数のプラグインにあるモジュールを、それぞれ別のリビジョンを使って使用することが出来ます。
欠点としましては、個々のプラグインに同じモジュールが重複してしまったりするので、プラグインの総サイズが若干多くなってしまいます。


# vital.vimの使い方

## 単体で使用する場合

[vital.vim][2]は単体でも使用する事が出来ます。
今回は簡単なので単体プラグインとして使用する例を示します。

まず、[vital.vim][2]をインストールしてruntimepathに含めましょう。

```vim:
set runtimepath+=~/.vim/bundle/vital.vim
```

実際に使うには、

```vim:
let s:V = vital#of('vital')

let s:Prelude = s:V.import('Prelude')
let s:List = s:V.import('Data.List')

let d = { 'A' : 1, 'C' : 3 }
echo string(d)
" { 'A' : 1, 'C' : 3 }
call s:Prelude.set_dictionary_helper(d,"A,B,C",0)
echo string(d)
" { 'A' : 1, 'B' : 0, 'C' : 3 }

let lst = [[1],[2,3]]
echo s:List.flatten(lst)
" [1,2,3]
echo lst
" [[1],[2,3]]
echo s:List.flatten([[1],[2,[3,4]]])
" [1,2,3,4]
```

のように使います。

単体で使用する場合には、`vital#of()`の引数は必ず`'vital'`になります。
で次に、使いたいモジュールを`let s:Prelude = s:V.import('Prelude')`のような感じで`vital#of()`の引数にモジュール名を指定します。
モジュールを使う方法は`s:V.import('Prelude')`の方法以外にもありますが、今回は省略します。
`s:V.import()`の戻り値はそのモジュールのインスタンスです。
このインスタンスは、そのモジュールで定義されている関数がメンバとなる辞書になります。
なので、`s:List.flatten([[1],[2,[3,4]]]) `のようなドット記表で呼び出すことが出来ます。




## プラグインで使用する場合

[vital.vim][2]をプラグインで使用する場合にはちょっとした手間が必要になります。
仮に、ホームディレクトリにhogeというプラグインを作成するとします。

* まず、ディレクトリを作成しそのディレクトリに移動します。

```vim:
:call mkdir(expand('~/hoge'))
:lcd ~/hoge
```

* そしたら、`Vitalize`コマンドを使用して、埋め込みたいモジュールを指定します。

```vim:
:Vitalize . Data.List  Web.URI
```

この例ではhogeというプラグインにData.ListとWeb.URIを埋め込みます。
`.`は埋め込みたいプラグインのパスを指定します。

* 実際に、埋め込んだモジュールを使用するには以下のようにします。

```vim:
" ~/hoge/autoload/hoge.vim

let s:V = vital#of('hoge')

let s:List = s:V.import('Data.List')

function! hoge#foo()
  return s:List.flatten([[1],[2,[3,4]]])
endfunction
```

`vital#of()`の引数がプラグイン名に変わっただけですね、簡単です。
あとは単体の場合と同じように使うことが出来ます。


# 終わりに

とりあえずこれで以上になりますが、今回が`vital#of()`の引数に指定の仕方がわからないというのをどっか聞いたので、これに焦点を当てて説明してみました。

以上、[Vim Advent Calendar 2013][0] : ATND 3日目の記事でした。

[0]: http://atnd.org/events/45072
[1]: https://twitter.com/25kei12
[2]: https://github.com/vim-jp/vital.vim
[3]: https://github.com/rbtnn/vimconsole.vim
[4]: https://github.com/rbtnn/puyo.vim