*if_lua.txt* For Vim バージョン 8.1. Last change: 2019 Jul 21 VIMリファレンスマニュアル by Luis Carvalho
Vim の Lua インターフェイス
1. コマンド | |lua-commands| |
2. vim モジュール | |lua-vim| |
3. List ユーザーデータ | |lua-list| |
4. Dict ユーザーデータ | |lua-dict| |
5. Blob ユーザーデータ | |lua-blob| |
6. Funcref ユーザーデータ | |lua-funcref| |
7. バッファユーザーデータ | |lua-buffer| |
8. ウィンドウユーザーデータ | |lua-window| |
9. luaeval() Vim 函數 | |lua-luaeval| |
10. 動的ローディング | |lua-dynamic| |
{Vim が |+lua| 機能付きでコンパイルされたときのみ利用できます}
Lua チャンク {chunk} を實行する。
例:
:lua print("Hello, Vim!") :lua local curbuf = vim.buffer() curbuf[7] = "line #7"
Lua スクリプト {script} を實行する。
Note:
このコマンドは Lua が組み込まれてゐない場合は機能しません。エラーを避けるには |script-here| を參照。
{endmarker} の前には空白を入れることはできません。
"<<" の後の [endmarker] を省略した場合は |:append| や |:insert| コマンドのやうにドット "." で {script} を閉ぢます。
|:lua| コマンドのこの書式は主に Vim script の中に 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
どの Lua のバージョンであるかを見るには:
:lua print(_VERSION)
もし LuaJIT を使つてゐるならばこれも使へます:
:lua print(jit.version)
Lua 函數 "function (line, linenr) {body} end" を [range] で指定された各行に對して實行する。函數の引數には各行のテキスト (末尾の <EOL> 無し) と現在の行番號が渡されます。函數の戾り値が文字列なら行のテキストはその文字列で置換されます。[range] を省略するとすべてのファイル ("1,$") が處理されます。
例:
: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
{file} 內の Lua スクリプトを實行する。
引數全體で 1 つのファイル名として認識されます。
例:
:luafile script.lua :luafile %
これらすべてのコマンドはコマンドライン (:lua と :luado) かファイル (:luafile) で指定された Lua チャンクを範圍指定 [range] に對して實行します。Lua インタープリターと同樣に各チャンクはそれぞれのスコープを持つため、各コマンドの實行で共有されるのはグローバル變數だけです。すべての Lua デフォルトライブラリが利用可能です。加へて、Lua の "print" 函數の出力先は Vim のメッセージエリアになり、引數はタブ文字ではなくスペースで區切られます。
Lua は "vim" モジュール (|lua-vim| 參照) を使つて、Vim コマンドを發行したりバッファ (|lua-buffer|) やウィンドウ (|lua-window|) を管理したりします。ただし、コマンドが |sandbox| の中で實行されたときはバッファの變更、新規バッファの作成、カーソル位置の變更は制限されます。
Lua からは "vim" モジュールを使つて Vim を操作します。範圍指定の最初と最後の行は "vim.firstline" と "vim.lastline" に格納されてゐます。vim モジュールにはバッファ操作、ウィンドウ操作、現在行の取得、Vim 式評價、Vim コマンド實行、などのルーチンが含まれてゐます。
"arg" が 1, ..., n の數値をキーに持つ Lua のテーブルの時、i = 1, ..., n に對して l[i] = arg[i] となるやうなリスト l を返し (|List| を參照) 、さうでなければ空のリストを返します。數値以外のキーは戾り値のリストの初期化に使はれません。變換のルールについては |lua-eval| を參照してください。例:
:lua t = {math.pi, false, say = 'hi'} :echo luaeval('vim.list(t)') :" [3.141593, v:false], 'say' is ignored
"arg" が Lua のテーブルの時、"arg" のそれぞれのキー k に對して d[k] = arg[k] となるやうな辭書を返し (|Dictionary| を參照) 、さうでなければ空の辭書を返します。數値のキーは文字列に變換されます。文字列以外のキーは戾り値の辭書の初期化に使はれません。變換のルールについては |lua-eval| を參照してください。例:
:lua t = {math.pi, false, say = 'hi'} :echo luaeval('vim.dict(t)') :" {'say': 'hi'}, numeric keys ignored
空の Blob、または "arg" が Lua の文字列ならば、バイト文字列として "arg" と等價な Blob b を返す。例:
:lua s = "12ab\x00\x80\xfe\xff" :echo luaeval('vim.blob(s)') :" 0z31326162.0080FEFF
<
函數 {name} への函數參照を返します (|Funcref| を參照) 。その値は Vim の function() と等價です。
"arg" が數値ならバッファリストの "arg" 番のバッファを返す。"arg" が文字列ならフルパスかショートパスが "arg" に一致するバッファを返す。どちらの場合もバッファが見つからなければ ’nil’ (nil 値、文字列ではない) を返す。その他、"toboolean(arg)" が ’true’ ならバッファリストの最初のバッファを、さうでなければカレントバッファを返す。
"arg" が數値なら "arg" 番のウィンドウを返す。ウィンドウが無ければ ’nil’ (nil 値、文字列ではない) を返す。その他、"toboolean(arg)" が’true’ なら最初のウィンドウを、さうでなければカレントウィンドウを返す。
{arg} の型を返す。これは Lua の "type" 函數と同じやうなものですが、{arg} がリスト、辭書、函數參照、バッファ、ウィンドウのときに、"list", "dict", "funcref", "buffer", "window" をそれぞれ返します。例:
:lua l = vim.list() :lua print(type(l), vim.type(l)) :" list
Vim の Ex コマンド {cmd} を實行する。例:
:lua vim.command"set tw=60" :lua vim.command"normal ddp"
式 {expr} (|expression| 參照) を評價してその結果を Lua の値に變換して返す。Vim の文字列と數値はそのまま Lua の文字列と數値に變換される。Vim のリストと辭書は Lua のユーザーデータに變換される (|lua-list| と |lua-dict| を參照)。例:
:lua tw = vim.eval"&tw" :lua print(vim.eval"{'a': 'one'}".a)
現在行 (末尾の <EOL> 無し) を返す。型は Lua 文字列。
ビープ音を鳴らす。
ファイル {fname} 用の新しいバッファを開いて返す。
Note:
カレントバッファは變更されません。
List ユーザーデータは vim のリストを表します。Vim のリストに近い形で操作できるやうになつてゐます。リストはオブジェクトなので、Lua 內で參照してゐるリストを變更すると、それは Vim 內にも影響します。逆も同樣です。リスト "l" は以下のプロパティとメソッドを持つてゐます:
例:
:let l = [1, 'item'] :lua l = vim.eval('l') -- 'l' と同じ :lua l:add(vim.list()) :lua l[0] = math.pi :echo l[0] " 3.141593 :lua l[0] = nil -- 最初の項目を削除する :lua l:insert(true, 1) :lua print(l, #l, l[0], l[1], l[-1]) :lua for item in l() do print(item) end
list ユーザーデータと同樣、dict ユーザーデータは vim の辭書を表します。辭書もオブジェクトなので、Lua と Vim 閒で參照が保持されます。辭書 "d" は以下のプロパティを持つてゐます。
例:
:let d = {'n':10} :lua d = vim.eval('d') -- '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 -- エントリを削除する :echo d
Blob ユーザーデータは vim の Blob を表します。Blob "b" は以下のプロパティを持つてゐます。
例:
:let b = 0z001122 :lua b = vim.eval('b') -- 'b' と同じ :lua print(b, b[0], #b) :lua b[1] = 32 :lua b[#b] = 0x33 -- 末尾にバイトを追加 :lua b:add("\x80\x81\xfe\xff") :echo b
Funcref ユーザーデータは Vim における函數參照變數を表します。"dict" 屬性付きで定義された Vim の函數參照 はその呼び出し時に "self" に適切に辭書が代入できるやうに、辭書のメンバーとして取得できなければなりません (下記の例を參照してください) 。Lua の函數參照 "f" は次のプロパティを持つてゐます:
例:
:function I(x) : return a:x : endfunction :let R = function('I') :lua i1 = vim.funcref('I') :lua i2 = vim.eval('R') :lua print(#i1, #i2) -- どちらも 'I' :lua print(i1, i2, #i2(i1) == #i1(i2)) :function Mylen() dict : return len(self.data) : endfunction :let mydict = {'data': [0, 1, 2, 3]} :lua d = vim.eval('mydict'); d.len = vim.funcref('Mylen') :echo mydict.len() :lua l = d.len -- 'self' として d を割り當てる :lua print(l())
バッファユーザーデータは Vim のバッファを表します。バッファユーザーデータ "b" は以下のプロパティとメソッドを持つてゐます:
例:
:lua b = vim.buffer() -- カレントバッファ :lua print(b.name, b.number) :lua b[1] = "first line" :lua b:insert("FIRST!", 0) :lua b[1] = nil -- 先頭の行を削除する :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"() -- バッファを開いてそれをカレントにする function! ListBuffers() lua << EOF local b = vim.buffer(true) -- リストの最初のバッファ while b ~= nil do print(b.number, b.name, #b) b = b:next() end vim.beep() EOF endfunction
ウィンドウオブジェクトは Vim のウィンドウを表します。ウィンドウユーザーデータ"w" は以下のプロパティとメソッドを持つてゐます:
例:
:lua w = vim.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")
"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) -- typval を返す end
Note:
"_A" には "luaeval" の引數が渡されます。Lua の數値、文字列、リスト、Blob、辭書そして Funcref ユーザーデータはそれぞれの Vim の型に變換されます。ただし、Lua のブール値は數値に變換されます。リスト、辭書および函數參照以外のユーザーデータを含む、それ以外の Lua の型を變換しようとするとエラーが返されます。
例:
: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)
MS-Windows と Unix では Lua ライブラリを動的にロードすることができます。|+lua/dyn| が |:version| の出力に含まれてゐる時に利用できます。
これにより、Vim は必要な時だけ Lua DLL もしくは共有ライブラリを檢索します。もしあなたが Lua インターフェイスを必要としてをらず使はなければ Lua DLL もしくは共有ライブラリ無しで Vim を使ふことができます。
Lua インターフェイスを利用するには Lua DLL が檢索パス內になければなりません。コンソールウィンドウ內で "path" と入力し、どのディレクトリが使はれてゐるかを確認してください。’luadll’ オプションで Lua の DLL を指定する事ができます。DLL のバージョンは Vim と共にコンパイルされた Lua のバージョンと一致してゐなければなりません。
コンパイル時に指定された DYNAMIC_LUA_DLL ファイルの代はりに ’luadll’ オプションで Lua 共有ライブラリを指定できます。共有ライブラリのバージョンはVim と共にコンパイルされた Lua のバージョンと一致してゐなければなりません。