Nvim:help pages,generated fromsource using thetree-sitter-vimdoc parser.
vim.* not mentioned already; seelua-stdlib.nil); and Vim API functions can use 0-based indexing even if Luaarrays are 1-indexed by default.:lua print("Hello!"):lua local foo = 1:lua print(foo)" prints "nil" instead of "1":lua=, which is equivalent to:lua vim.print(...), toconveniently check the value of a variable or a table::lua =package:source ~/programs/baz/myluafile.lualua << EOF local tbl = {1, 2, 3} for k, v in ipairs(tbl) do print(v) endEOFinit.vim orinit.lua as the configuration file, butnot both at the same time. This should be placed in yourconfig directory(run:echo stdpath('config') to see where it is). Note that you can also useLua ininit.vim and Vimscript ininit.lua, which will be covered below.plugin/ in your'runtimepath'.lua/directory in your'runtimepath' and load them withrequire. (This is theLua equivalent of Vimscript'sautoload mechanism.)~/.config/nvim|-- after/|-- ftplugin/|-- lua/| |-- myluamodule.lua| |-- other_modules/| |-- anothermodule.lua| |-- init.lua|-- plugin/|-- syntax/|-- init.vim
myluamodule.lua:require("myluamodule").lua extension.other_modules/anothermodule.lua is done viarequire('other_modules/anothermodule')-- orrequire('other_modules.anothermodule'). is equivalent to thepath separator/ (even on Windows).require('other_modules') -- loads other_modules/init.luapcall() may be used to catch such errors. Thefollowing example tries to load themodule_with_error and only calls one ofits functions if this succeeds and prints an error message otherwise:local ok, mymod = pcall(require, 'module_with_error')if not ok then print("Module had an error")else mymod.func()endlua/ directoriesunder'runtimepath', it also caches the module on first use. Callingrequire() a second time will therefore _not_ execute the script again andinstead return the cached file. To rerun the file, you need to remove it fromthe cache manually first:package.loaded['myluamodule'] = nilrequire('myluamodule') -- read and execute the module again from diskvim.cmd("colorscheme habamax")vim.cmd("%s/\\Vfoo/bar/g")[[ ]] as invim.cmd([[%s/\Vfoo/bar/g]])vim.cmd([[ highlight Error guibg=red highlight link Warning Error]])init.lua.vim.cmd.colorscheme("habamax")vim.cmd.highlight({ "Error", "guibg=red" })vim.cmd.highlight({ "link", "Warning", "Error" })print(vim.fn.printf('Hello from %s', 'Lua'))local reversed_list = vim.fn.reverse({ 'a', 'b', 'c' })vim.print(reversed_list) -- { "c", "b", "a" }local function print_stdout(chan_id, data, name) print(data[1])endvim.fn.jobstart('ls', { on_stdout = print_stdout })#) are not valid characters for identifiers in Lua, so,e.g.,autoload functions have to be called with this syntax:vim.fn['my#autoload#function']()vim.g.some_global_variable = { key1 = "value", key2 = 300}vim.print(vim.g.some_global_variable)--> { key1 = "value", key2 = 300 }vim.b[2].myvar = 1 -- set myvar for buffer number 2vim.w[1005].myothervar = true -- set myothervar for window ID 1005vim.g['my#variable'] = 1vim.g.some_global_variable.key2 = 400vim.print(vim.g.some_global_variable)--> { key1 = "value", key2 = 300 }local temp_table = vim.g.some_global_variabletemp_table.key2 = 400vim.g.some_global_variable = temp_tablevim.print(vim.g.some_global_variable)--> { key1 = "value", key2 = 400 }nil:vim.g.myvar = nilinit.lua,is throughvim.opt and friends:set smarttabset nosmarttabvim.opt.smarttab = truevim.opt.smarttab = falseset wildignore=*.o,*.a,__pycache__set listchars=space:_,tab:>~set formatoptions=njtvim.opt.wildignore = { '*.o', '*.a', '__pycache__' }vim.opt.listchars = { space = '_', tab = '>~' }vim.opt.formatoptions = { n = true, j = true, t = true }vim.opt.shortmess:append({ I = true })vim.opt.wildignore:prepend('*.o')vim.opt.whichwrap:remove({ 'b', 's' })print(vim.opt.smarttab)--> {...} (big table)print(vim.opt.smarttab:get())--> falsevim.print(vim.opt.listchars:get())--> { space = '_', tab = '>~' }vim.oand friends, similarly to how you can get and set options via:echo &numberand:let &listchars='space:_,tab:>~':vim.o.smarttab = false -- :set nosmarttabprint(vim.o.smarttab)--> falsevim.o.listchars = 'space:_,tab:>~' -- :set listchars='space:_,tab:>~'print(vim.o.listchars)--> 'space:_,tab:>~'vim.o.isfname = vim.o.isfname .. ',@-@' -- :set isfname+=@-@print(vim.o.isfname)--> '@,48-57,/,.,-,_,+,,,#,$,%,~,=,@-@'vim.bo.shiftwidth = 4 -- :setlocal shiftwidth=4print(vim.bo.shiftwidth)--> 4vim.bo[4].expandtab = true -- sets expandtab to true in buffer 4vim.wo.number = true -- sets number to true in current windowvim.wo[0].number = true -- same as abovevim.wo[0][0].number = true -- sets number to true in current buffer -- in current window onlyprint(vim.wo[0].number) --> true{mode} is a string or a table of strings containing the mode prefix for which the mapping will take effect. The prefixes are the ones listed in:map-modes, or "!" for:map!, or empty string for:map.{lhs} is a string with the key sequences that should trigger the mapping.{rhs} is either a string with a Vim command or a Lua function that should be executed when the{lhs} is entered. An empty string is equivalent to<Nop>, which disables a key.-- Normal mode mapping for Vim commandvim.keymap.set('n', '<Leader>ex1', '<cmd>echo "Example 1"<cr>')-- Normal and Command-line mode mapping for Vim commandvim.keymap.set({'n', 'c'}, '<Leader>ex2', '<cmd>echo "Example 2"<cr>')-- Normal mode mapping for Lua functionvim.keymap.set('n', '<Leader>ex3', vim.treesitter.start)-- Normal mode mapping for Lua function with argumentsvim.keymap.set('n', '<Leader>ex4', function() print('Example 4') end)vim.keymap.set('n', '<Leader>pl1', require('plugin').action)function() end:vim.keymap.set('n', '<Leader>pl2', function() require('plugin').action() end)buffer: If given, only set the mapping for the buffer with the specified number;0 ortrue means the current buffer.-- set mapping for the current buffervim.keymap.set('n', '<Leader>pl1', require('plugin').action, { buffer = true })-- set mapping for the buffer number 4vim.keymap.set('n', '<Leader>pl1', require('plugin').action, { buffer = 4 })silent: If set totrue, suppress output such as error messages.vim.keymap.set('n', '<Leader>pl1', require('plugin').action, { silent = true })expr: If set totrue, do not execute the{rhs} but use the return value as input. Specialkeycodes are converted automatically. For example, the following mapping replaces<down> with<c-n> in the popupmenu only:vim.keymap.set('c', '<down>', function() if vim.fn.pumvisible() == 1 then return '<c-n>' end return '<down>'end, { expr = true })desc: A string that is shown when listing mappings with, e.g.,:map. This is useful since Lua functions as{rhs} are otherwise only listed asLua: <number> <source file>:<line>. Plugins should therefore always use this for mappings they create.vim.keymap.set('n', '<Leader>pl1', require('plugin').action, { desc = 'Execute action from plugin' })remap: By default, all mappings are nonrecursive (i.e.,vim.keymap.set() behaves like:noremap). If the{rhs} is itself a mapping that should be executed, setremap = true:vim.keymap.set('n', '<Leader>ex1', '<cmd>echo "Example 1"<cr>')-- add a shorter mappingvim.keymap.set('n', 'e', '<Leader>ex1', { remap = true })remap = false:vim.keymap.set('n', '[%', '<Plug>(MatchitNormalMultiBackward)')vim.keymap.del('n', '<Leader>ex1')vim.keymap.del({'n', 'c'}, '<Leader>ex2', {buffer = true})vim.api.nvim_get_keymap(): return all global mappingvim.api.nvim_buf_get_keymap(): return all mappings for buffervim.api.nvim_create_autocmd(), which takestwo mandatory arguments:{event}: a string or table of strings containing the event(s) which should trigger the command or function.{opts}: a table with keys that control what should happen when the event(s) are triggered.pattern: A string or table of strings containing theautocmd-pattern. Note: Environment variable like$HOME and~ are not automatically expanded; you need to explicitly usevim.fn.expand() for this.command: A string containing a Vim command.callback: A Lua function.command andcallback. Ifpattern isomitted, it defaults topattern = '*'.Examples:vim.api.nvim_create_autocmd({"BufEnter", "BufWinEnter"}, { pattern = {"*.c", "*.h"}, command = "echo 'Entering a C or C++ file'",})-- Same autocommand written with a Lua function insteadvim.api.nvim_create_autocmd({"BufEnter", "BufWinEnter"}, { pattern = {"*.c", "*.h"}, callback = function() print("Entering a C or C++ file") end,})-- User event triggered by MyPluginvim.api.nvim_create_autocmd("User", { pattern = "MyPlugin", callback = function() print("My Plugin Works!") end,})buf: the number of the buffer the event was triggered in (see<abuf>)file: the file name of the buffer the event was triggered in (see<afile>)data: a table with other relevant data that is passed for some eventsvim.api.nvim_create_autocmd("FileType", { pattern = "lua", callback = function(args) vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = args.buf }) end})function() end to avoid an error:vim.api.nvim_create_autocmd('TextYankPost', { callback = function() vim.hl.on_yank() end})function(args) ... end.)buffer; in this case,pattern cannot be used:-- set autocommand for current buffervim.api.nvim_create_autocmd("CursorHold", { buffer = 0, callback = function() print("hold") end,})-- set autocommand for buffer number 33vim.api.nvim_create_autocmd("CursorHold", { buffer = 33, callback = function() print("hold") end,})desc:vim.api.nvim_create_autocmd('TextYankPost', { callback = function() vim.hl.on_yank() end, desc = "Briefly highlight yanked text"})group key; this will becovered in detail in the next section.vim.api.nvim_create_augroup(). This functiontakes two mandatory arguments: a string with the name of a group and a tabledetermining whether the group should be cleared (i.e., all groupedautocommands removed) if it already exists. The function returns a number thatis the internal identifier of the group. Groups can be specified either bythis identifier or by the name (but only if the group has been created first).augroup vimrc " Remove all vimrc autocommands autocmd! au BufNewFile,BufRead *.html set shiftwidth=4 au BufNewFile,BufRead *.html set expandtabaugroup ENDlocal mygroup = vim.api.nvim_create_augroup('vimrc', { clear = true })vim.api.nvim_create_autocmd({ 'BufNewFile', 'BufRead' }, { pattern = '*.html', group = mygroup, command = 'set shiftwidth=4',})vim.api.nvim_create_autocmd({ 'BufNewFile', 'BufRead' }, { pattern = '*.html', group = 'vimrc', -- equivalent to group=mygroup command = 'set expandtab',})local mygroup = vim.api.nvim_create_augroup('vimrc', { clear = false })vim.api.nvim_create_autocmd({ 'BufNewFile', 'BufRead' }, { pattern = '*.c', group = mygroup, command = 'set noexpandtab',})vim.api.nvim_clear_autocmds() to remove autocommands. Thisfunction takes a single mandatory argument that is a table of keys describingthe autocommands that are to be removed:-- Delete all BufEnter and InsertLeave autocommandsvim.api.nvim_clear_autocmds({event = {"BufEnter", "InsertLeave"}})-- Delete all autocommands that uses "*.py" patternvim.api.nvim_clear_autocmds({pattern = "*.py"})-- Delete all autocommands in group "scala"vim.api.nvim_clear_autocmds({group = "scala"})-- Delete all ColorScheme autocommands in current buffervim.api.nvim_clear_autocmds({event = "ColorScheme", buffer = 0 })group key isspecified, even if another option matches it.desc (a string describing the command);force (set tofalse to avoid replacing an already existing command with the same name), andpreview (a Lua function that is used for:command-preview).vim.api.nvim_create_user_command('Test', 'echo "It works!"', {})vim.cmd.Test()--> It works!name: a string with the command namefargs: a table containing the command arguments split by whitespace (see<f-args>)line1: the starting line number of the command range (see<line1>)line2: the final line number of the command range (see<line2>)range: the number of items in the command range: 0, 1, or 2 (see<range>)count: any count supplied (see<count>)smods: a table containing the command modifiers (see<mods>)vim.api.nvim_create_user_command('Upper', function(opts) print(string.upper(opts.fargs[1])) end, { nargs = 1 })vim.cmd.Upper('foo')--> FOOcomplete attribute can take a Lua function in addition to theattributes listed in:command-complete.vim.api.nvim_create_user_command('Upper', function(opts) print(string.upper(opts.fargs[1])) end, { nargs = 1, complete = function(ArgLead, CmdLine, CursorPos) -- return completion candidates as a list-like table return { "foo", "bar", "baz" } end,})vim.api.nvim_buf_create_user_command().Here the first argument is the buffer number (0 being the current buffer);the remaining arguments are the same as fornvim_create_user_command():vim.api.nvim_buf_create_user_command(0, 'Upper', function(opts) print(string.upper(opts.fargs[1])) end, { nargs = 1 })vim.api.nvim_del_user_command(). The onlyargument is the name of the command:vim.api.nvim_del_user_command('Upper')vim.api.nvim_buf_del_user_command().Here the first argument is the buffer number (0 being the current buffer),and second is command name:vim.api.nvim_buf_del_user_command(4, 'Upper')