Language server
The lua_ls language server is enabled:lua_ls configuration
Custom configuration is inafter/lsp/lua_ls.lua:
Diagnostics
vim- Neovim’s global API object
inject-field- Can be noisy for dynamic tablesundefined-field- Often false positives with metatablesmissing-fields- Annoying for partial table definitions
Runtime
Workspace
Telemetry
Enhanced Neovim development
The lazydev.nvim plugin provides enhanced Lua development:Features
Type definitions
Proper types for Neovim API, vim.uv (libuv), and plugins
Auto-completion
Intelligent completions for Neovim functions and modules
Documentation
Hover documentation from Neovim’s help system
Library support
Type support for common plugins like Snacks
Configured libraries
vim.uv (libuv):vim.uv - Neovim’s libuv bindings for async I/O.
Snacks.nvim:
Formatting
Lua files are formatted with stylua:stylua configuration
The configuration includes astylua.toml file in the root directory for consistent formatting. Format-on-save is enabled by default.
Manually format with <leader>fb.
No linter configured
Lua doesn’t have a linter configured by default. lua_ls provides sufficient diagnostics for most use cases. If you need additional linting, you can add luacheck:Common workflows
Exploring Neovim API
- Type
vim. - See autocomplete suggestions for all vim APIs
- Select a function
- Press
Kto see documentation
Checking vim.uv functions
- Type
vim.uv. - Autocomplete shows all libuv functions
- Hover over any function for documentation
Working with plugins
- Type plugin name (e.g.,
Snacks.) - See plugin API in autocomplete
- Get type checking for plugin functions
Fixing diagnostics
If you see false positive diagnostics:- Add to disabled diagnostics in
after/lsp/lua_ls.lua:5 - Or use
---@diagnostic disable-next-line: <diagnostic-name>in code
Keymaps
All standard LSP keymaps work:| Keymap | Action |
|---|---|
K | Hover documentation (shows :help) |
<C-k> | Signature help |
gd | Go to definition |
gr | Find references |
gi | Go to implementation |
ga | Code action |
<leader>rn | Rename symbol |
<leader>fb | Format with stylua |
]d / [d | Next/prev diagnostic |
Annotations
lua_ls supports LSP annotations for better type checking:Type annotations
Class definitions
Generic types
Disabling diagnostics
Installation summary
Troubleshooting
lua_ls not starting
- Check it’s installed:
lua-language-server --version - Run
:LspInfoCustomto see client status - Check logs:
:LspLog
Missing Neovim API completions
- Verify
vim.env.VIMRUNTIMEis set correctly - Check lazydev.nvim is loaded:
:Lazy - Restart LSP:
:LspRestart
False positive diagnostics
- Add diagnostic to disable list in
after/lsp/lua_ls.lua:5 - Use
---@diagnostic disable-next-line:comments - Consider if the diagnostic is actually valid
stylua not formatting
- Check it’s installed:
stylua --version - Run
:ConformInfoto see formatter status - Manually format:
<leader>fb - Check for
stylua.tomlin project root
Advanced configuration
Adding custom globals
If you have custom globals in your config:Adding workspace libraries
For plugin development:Configuring lazydev for more plugins
Next steps
TypeScript
TypeScript/JavaScript configuration
Go
Go language configuration
LSP setup
Detailed LSP configuration
Formatting
Learn more about formatters