*if_lua.txt*    For Vim バージョン 7.3.  Last change: 2012 Jun 29


		  VIMリファレンスマニュアル    by Luis Carvalho


Vim の Lua インターフェース				*lua* *Lua*

1. コマンド			|lua-commands|
2. vim モジュール		|lua-vim|
3. List ユーザーデータ		|lua-list|
4. Dict ユーザーデータ		|lua-dict|
5. バッファユーザーデータ	|lua-buffer|
6. ウィンドウユーザーデータ	|lua-window|
7. luaeval 関数			|lua-luaeval|

{Vi にはこれらのコマンドはありません}

Lua インターフェースは Vim が |+lua| 機能付きでコンパイルされたときのみ利用で
きます。

==============================================================================
1. コマンド						*lua-commands*

							*:lua*
:[range]lua {chunk}
			Lua チャンク {chunk} を実行する。 {Vi にはありません}

例:
>
	:lua print("Hello, Vim!")
	:lua local curbuf = vim.buffer() curbuf[7] = "line #7"
<

:[range]lua << {endmarker}
{script}
{endmarker}
			Lua スクリプト {script} を実行する。
			{Vi にはありません}
			Note: このコマンドは Lua が組み込まれていない場合は機
			能しません。エラーを避けるには |script-here| を参照。

{endmarker} の前には空白を入れることはできません。"<<" の後の {endmarker} を省
略した場合は |:append| や |:insert| コマンドのようにドット "." で {script} を
閉じます。
|:lua| コマンドのこの書式は主に Vim スクリプトの中に Lua コードを埋め込むとき
に便利です。

例:
>
	function! CurrentLineInfo()
	lua << EOF
	local linenr = vim.window().line
	local curline = vim.buffer()[linenr]
	print(string.format("Current line [%d] has %d chars",
		linenr, #curline))
	EOF
	endfunction
<

							*:luado*
:[range]luado {body}	Lua 関数 "function (line, linenr) {body} end" を
			[range] で指定された各行に対して実行する。関数の引数に
			は各行のテキスト (末尾の <EOL> 無し) と現在の行番号が
			渡されます。関数の返り値が文字列なら行のテキストはその
			文字列で置換されます。[range] を省略するとすべてのファ
			イル ("1,$") が処理されます。
							{Vi にはありません}

例:
>
	:luado return string.format("%s\t%d", line:reverse(), #line)

	:lua require"lpeg"
	:lua -- balanced parenthesis grammar:
	:lua bp = lpeg.P{ "(" * ((1 - lpeg.S"()") + lpeg.V(1))^0 * ")" }
	:luado if bp:match(line) then return "-->\t" .. line end
<

							*:luafile*
:[range]luafile {file}
			{file} 内の Lua スクリプトを実行する。
			{Vi にはありません}
			引数全体で一つのファイル名として認識されます。

例:
>
	:luafile script.lua
	:luafile %
<

これらすべてのコマンドはコマンドライン (:lua と :luado) かファイル (:luafile)
で指定された Lua チャンクを範囲指定 [range] に対して実行します。Lua インタプリ
タと同様に各チャンクはそれぞれのスコープを持つため、各コマンドの実行で共有され
るのはグローバル変数だけです。すべての Lua デフォルトライブラリが利用可能で
す。加えて、Lua の "print" 関数の出力先は Vim のメッセージエリアになり、引数は
タブ文字ではなくスペースで区切られます。

Lua は "vim" モジュール (|lua-vim| 参照) を使って、Vim コマンドを発行したり
バッファ (|lua-buffer|) やウィンドウ (|lua-window|) を管理したりします。ただ
し、コマンドが |sandbox| の中で実行されたときはバッファの変更、新規バッファの
作成、カーソル位置の変更は制限されます。


==============================================================================
2. vim モジュール					*lua-vim*

Lua からは "vim" モジュールを使って Vim を操作します。範囲指定の最初と最後の行
は "vim.firstline" と "vim.lastline" に格納されています。vim モジュールには
バッファ操作、ウィンドウ操作、現在行の取得、Vim 式評価、Vim コマンド実行、など
のルーチンが含まれています。

	vim.list()		空のリストを返す (|List| 参照)。

	vim.dict()		空の辞書を返す (|Dictionary| 参照)。

	vim.buffer([arg])	"arg" が数値ならバッファリストの "arg" 番の
				バッファを返す。"arg" が文字列ならフルパスか
				ショートパスが "arg" に一致するバッファを返
				す。どちらの場合もバッファが見つからなければ
				'nil' (nil 値、文字列ではない) を返す。その
				他、"toboolean(arg)" が 'true' ならバッファリ
				ストの最初のバッファを、そうでなければカレント
				バッファを返す。

	vim.window([arg])	"arg" が数値なら "arg" 番のウィンドウを返す。
				ウィンドウが無ければ 'nil' (nil 値、文字列では
				ない) を返す。その他、"toboolean(arg)" が
				'true' なら最初のウィンドウを、そうでなければ
				カレントウィンドウを返す。

	vim.type({arg})		{arg} の型を返す。これは Lua の "type" 関数と
				同じようなものですが、{arg} がリスト、辞書、
				バッファ、ウィンドウのときに、 "list"、
				"dict"、"buffer"、"window" をそれぞれ返しま
				す。例: >
					:lua l = vim.list()
					:lua print(type(l), vim.type(l))
					:" userdata list
<
	vim.command({cmd})	Vim の Ex コマンド {cmd} を実行する。
				例: >
					:lua vim.command"set tw=60"
					:lua vim.command"normal ddp"
<
	vim.eval({expr})	式 {expr} (|expression| 参照) を評価してその結
				果を Lua の値に変換して返す。
				Vim の文字列と数値はそのまま Lua の文字列と数
				値に変換される。Vim のリストと辞書は Lua の
				ユーザーデータに変換される (|lua-list| と
				|lua-dict| を参照)。
				例: >
					:lua tw = vim.eval"&tw"
					:lua print(vim.eval"{'a': 'one'}".a)
<
	vim.line()		現在行 (末尾の <EOL> 無し) を返す。型は Lua 文
				字列。

	vim.beep()		ビープ音を鳴らす。

	vim.open({fname})	ファイル {fname} 用の新しいバッファを開いて返
				す。Note: カレントバッファは変更されません。


==============================================================================
3. List ユーザーデータ					*lua-list*

List ユーザーデータは vim のリストを表します。Vim のリストに近い形で操作できる
ようになっています。リストはオブジェクトなので、Lua 内で参照しているリストを変
更すると、それは Vim 内にも影響します。逆も同様です。リスト "l" は以下のプロパ
ティとメソッドを持っています:

プロパティ
----------
	o "#l" はリスト "l" の要素数。Vim の "len(l)" と同じ。
	o "l[k]" は "l" の k 個目の要素を返す。"l" のインデックスは Vim と同じ
	  で、 0 を基準とする。
	  k 個目の要素を変更するには、単に "l[k] = newitem" とする。
	  "l[k] = nil" で k 個目の要素を "l" から削除できる。
	o "l()" は "l" のイテレータを返す。

メソッド
--------
	o "l:add(item)" は "item" を "l" の末尾に追加する。
	o "l:insert(item[, pos])" は "item" を "pos" (省略可) の位置に挿入す
	  る。"pos" のデフォルト値は 0。

例:
>
	:let l = [1, 'item']
	:lua l = vim.eval('l') -- same 'l'
	:lua l:add(vim.list())
	:lua l[0] = math.pi
	:echo l[0] " 3.141593
	:lua l[0] = nil -- remove first item
	:lua l:insert(true, 1)
	:lua print(l, #l, l[0], l[1], l[-1])
	:lua for item in l() do print(item) end
<

==============================================================================
4. Dict ユーザーデータ					*lua-dict*

list ユーザーデータと同様、dict ユーザーデータは vim の辞書を表します。辞書も
オブジェクトなので、Lua と Vim 間で参照が保持されます。辞書 "d" は以下のプロパ
ティを持っています。

プロパティ
----------
	o "#d" は辞書 "d" の要素数。Vim の "len(d)" と同じ。
	o "d.key" または "d['key']" は "d" の "key" 要素の値を返す。
	   このキーの値を変更するには、単に "d.key = newvalue" とする。
	   "d.key = nil" で "d" から要素を削除できる。
	o "d()" は "d" のイテレータを返す。Vim の "items(d)" と同じ。

例:
>
	:let d = {'n':10}
	:lua d = vim.eval('d') -- same 'd'
	:lua print(d, d.n, #d)
	:let d.self = d
	:lua for k, v in d() do print(d, k, v) end
	:lua d.x = math.pi
	:lua d.self = nil -- remove entry
	:echo d
<

==============================================================================
5. バッファユーザーデータ				*lua-buffer*

バッファユーザーデータは Vim のバッファを表します。バッファユーザーデータ "b"
は以下のプロパティとメソッドを持っています:

プロパティ
----------
	o "b()"		"b" をカレントバッファに設定する。
	o "#b"		バッファ "b" の行数。
	o "b[k]"	バッファの k 行目。"b[k] = newline" で k 行目を文字列
			"newline" で置換する。"b[k] = nil" で k 行目を削除す
			る。
	o "b.name"	バッファ "b" のショートパス (読込専用)。
	o "b.fname"	バッファ "b" のフルパス (読込専用)。
	o "b.number"	バッファ "b" のバッファリスト内の位置 (読込専用)。

メソッド
--------
	o "b:insert(newline[, pos])"
			文字列 "newline" をバッファの "pos" の位置 (省略可) に
			挿入する。"pos" を省略した場合は "#b + 1" に挿入される。
			"pos == 0" の場合は "newline" は 1 行目に挿入される。
	o "b:next()"	 バッファリストの "b" の次のバッファを返す。
	o "b:previous()" バッファリストの "b" の前のバッファを返す。
	o "b:isvalid()"	 バッファ "b" が実在するバッファ (メモリが開放されてい
			 ない) なら 'true' (boolean) を返す。

例:
>
	:lua b = vim.buffer() -- current buffer
	:lua print(b.name, b.number)
	:lua b[1] = "first line"
	:lua b:insert("FIRST!", 0)
	:lua b[1] = nil -- delete top line
	:lua for i=1,3 do b:insert(math.random()) end
	:3,4lua for i=vim.lastline,vim.firstline,-1 do b[i] = nil end
	:lua vim.open"myfile"() -- open buffer and set it as current

	function! ListBuffers()
	lua << EOF
	local b = vim.buffer(true) -- first buffer in list
	while b ~= nil do
		print(b.number, b.name, #b)
		b = b:next()
	end
	vim.beep()
	EOF
	endfunction
<

==============================================================================
6. ウィンドウユーザーデータ				*lua-window*

ウィンドウオブジェクトは Vim のウィンドウを表します。ウィンドウユーザーデータ
"w" は以下のプロパティとメソッドを持っています:

プロパティ
----------
	o "w()"		"w" をカレントウィンドウに設定する。
	o "w.buffer"	ウィンドウ "w" のバッファ (読込専用)。
	o "w.line"	ウィンドウ "w" のカーソルの行。
	o "w.col"	ウィンドウ "w" のカーソルの列。
	o "w.width"	ウィンドウ "w" の幅。
	o "w.height"	ウィンドウ "w" の高さ。

メソッド
--------
	o "w:next()"	 "w" の次のウィンドウを返す。
	o "w:previous()" "w" の前のウィンドウを返す。
	o "w:isvalid()"	ウィンドウ "w" が実在するウィンドウ (メモリが開放され
			ていない) なら 'true' を返す。

例:
>
	:lua w = vim.window() -- current window
	:lua print(w.buffer.name, w.line, w.col)
	:lua w.width = w.width + math.random(10)
	:lua w.height = 2 * math.random() * w.height
	:lua n,w = 0,vim.window(true) while w~=nil do n,w = n + 1,w:next() end
	:lua print("There are " .. n .. " windows")
<

==============================================================================
7. luaeval 関数						*lua-luaeval* *lua-eval*

"luaeval" は "vim.eval" と対となる関数で Lua の値を Vim に渡すことができます。
"luaeval" は式文字列と任意の引数を受け取り、式の結果を返します。意味的には次の
Lua コードと同じです:
>
	local chunkheader = "local _A = select(1, ...) return "
	function luaeval (expstr, arg)
	    local chunk = assert(loadstring(chunkheader .. expstr, "luaeval"))
	    return chunk(arg) -- return typval
	end
<
Note "_A" には "luaeval" の引数が渡されます。例: >

	:echo luaeval('math.pi')
	:lua a = vim.list():add('newlist')
	:let a = luaeval('a')
	:echo a[0] " 'newlist'
	:function Rand(x,y) " random uniform between x and y
	:  return luaeval('(_A.y-_A.x)*math.random()+_A.x', {'x':a:x,'y':a:y})
	:  endfunction
	:echo Rand(1,10)


==============================================================================
 vim:tw=78:ts=8:noet:ft=help:norl:
