vital.vim の Prelude モジュールを使ってみた その1

:Vitalize [options] {target-dir} [{module} ...] *:Vitalize*
{target-dir} is root directory of your plugin. It must be like a
one of 'runtimepath'.
List of {module} is module names you want. If omitted, all modules
are included.
The Prelude module(|Vital.Prelude|) is always included.
https://github.com/vim-jp/vital.vim/blob/master/doc/vitalizer.txt

Prelude モジュールは, 基本モジュール(というか, なんというか...)なので Vitalize すると必ずインストールされるもの.

  • しかしヘルプがない
    • is_xxx とか system 関係はどんどん使えばいいと思う.
  • その1ででてこない関数たちはよくわからん状態. そのうち書けたら書く

型チェック関数

is_numeric(Value)
  • NUMBER または FLOAT のときに真を返す.
:let V = vital#of('vital')
:echo V.is_numeric(1)
"  ==> 1
:echo V.is_numeric(0.5)
"  ==> 1
:echo V.is_numeric('hoge')
"  ==> 0
is_integer(Value)
  • NUMBER と同じ.
    • なぜ同じ動作をする関数が複数あるんだろう.
:let V = vital#of('vital')
:echo V.is_integer(1)
"  ==> 1
:echo V.is_integer(0.5)
"  ==> 0
:echo V.is_integer('hoge')
"  ==> 0
is_number(Value)
  • NUMBER(整数)のときに真を返す.
  • is_integer() も同じ結果
:let V = vital#of('vital')
:echo V.is_number(1)
"  ==> 1
:echo V.is_number(0.5)
"  ==> 0
:echo V.is_number('hoge')
"  ==> 0
is_float(Value)
  • FLOAT(小数)のときに真を返す.
:let V = vital#of('vital')
:echo V.is_float(1)
"  ==> 0
:echo V.is_float(0.5)
"  ==> 1
:echo V.is_float('hoge')
"  ==> 0
is_string(Value)
  • 文字列のときに真を返す.
:let V = vital#of('vital')
:echo V.is_string(1)
"  ==> 0
:echo V.is_string(0.5)
"  ==> 0
:echo V.is_string('hoge')
"  ==> 1
:echo V.is_string([])
"  ==> 0
:echo V.is_string([1,2,3])
"  ==> 0
:echo V.is_string({})
"  ==> 0
is_list(Value)
  • Value がリストのときに真を返す.
:let V = vital#of('vital')
:echo V.is_list(1)
"  ==> 0
:echo V.is_list(0.5)
"  ==> 0
:echo V.is_list('hoge')
"  ==> 0
:echo V.is_list([])
"  ==> 1
:echo V.is_list([1,2,3])
"  ==> 1
:echo V.is_list({})
"  ==> 0
is_dict(Value)
  • Value が dictionary のときに真を返す.
:let V = vital#of('vital')
:echo V.is_dict(1)
"  ==> 0
:echo V.is_dict(0.5)
"  ==> 0
:echo V.is_dict('hoge')
"  ==> 0
:echo V.is_dict([])
"  ==> 0
:echo V.is_dict([1,2,3])
"  ==> 0
:echo V.is_dict({})
"  ==> 1
is_funcref(Value)
  • vim 力がないので使い道が良く分からない.
function! g:hogefunc()
	echo 'hoge'
endfunction
:let V = vital#of('vital')
:echo V.is_funcref(1)
"  ==> 0
:echo V.is_funcref(0.5)
"  ==> 0
:echo V.is_funcref('hoge')
"  ==> 0
:echo V.is_funcref([])
"  ==> 0
:echo V.is_funcref([1,2,3])
"  ==> 0
:echo V.is_funcref({})
"  ==> 0
":echo V.is_funcref(echo)
"  ==> E121
":echo V.is_funcref(g:hogefunc)
"  ==> E128
:echo V.is_funcref(function('tr'))
"  ==> 1

実行環境チェック関数

is_windows()
is_cygwin()
is_mac()
  • is_unix() は存在しない. どうやってチェックするのか?
    • すべて偽なら unix?
  • Ubuntu 環境での実行結果.
:let V = vital#of('vital')
:echo V.is_windows()
"  ==> 0
:echo V.is_cygwin()
"  ==> 0
:echo V.is_mac()
"  ==> 0

メッセージ出力関数

print_error(message)
  • ":echohl ErrorMsg" してメッセージを出力する
:let V = vital#of('vital')
:call V.print_error('hello!')

外部コマンド実行

system(str{, input{, timeout}})
  • 外部コマンドを実行する
  • vimproc のヘルプ参照
    • str 実行するコマンド文字列
    • input コマンドに渡す文字列. built-in 関数 system の第2引数
    • timeout タイムアウト. vimproc 時のみ有効
:let V = vital#of('vital')
:call V.system("ls /tmp")
get_last_status()

V.system で実行したコマンドの復帰値を返す.

:let V = vital#of('vital')
:call V.system("ls /tmp")
:echo V.get_last_status()
" ==> 0
:call V.system("ls /nonexist_directory")
:echo V.get_last_status()
" ==> 2
has_vimproc()

vimproc が実行可能であれば真.

    • vital.vim 利用者は V.system を呼べば良いだけなので、これは使うことないと思う.
:let V = vital#of('vital')
:echo V.has_vimproc()
"  ==> 1

追記(2012/11/17)

Shougo
いや、vimprocに依存したプラグインを書く場合はあったほうが良いです
vimprocはsystem()のためにあるわけではないし

http://lingr.com/room/vim/archives/2012/11/16
  • vimproc 存在チェック関数を vimproc プラグインに入れても意味がない.
  • こういう場合は, vital.vim の Prelude.system() を呼ぶ使い方ではない, と.
  • 固有のプラグインに対するチェック関数が vital.vim に用意されているのは違和感あるけど...

iconv

iconv(expr, from, to)
  • iconv のラッパ
    • " iconv() wrapper for safety." とコメントに書いてあるがどう safety なのかわからない.
    • 「変換できなかった場合には '' ではなく、入力 expr が復帰する」ところが safety?
:let V = vital#of('vital')
:echo '[' . iconv('', '', '') . ']'
" ==> []
:echo '[' . iconv('hoge', '', '') . ']'
" ==> [hoge]

:echo '[' . iconv('てすと', '', '') . ']'
" ==> [てすと]
:echo '[' . iconv('てすと', 'hoge', '') . ']'
" ==> [てすと]
:echo '[' . V.iconv('てすと', '', '') . ']'
" ==> [てすと]

追記(2012/11/17)

Shougo
そう。あとは、multibyte対応のVimでないときでも文字列が壊れないところ
これは以外に考慮から漏れがち

http://lingr.com/room/vim/archives/2012/11/16

使ったことないからわからないけど, multibyte 非対応ならそもそも表示できないんじゃないのかな??