1*6aa57295SBram Moolenaar*if_lua.txt* For Vim version 8.2. Last change: 2021 Aug 06 20ba04296SBram Moolenaar 30ba04296SBram Moolenaar 40ba04296SBram Moolenaar VIM REFERENCE MANUAL by Luis Carvalho 50ba04296SBram Moolenaar 60ba04296SBram Moolenaar 70ba04296SBram MoolenaarThe Lua Interface to Vim *lua* *Lua* 80ba04296SBram Moolenaar 90ba04296SBram Moolenaar1. Commands |lua-commands| 100ba04296SBram Moolenaar2. The vim module |lua-vim| 111dced572SBram Moolenaar3. List userdata |lua-list| 121dced572SBram Moolenaar4. Dict userdata |lua-dict| 13b7828690SBram Moolenaar5. Blob userdata |lua-blob| 14b7828690SBram Moolenaar6. Funcref userdata |lua-funcref| 15b7828690SBram Moolenaar7. Buffer userdata |lua-buffer| 16b7828690SBram Moolenaar8. Window userdata |lua-window| 17b7828690SBram Moolenaar9. luaeval() Vim function |lua-luaeval| 18b7828690SBram Moolenaar10. Dynamic loading |lua-dynamic| 190ba04296SBram Moolenaar 2025c9c680SBram Moolenaar{only available when Vim was compiled with the |+lua| feature} 210ba04296SBram Moolenaar 220ba04296SBram Moolenaar============================================================================== 230ba04296SBram Moolenaar1. Commands *lua-commands* 240ba04296SBram Moolenaar 250ba04296SBram Moolenaar *:lua* 260ba04296SBram Moolenaar:[range]lua {chunk} 2725c9c680SBram Moolenaar Execute Lua chunk {chunk}. 280ba04296SBram Moolenaar 290ba04296SBram MoolenaarExamples: 300ba04296SBram Moolenaar> 310ba04296SBram Moolenaar :lua print("Hello, Vim!") 320ba04296SBram Moolenaar :lua local curbuf = vim.buffer() curbuf[7] = "line #7" 330ba04296SBram Moolenaar< 340ba04296SBram Moolenaar 356c2b7b80SBram Moolenaar:[range]lua << [trim] [{endmarker}] 360ba04296SBram Moolenaar{script} 370ba04296SBram Moolenaar{endmarker} 3825c9c680SBram Moolenaar Execute Lua script {script}. 390ba04296SBram Moolenaar Note: This command doesn't work when the Lua 400ba04296SBram Moolenaar feature wasn't compiled in. To avoid errors, see 410ba04296SBram Moolenaar |script-here|. 420ba04296SBram Moolenaar 435477506aSBram MoolenaarIf [endmarker] is omitted from after the "<<", a dot '.' must be used after 446c2b7b80SBram Moolenaar{script}, like for the |:append| and |:insert| commands. Refer to 456c2b7b80SBram Moolenaar|:let-heredoc| for more information. 465477506aSBram Moolenaar 470ba04296SBram MoolenaarThis form of the |:lua| command is mainly useful for including Lua code 480ba04296SBram Moolenaarin Vim scripts. 490ba04296SBram Moolenaar 500ba04296SBram MoolenaarExample: 510ba04296SBram Moolenaar> 520ba04296SBram Moolenaar function! CurrentLineInfo() 530ba04296SBram Moolenaar lua << EOF 540ba04296SBram Moolenaar local linenr = vim.window().line 550ba04296SBram Moolenaar local curline = vim.buffer()[linenr] 560ba04296SBram Moolenaar print(string.format("Current line [%d] has %d chars", 570ba04296SBram Moolenaar linenr, #curline)) 580ba04296SBram Moolenaar EOF 590ba04296SBram Moolenaar endfunction 600ba04296SBram Moolenaar< 61abd468edSBram MoolenaarTo see what version of Lua you have: > 62abd468edSBram Moolenaar :lua print(_VERSION) 63abd468edSBram Moolenaar 64abd468edSBram MoolenaarIf you use LuaJIT you can also use this: > 65abd468edSBram Moolenaar :lua print(jit.version) 66abd468edSBram Moolenaar< 670ba04296SBram Moolenaar 680ba04296SBram Moolenaar *:luado* 6953bfca22SBram Moolenaar:[range]luado {body} Execute Lua function "function (line, linenr) {body} 7053bfca22SBram Moolenaar end" for each line in the [range], with the function 7153bfca22SBram Moolenaar argument being set to the text of each line in turn, 7253bfca22SBram Moolenaar without a trailing <EOL>, and the current line number. 7353bfca22SBram Moolenaar If the value returned by the function is a string it 7453bfca22SBram Moolenaar becomes the text of the line in the current turn. The 7553bfca22SBram Moolenaar default for [range] is the whole file: "1,$". 760ba04296SBram Moolenaar 770ba04296SBram MoolenaarExamples: 780ba04296SBram Moolenaar> 790ba04296SBram Moolenaar :luado return string.format("%s\t%d", line:reverse(), #line) 800ba04296SBram Moolenaar 810ba04296SBram Moolenaar :lua require"lpeg" 820ba04296SBram Moolenaar :lua -- balanced parenthesis grammar: 830ba04296SBram Moolenaar :lua bp = lpeg.P{ "(" * ((1 - lpeg.S"()") + lpeg.V(1))^0 * ")" } 840ba04296SBram Moolenaar :luado if bp:match(line) then return "-->\t" .. line end 850ba04296SBram Moolenaar< 860ba04296SBram Moolenaar 870ba04296SBram Moolenaar *:luafile* 880ba04296SBram Moolenaar:[range]luafile {file} 8925c9c680SBram Moolenaar Execute Lua script in {file}. 900ba04296SBram Moolenaar The whole argument is used as a single file name. 910ba04296SBram Moolenaar 920ba04296SBram MoolenaarExamples: 930ba04296SBram Moolenaar> 940ba04296SBram Moolenaar :luafile script.lua 950ba04296SBram Moolenaar :luafile % 960ba04296SBram Moolenaar< 970ba04296SBram Moolenaar 980ba04296SBram MoolenaarAll these commands execute a Lua chunk from either the command line (:lua and 990ba04296SBram Moolenaar:luado) or a file (:luafile) with the given line [range]. Similarly to the Lua 1000ba04296SBram Moolenaarinterpreter, each chunk has its own scope and so only global variables are 1011dced572SBram Moolenaarshared between command calls. All Lua default libraries are available. In 1021dced572SBram Moolenaaraddition, Lua "print" function has its output redirected to the Vim message 1031dced572SBram Moolenaararea, with arguments separated by a white space instead of a tab. 1040ba04296SBram Moolenaar 1050ba04296SBram MoolenaarLua uses the "vim" module (see |lua-vim|) to issue commands to Vim 1060ba04296SBram Moolenaarand manage buffers (|lua-buffer|) and windows (|lua-window|). However, 1070ba04296SBram Moolenaarprocedures that alter buffer content, open new buffers, and change cursor 1080ba04296SBram Moolenaarposition are restricted when the command is executed in the |sandbox|. 1090ba04296SBram Moolenaar 1100ba04296SBram Moolenaar 1110ba04296SBram Moolenaar============================================================================== 1120ba04296SBram Moolenaar2. The vim module *lua-vim* 1130ba04296SBram Moolenaar 1140ba04296SBram MoolenaarLua interfaces Vim through the "vim" module. The first and last line of the 1152334b6d5SBram Moolenaarinput range are stored in "vim.firstline" and "vim.lastline" respectively. The 1160ba04296SBram Moolenaarmodule also includes routines for buffer, window, and current line queries, 1170ba04296SBram MoolenaarVim evaluation and command execution, and others. 1180ba04296SBram Moolenaar 11952b91d80SBram Moolenaar vim.list([arg]) Returns an empty list or, if "arg" is a Lua 12052b91d80SBram Moolenaar table with numeric keys 1, ..., n (a 12152b91d80SBram Moolenaar "sequence"), returns a list l such that l[i] = 12252b91d80SBram Moolenaar arg[i] for i = 1, ..., n (see |List|). 12352b91d80SBram Moolenaar Non-numeric keys are not used to initialize 12452b91d80SBram Moolenaar the list. See also |lua-eval| for conversion 12552b91d80SBram Moolenaar rules. Example: > 12652b91d80SBram Moolenaar :lua t = {math.pi, false, say = 'hi'} 12752b91d80SBram Moolenaar :echo luaeval('vim.list(t)') 1282f362bf7SBram Moolenaar :" [3.141593, v:false], 'say' is ignored 12952b91d80SBram Moolenaar< 13052b91d80SBram Moolenaar vim.dict([arg]) Returns an empty dictionary or, if "arg" is a 13152b91d80SBram Moolenaar Lua table, returns a dict d such that d[k] = 13252b91d80SBram Moolenaar arg[k] for all string keys k in "arg" (see 13352b91d80SBram Moolenaar |Dictionary|). Number keys are converted to 13452b91d80SBram Moolenaar strings. Keys that are not strings are not 13552b91d80SBram Moolenaar used to initialize the dictionary. See also 13652b91d80SBram Moolenaar |lua-eval| for conversion rules. Example: > 13752b91d80SBram Moolenaar :lua t = {math.pi, false, say = 'hi'} 13852b91d80SBram Moolenaar :echo luaeval('vim.dict(t)') 139fd35811cSBram Moolenaar :" {'1': 3.141593, '2': v:false, 140fd35811cSBram Moolenaar :" 'say': 'hi'} 14152b91d80SBram Moolenaar< 142b7828690SBram Moolenaar vim.blob([arg]) Returns an empty blob or, if "arg" is a Lua 143b7828690SBram Moolenaar string, returns a blob b such that b is 144b7828690SBram Moolenaar equivalent to "arg" as a byte string. 145b7828690SBram Moolenaar Examples: > 146b7828690SBram Moolenaar :lua s = "12ab\x00\x80\xfe\xff" 147b7828690SBram Moolenaar :echo luaeval('vim.blob(s)') 148b7828690SBram Moolenaar :" 0z31326162.0080FEFF 149b7828690SBram Moolenaar< 15052b91d80SBram Moolenaar vim.funcref({name}) Returns a Funcref to function {name} (see 151fd35811cSBram Moolenaar |Funcref|). It is equivalent to Vim's 152fd35811cSBram Moolenaar function(). 1530ba04296SBram Moolenaar 1542334b6d5SBram Moolenaar vim.buffer([arg]) If "arg" is a number, returns buffer with 1552334b6d5SBram Moolenaar number "arg" in the buffer list or, if "arg" 1562334b6d5SBram Moolenaar is a string, returns buffer whose full or short 1572334b6d5SBram Moolenaar name is "arg". In both cases, returns 'nil' 1582334b6d5SBram Moolenaar (nil value, not string) if the buffer is not 1592334b6d5SBram Moolenaar found. Otherwise, if "toboolean(arg)" is 1602334b6d5SBram Moolenaar 'true' returns the first buffer in the buffer 1612334b6d5SBram Moolenaar list or else the current buffer. 1620ba04296SBram Moolenaar 1632334b6d5SBram Moolenaar vim.window([arg]) If "arg" is a number, returns window with 1642334b6d5SBram Moolenaar number "arg" or 'nil' (nil value, not string) 1652334b6d5SBram Moolenaar if not found. Otherwise, if "toboolean(arg)" 1662334b6d5SBram Moolenaar is 'true' returns the first window or else the 1672334b6d5SBram Moolenaar current window. 1680ba04296SBram Moolenaar 1691dced572SBram Moolenaar vim.type({arg}) Returns the type of {arg}. It is equivalent to 1701dced572SBram Moolenaar Lua's "type" function, but returns "list", 17152b91d80SBram Moolenaar "dict", "funcref", "buffer", or "window" if 17252b91d80SBram Moolenaar {arg} is a list, dictionary, funcref, buffer, 17352b91d80SBram Moolenaar or window, respectively. Examples: > 1741dced572SBram Moolenaar :lua l = vim.list() 1751dced572SBram Moolenaar :lua print(type(l), vim.type(l)) 1762f362bf7SBram Moolenaar :" list 1771dced572SBram Moolenaar< 17811328bc7SYegappan Lakshmanan vim.command({cmds}) Executes one or more lines of Ex-mode commands 17911328bc7SYegappan Lakshmanan in {cmds}. 1800ba04296SBram Moolenaar Examples: > 1810ba04296SBram Moolenaar :lua vim.command"set tw=60" 1820ba04296SBram Moolenaar :lua vim.command"normal ddp" 18311328bc7SYegappan Lakshmanan lua << trim END 18411328bc7SYegappan Lakshmanan vim.command([[ 18511328bc7SYegappan Lakshmanan new Myfile.js 18611328bc7SYegappan Lakshmanan call search('start') 18711328bc7SYegappan Lakshmanan ]]) 18811328bc7SYegappan Lakshmanan END 1890ba04296SBram Moolenaar< 1902334b6d5SBram Moolenaar vim.eval({expr}) Evaluates expression {expr} (see |expression|), 1910ba04296SBram Moolenaar converts the result to Lua, and returns it. 1920ba04296SBram Moolenaar Vim strings and numbers are directly converted 1930ba04296SBram Moolenaar to Lua strings and numbers respectively. Vim 1940ba04296SBram Moolenaar lists and dictionaries are converted to Lua 1951dced572SBram Moolenaar userdata (see |lua-list| and |lua-dict|). 1960ba04296SBram Moolenaar Examples: > 1970ba04296SBram Moolenaar :lua tw = vim.eval"&tw" 1980ba04296SBram Moolenaar :lua print(vim.eval"{'a': 'one'}".a) 1990ba04296SBram Moolenaar< 2002334b6d5SBram Moolenaar vim.line() Returns the current line (without the trailing 2010ba04296SBram Moolenaar <EOL>), a Lua string. 2020ba04296SBram Moolenaar 2032334b6d5SBram Moolenaar vim.beep() Beeps. 2040ba04296SBram Moolenaar 2052334b6d5SBram Moolenaar vim.open({fname}) Opens a new buffer for file {fname} and 2060ba04296SBram Moolenaar returns it. Note that the buffer is not set as 2070ba04296SBram Moolenaar current. 2080ba04296SBram Moolenaar 209eb04f089SBram Moolenaar vim.call({name} [, {args}]) 210eb04f089SBram Moolenaar Proxy to call Vim function named {name} with 211eb04f089SBram Moolenaar arguments {args}. Example: > 212eb04f089SBram Moolenaar :lua print(vim.call('has', 'timers')) 213eb04f089SBram Moolenaar< 214eb04f089SBram Moolenaar vim.fn Proxy to call Vim functions. Proxy methods are 215eb04f089SBram Moolenaar created on demand. Example: > 216eb04f089SBram Moolenaar :lua print(vim.fn.has('timers')) 217eb04f089SBram Moolenaar< 218125ed274SBram Moolenaar vim.lua_version The Lua version Vim was compiled with, in the 219125ed274SBram Moolenaar form {major}.{minor}.{patch}, e.g. "5.1.4". 2200ba04296SBram Moolenaar 22111328bc7SYegappan Lakshmanan vim.version() Returns a Lua table with the Vim version. 22211328bc7SYegappan Lakshmanan The table will have the following keys: 22311328bc7SYegappan Lakshmanan major - major Vim version. 22411328bc7SYegappan Lakshmanan minor - minor Vim version. 22511328bc7SYegappan Lakshmanan patch - latest patch included. 22611328bc7SYegappan Lakshmanan 2279dc4bef8SYegappan Lakshmanan *lua-vim-variables* 2289dc4bef8SYegappan LakshmananThe Vim editor global dictionaries |g:| |w:| |b:| |t:| |v:| can be accessed 2299dc4bef8SYegappan Lakshmananfrom Lua conveniently and idiomatically by referencing the `vim.*` Lua tables 2309dc4bef8SYegappan Lakshmanandescribed below. In this way you can easily read and modify global Vim script 2319dc4bef8SYegappan Lakshmananvariables from Lua. 2329dc4bef8SYegappan Lakshmanan 2339dc4bef8SYegappan LakshmananExample: > 2349dc4bef8SYegappan Lakshmanan 2359dc4bef8SYegappan Lakshmanan vim.g.foo = 5 -- Set the g:foo Vim script variable. 2369dc4bef8SYegappan Lakshmanan print(vim.g.foo) -- Get and print the g:foo Vim script variable. 2379dc4bef8SYegappan Lakshmanan vim.g.foo = nil -- Delete (:unlet) the Vim script variable. 2389dc4bef8SYegappan Lakshmanan 2399dc4bef8SYegappan Lakshmananvim.g *vim.g* 2409dc4bef8SYegappan Lakshmanan Global (|g:|) editor variables. 2419dc4bef8SYegappan Lakshmanan Key with no value returns `nil`. 2429dc4bef8SYegappan Lakshmanan 2439dc4bef8SYegappan Lakshmananvim.b *vim.b* 2449dc4bef8SYegappan Lakshmanan Buffer-scoped (|b:|) variables for the current buffer. 2459dc4bef8SYegappan Lakshmanan Invalid or unset key returns `nil`. 2469dc4bef8SYegappan Lakshmanan 2479dc4bef8SYegappan Lakshmananvim.w *vim.w* 2489dc4bef8SYegappan Lakshmanan Window-scoped (|w:|) variables for the current window. 2499dc4bef8SYegappan Lakshmanan Invalid or unset key returns `nil`. 2509dc4bef8SYegappan Lakshmanan 2519dc4bef8SYegappan Lakshmananvim.t *vim.t* 2529dc4bef8SYegappan Lakshmanan Tabpage-scoped (|t:|) variables for the current tabpage. 2539dc4bef8SYegappan Lakshmanan Invalid or unset key returns `nil`. 2549dc4bef8SYegappan Lakshmanan 2559dc4bef8SYegappan Lakshmananvim.v *vim.v* 2569dc4bef8SYegappan Lakshmanan |v:| variables. 2579dc4bef8SYegappan Lakshmanan Invalid or unset key returns `nil`. 2589dc4bef8SYegappan Lakshmanan 2590ba04296SBram Moolenaar============================================================================== 2601dced572SBram Moolenaar3. List userdata *lua-list* 2611dced572SBram Moolenaar 2621dced572SBram MoolenaarList userdata represent vim lists, and the interface tries to follow closely 2631dced572SBram MoolenaarVim's syntax for lists. Since lists are objects, changes in list references in 2641dced572SBram MoolenaarLua are reflected in Vim and vice-versa. A list "l" has the following 2651dced572SBram Moolenaarproperties and methods: 2661dced572SBram Moolenaar 267bd84617dSBram MoolenaarNOTE: In patch 8.2.1066 array indexes were changed from zero-based to 268bd84617dSBram Moolenaarone-based. You can check with: > 269bd84617dSBram Moolenaar if has("patch-8.2.1066") 270bd84617dSBram Moolenaar 2711dced572SBram MoolenaarProperties 2721dced572SBram Moolenaar---------- 2731dced572SBram Moolenaar o "#l" is the number of items in list "l", equivalent to "len(l)" 2741dced572SBram Moolenaar in Vim. 275bd84617dSBram Moolenaar o "l[k]" returns the k-th item in "l"; "l" is one-indexed, as in Lua. 2761dced572SBram Moolenaar To modify the k-th item, simply do "l[k] = newitem"; in 277a1f9f866SBram Moolenaar particular, "l[k] = nil" removes the k-th item from "l". Item can 278a1f9f866SBram Moolenaar be added to the end of the list by "l[#l + 1] = newitem" 2791dced572SBram Moolenaar o "l()" returns an iterator for "l". 280a1f9f866SBram Moolenaar o "table.insert(l, newitem)" inserts an item at the end of the list. 281a1f9f866SBram Moolenaar (only Lua 5.3 and later) 282a1f9f866SBram Moolenaar o "table.insert(l, position, newitem)" inserts an item at the 283a1f9f866SBram Moolenaar specified position. "position" is one-indexed. (only Lua 5.3 and 284a1f9f866SBram Moolenaar later) 285a1f9f866SBram Moolenaar o "table.remove(l, position)" removes an item at the specified 286a1f9f866SBram Moolenaar position. "position" is one-indexed. 287a1f9f866SBram Moolenaar 2881dced572SBram Moolenaar 2891dced572SBram MoolenaarMethods 2901dced572SBram Moolenaar------- 2911dced572SBram Moolenaar o "l:add(item)" appends "item" to the end of "l". 2921dced572SBram Moolenaar o "l:insert(item[, pos])" inserts "item" at (optional) 2931dced572SBram Moolenaar position "pos" in the list. The default value for "pos" is 0. 2941dced572SBram Moolenaar 2951dced572SBram MoolenaarExamples: 2961dced572SBram Moolenaar> 2971dced572SBram Moolenaar :let l = [1, 'item'] 2981dced572SBram Moolenaar :lua l = vim.eval('l') -- same 'l' 2991dced572SBram Moolenaar :lua l:add(vim.list()) 300bd84617dSBram Moolenaar :lua l[1] = math.pi 3011dced572SBram Moolenaar :echo l[0] " 3.141593 302bd84617dSBram Moolenaar :lua l[1] = nil -- remove first item 3031dced572SBram Moolenaar :lua l:insert(true, 1) 304bd84617dSBram Moolenaar :lua print(l, #l, l[1], l[2]) 305a1f9f866SBram Moolenaar :lua l[#l + 1] = 'value' 306a1f9f866SBram Moolenaar :lua table.insert(l, 100) 307a1f9f866SBram Moolenaar :lua table.insert(l, 2, 200) 308a1f9f866SBram Moolenaar :lua table.remove(l, 1) 3091dced572SBram Moolenaar :lua for item in l() do print(item) end 3101dced572SBram Moolenaar 3111dced572SBram Moolenaar============================================================================== 3121dced572SBram Moolenaar4. Dict userdata *lua-dict* 3131dced572SBram Moolenaar 3141dced572SBram MoolenaarSimilarly to list userdata, dict userdata represent vim dictionaries; since 3151dced572SBram Moolenaardictionaries are also objects, references are kept between Lua and Vim. A dict 3161dced572SBram Moolenaar"d" has the following properties: 3171dced572SBram Moolenaar 3181dced572SBram MoolenaarProperties 3191dced572SBram Moolenaar---------- 3201dced572SBram Moolenaar o "#d" is the number of items in dict "d", equivalent to "len(d)" 3211dced572SBram Moolenaar in Vim. 3221dced572SBram Moolenaar o "d.key" or "d['key']" returns the value at entry "key" in "d". 3231dced572SBram Moolenaar To modify the entry at this key, simply do "d.key = newvalue"; in 3241dced572SBram Moolenaar particular, "d.key = nil" removes the entry from "d". 3251dced572SBram Moolenaar o "d()" returns an iterator for "d" and is equivalent to "items(d)" in 3261dced572SBram Moolenaar Vim. 3271dced572SBram Moolenaar 3281dced572SBram MoolenaarExamples: 3291dced572SBram Moolenaar> 3301dced572SBram Moolenaar :let d = {'n':10} 3311dced572SBram Moolenaar :lua d = vim.eval('d') -- same 'd' 3321dced572SBram Moolenaar :lua print(d, d.n, #d) 3331dced572SBram Moolenaar :let d.self = d 3341dced572SBram Moolenaar :lua for k, v in d() do print(d, k, v) end 3351dced572SBram Moolenaar :lua d.x = math.pi 3361dced572SBram Moolenaar :lua d.self = nil -- remove entry 3371dced572SBram Moolenaar :echo d 3381dced572SBram Moolenaar< 3391dced572SBram Moolenaar 3401dced572SBram Moolenaar============================================================================== 341b7828690SBram Moolenaar5. Blob userdata *lua-blob* 342b7828690SBram Moolenaar 343b7828690SBram MoolenaarBlob userdata represent vim blobs. A blob "b" has the following properties: 344b7828690SBram Moolenaar 345b7828690SBram MoolenaarProperties 346b7828690SBram Moolenaar---------- 347b7828690SBram Moolenaar o "#b" is the length of blob "b", equivalent to "len(b)" in Vim. 348b7828690SBram Moolenaar o "b[k]" returns the k-th item in "b"; "b" is zero-indexed, as in Vim. 349b7828690SBram Moolenaar To modify the k-th item, simply do "b[k] = number"; in particular, 350b7828690SBram Moolenaar "b[#b] = number" can append a byte to tail. 351b7828690SBram Moolenaar 352b7828690SBram MoolenaarMethods 353b7828690SBram Moolenaar------- 354b7828690SBram Moolenaar o "b:add(bytes)" appends "bytes" to the end of "b". 355b7828690SBram Moolenaar 356b7828690SBram MoolenaarExamples: 357b7828690SBram Moolenaar> 358b7828690SBram Moolenaar :let b = 0z001122 359b7828690SBram Moolenaar :lua b = vim.eval('b') -- same 'b' 360b7828690SBram Moolenaar :lua print(b, b[0], #b) 361b7828690SBram Moolenaar :lua b[1] = 32 362b7828690SBram Moolenaar :lua b[#b] = 0x33 -- append a byte to tail 363b7828690SBram Moolenaar :lua b:add("\x80\x81\xfe\xff") 364b7828690SBram Moolenaar :echo b 365b7828690SBram Moolenaar< 366b7828690SBram Moolenaar 367b7828690SBram Moolenaar============================================================================== 368b7828690SBram Moolenaar6. Funcref userdata *lua-funcref* 36952b91d80SBram Moolenaar 37052b91d80SBram MoolenaarFuncref userdata represent funcref variables in Vim. Funcrefs that were 37152b91d80SBram Moolenaardefined with a "dict" attribute need to be obtained as a dictionary key 37252b91d80SBram Moolenaarin order to have "self" properly assigned to the dictionary (see examples 37352b91d80SBram Moolenaarbelow.) A funcref "f" has the following properties: 37452b91d80SBram Moolenaar 37552b91d80SBram MoolenaarProperties 37652b91d80SBram Moolenaar---------- 37752b91d80SBram Moolenaar o "#f" is the name of the function referenced by "f" 37852b91d80SBram Moolenaar o "f(...)" calls the function referenced by "f" (with arguments) 37952b91d80SBram Moolenaar 38052b91d80SBram MoolenaarExamples: 38152b91d80SBram Moolenaar> 38252b91d80SBram Moolenaar :function I(x) 38352b91d80SBram Moolenaar : return a:x 38452b91d80SBram Moolenaar : endfunction 38552b91d80SBram Moolenaar :let R = function('I') 38652b91d80SBram Moolenaar :lua i1 = vim.funcref('I') 38752b91d80SBram Moolenaar :lua i2 = vim.eval('R') 38852b91d80SBram Moolenaar :lua print(#i1, #i2) -- both 'I' 38952b91d80SBram Moolenaar :lua print(i1, i2, #i2(i1) == #i1(i2)) 39052b91d80SBram Moolenaar :function Mylen() dict 39152b91d80SBram Moolenaar : return len(self.data) 39252b91d80SBram Moolenaar : endfunction 39352b91d80SBram Moolenaar :let mydict = {'data': [0, 1, 2, 3]} 39452b91d80SBram Moolenaar :lua d = vim.eval('mydict'); d.len = vim.funcref('Mylen') 39552b91d80SBram Moolenaar :echo mydict.len() 39652b91d80SBram Moolenaar :lua l = d.len -- assign d as 'self' 39752b91d80SBram Moolenaar :lua print(l()) 39852b91d80SBram Moolenaar< 399801ab069SBram MoolenaarLua functions and closures are automatically converted to a Vim |Funcref| and 400801ab069SBram Moolenaarcan be accessed in Vim scripts. Example: 401801ab069SBram Moolenaar> 402801ab069SBram Moolenaar lua <<EOF 403801ab069SBram Moolenaar vim.fn.timer_start(1000, function(timer) 404801ab069SBram Moolenaar print('timer callback') 405801ab069SBram Moolenaar end) 406801ab069SBram Moolenaar EOF 40752b91d80SBram Moolenaar 40852b91d80SBram Moolenaar============================================================================== 409b7828690SBram Moolenaar7. Buffer userdata *lua-buffer* 4100ba04296SBram Moolenaar 4112334b6d5SBram MoolenaarBuffer userdata represent vim buffers. A buffer userdata "b" has the following 4120ba04296SBram Moolenaarproperties and methods: 4130ba04296SBram Moolenaar 4140ba04296SBram MoolenaarProperties 4150ba04296SBram Moolenaar---------- 4162334b6d5SBram Moolenaar o "b()" sets "b" as the current buffer. 4172334b6d5SBram Moolenaar o "#b" is the number of lines in buffer "b". 4182334b6d5SBram Moolenaar o "b[k]" represents line number k: "b[k] = newline" replaces line k 4192334b6d5SBram Moolenaar with string "newline" and "b[k] = nil" deletes line k. 4202334b6d5SBram Moolenaar o "b.name" contains the short name of buffer "b" (read-only). 4212334b6d5SBram Moolenaar o "b.fname" contains the full name of buffer "b" (read-only). 4222334b6d5SBram Moolenaar o "b.number" contains the position of buffer "b" in the buffer list 4230ba04296SBram Moolenaar (read-only). 4240ba04296SBram Moolenaar 4250ba04296SBram MoolenaarMethods 4260ba04296SBram Moolenaar------- 4272334b6d5SBram Moolenaar o "b:insert(newline[, pos])" inserts string "newline" at (optional) 4282334b6d5SBram Moolenaar position "pos" in the buffer. The default value for "pos" is 4292334b6d5SBram Moolenaar "#b + 1". If "pos == 0" then "newline" becomes the first line in 4302334b6d5SBram Moolenaar the buffer. 4312334b6d5SBram Moolenaar o "b:next()" returns the buffer next to "b" in the buffer list. 4322334b6d5SBram Moolenaar o "b:previous()" returns the buffer previous to "b" in the buffer 4332334b6d5SBram Moolenaar list. 4342334b6d5SBram Moolenaar o "b:isvalid()" returns 'true' (boolean) if buffer "b" corresponds to 4352334b6d5SBram Moolenaar a "real" (not freed from memory) Vim buffer. 4360ba04296SBram Moolenaar 4370ba04296SBram MoolenaarExamples: 4380ba04296SBram Moolenaar> 4390ba04296SBram Moolenaar :lua b = vim.buffer() -- current buffer 4400ba04296SBram Moolenaar :lua print(b.name, b.number) 4410ba04296SBram Moolenaar :lua b[1] = "first line" 4420ba04296SBram Moolenaar :lua b:insert("FIRST!", 0) 4430ba04296SBram Moolenaar :lua b[1] = nil -- delete top line 4440ba04296SBram Moolenaar :lua for i=1,3 do b:insert(math.random()) end 4450ba04296SBram Moolenaar :3,4lua for i=vim.lastline,vim.firstline,-1 do b[i] = nil end 4460ba04296SBram Moolenaar :lua vim.open"myfile"() -- open buffer and set it as current 4470ba04296SBram Moolenaar 4480ba04296SBram Moolenaar function! ListBuffers() 4490ba04296SBram Moolenaar lua << EOF 4500ba04296SBram Moolenaar local b = vim.buffer(true) -- first buffer in list 4510ba04296SBram Moolenaar while b ~= nil do 4520ba04296SBram Moolenaar print(b.number, b.name, #b) 4530ba04296SBram Moolenaar b = b:next() 4540ba04296SBram Moolenaar end 4550ba04296SBram Moolenaar vim.beep() 4560ba04296SBram Moolenaar EOF 4570ba04296SBram Moolenaar endfunction 4580ba04296SBram Moolenaar< 4590ba04296SBram Moolenaar 4600ba04296SBram Moolenaar============================================================================== 461b7828690SBram Moolenaar8. Window userdata *lua-window* 4620ba04296SBram Moolenaar 4632334b6d5SBram MoolenaarWindow objects represent vim windows. A window userdata "w" has the following 4640ba04296SBram Moolenaarproperties and methods: 4650ba04296SBram Moolenaar 4660ba04296SBram MoolenaarProperties 4670ba04296SBram Moolenaar---------- 4682334b6d5SBram Moolenaar o "w()" sets "w" as the current window. 4692334b6d5SBram Moolenaar o "w.buffer" contains the buffer of window "w" (read-only). 4702334b6d5SBram Moolenaar o "w.line" represents the cursor line position in window "w". 4712334b6d5SBram Moolenaar o "w.col" represents the cursor column position in window "w". 4722334b6d5SBram Moolenaar o "w.width" represents the width of window "w". 4732334b6d5SBram Moolenaar o "w.height" represents the height of window "w". 4740ba04296SBram Moolenaar 4750ba04296SBram MoolenaarMethods 4760ba04296SBram Moolenaar------- 4772334b6d5SBram Moolenaar o "w:next()" returns the window next to "w". 4782334b6d5SBram Moolenaar o "w:previous()" returns the window previous to "w". 4792334b6d5SBram Moolenaar o "w:isvalid()" returns 'true' (boolean) if window "w" corresponds to 4802334b6d5SBram Moolenaar a "real" (not freed from memory) Vim window. 4810ba04296SBram Moolenaar 4820ba04296SBram MoolenaarExamples: 4830ba04296SBram Moolenaar> 4840ba04296SBram Moolenaar :lua w = vim.window() -- current window 4850ba04296SBram Moolenaar :lua print(w.buffer.name, w.line, w.col) 4860ba04296SBram Moolenaar :lua w.width = w.width + math.random(10) 4870ba04296SBram Moolenaar :lua w.height = 2 * math.random() * w.height 4880ba04296SBram Moolenaar :lua n,w = 0,vim.window(true) while w~=nil do n,w = n + 1,w:next() end 4890ba04296SBram Moolenaar :lua print("There are " .. n .. " windows") 4900ba04296SBram Moolenaar< 4910ba04296SBram Moolenaar 4920ba04296SBram Moolenaar============================================================================== 493b7828690SBram Moolenaar9. luaeval() Vim function *lua-luaeval* *lua-eval* 4941dced572SBram Moolenaar 4951dced572SBram MoolenaarThe (dual) equivalent of "vim.eval" for passing Lua values to Vim is 4961dced572SBram Moolenaar"luaeval". "luaeval" takes an expression string and an optional argument and 4971dced572SBram Moolenaarreturns the result of the expression. It is semantically equivalent in Lua to: 4981dced572SBram Moolenaar> 4991dced572SBram Moolenaar local chunkheader = "local _A = select(1, ...) return " 5001dced572SBram Moolenaar function luaeval (expstr, arg) 5011dced572SBram Moolenaar local chunk = assert(loadstring(chunkheader .. expstr, "luaeval")) 5021dced572SBram Moolenaar return chunk(arg) -- return typval 5031dced572SBram Moolenaar end 5041dced572SBram Moolenaar< 50552b91d80SBram MoolenaarNote that "_A" receives the argument to "luaeval". Lua numbers, strings, and 506b7828690SBram Moolenaarlist, dict, blob, and funcref userdata are converted to their Vim respective 507b7828690SBram Moolenaartypes, while Lua booleans are converted to numbers. An error is thrown if 508b7828690SBram Moolenaarconversion of any of the remaining Lua types, including userdata other than 509b7828690SBram Moolenaarlists, dicts, blobs, and funcrefs, is attempted. 51052b91d80SBram Moolenaar 51152b91d80SBram MoolenaarExamples: > 5121dced572SBram Moolenaar 5131dced572SBram Moolenaar :echo luaeval('math.pi') 5141dced572SBram Moolenaar :lua a = vim.list():add('newlist') 5151dced572SBram Moolenaar :let a = luaeval('a') 5161dced572SBram Moolenaar :echo a[0] " 'newlist' 5171dced572SBram Moolenaar :function Rand(x,y) " random uniform between x and y 5181dced572SBram Moolenaar : return luaeval('(_A.y-_A.x)*math.random()+_A.x', {'x':a:x,'y':a:y}) 5191dced572SBram Moolenaar : endfunction 5201dced572SBram Moolenaar :echo Rand(1,10) 5211dced572SBram Moolenaar 5221dced572SBram Moolenaar 5231dced572SBram Moolenaar============================================================================== 524b7828690SBram Moolenaar10. Dynamic loading *lua-dynamic* 525d94464eeSBram Moolenaar 526d94464eeSBram MoolenaarOn MS-Windows and Unix the Lua library can be loaded dynamically. The 527d94464eeSBram Moolenaar|:version| output then includes |+lua/dyn|. 528d94464eeSBram Moolenaar 529d94464eeSBram MoolenaarThis means that Vim will search for the Lua DLL or shared library file only 530d94464eeSBram Moolenaarwhen needed. When you don't use the Lua interface you don't need it, thus 531d94464eeSBram Moolenaaryou can use Vim without this file. 532d94464eeSBram Moolenaar 533d94464eeSBram Moolenaar 534e18c0b39SBram MoolenaarMS-Windows ~ 535e18c0b39SBram Moolenaar 536e18c0b39SBram MoolenaarTo use the Lua interface the Lua DLL must be in your search path. In a 537e18c0b39SBram Moolenaarconsole window type "path" to see what directories are used. The 'luadll' 538e18c0b39SBram Moolenaaroption can be also used to specify the Lua DLL. The version of the DLL must 539e18c0b39SBram Moolenaarmatch the Lua version Vim was compiled with. 540e18c0b39SBram Moolenaar 541e18c0b39SBram Moolenaar 542e18c0b39SBram MoolenaarUnix ~ 543e18c0b39SBram Moolenaar 544e18c0b39SBram MoolenaarThe 'luadll' option can be used to specify the Lua shared library file instead 545e18c0b39SBram Moolenaarof DYNAMIC_LUA_DLL file what was specified at compile time. The version of 546e18c0b39SBram Moolenaarthe shared library must match the Lua version Vim was compiled with. 547d94464eeSBram Moolenaar 548d94464eeSBram Moolenaar 549d94464eeSBram Moolenaar============================================================================== 5501dced572SBram Moolenaar vim:tw=78:ts=8:noet:ft=help:norl: 551