xref: /vim-8.2.3635/runtime/doc/if_lua.txt (revision 965d2edb)
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