A high-performance Lua language server, linter, and documentation generator — built with Rust.
Quick Start · Features · Documentation · Development
# Via Cargo
cargo install emmylua_ls # Language server
cargo install emmylua_check # Static analyzer / linter
cargo install emmylua_doc_cli # Documentation generator
Or download pre-built binaries from the Releases page.
Before connecting your editor:
emmylua_ls and make sure it is available in PATH, or use an absolute binary path in your LSP client..emmyrc.json or .luarc.json.See the Configuration Guide for all supported options.
VS Code
Recommended setup:
.emmyrc.json at the project root if you need custom runtime, diagnostics, or library paths.This is the easiest way to get completion, diagnostics, hover, formatting, semantic tokens, and project indexing with minimal manual setup.
Neovim
Neovim 0.11+ example:
vim.lsp.config("emmylua_ls", {
cmd = { "emmylua_ls" },
filetypes = { "lua" },
root_markers = { ".emmyrc.json", ".luarc.json", ".git" },
})
vim.lsp.enable("emmylua_ls")
If you manage servers manually, replace cmd with the full path to your binary.
IntelliJ IDE
Install the EmmyLua2 Plugin from the JetBrains Marketplace.
For most projects, no extra setup is required beyond opening the workspace. Add .emmyrc.json if you need custom workspace roots, library paths, or stricter diagnostics.
Other editors
Any editor with LSP support can use emmylua_ls over stdio, which is the default and recommended mode.
Typical client command:
{
"command": "emmylua_ls",
"args": []
}
Use TCP only when you explicitly want a remote or debug-friendly setup:
emmylua_ls -c tcp --ip 127.0.0.1 --port 5007
Useful client root markers:
.emmyrc.json.luarc.json.emmyrc.lua.git| Version | Status |
|---|---|
| Lua 5.1 | ✅ Full support |
| Lua 5.2 | ✅ Full support |
| Lua 5.3 | ✅ Integer types, UTF-8 |
| Lua 5.4 | ✅ Attributes, generational GC |
| Lua 5.5 | ✅ New global syntax |
| LuaJIT | ✅ FFI, bit operations |
| Area | Capabilities |
|---|---|
| Navigation | Go to Definition, Go to Implementation, Find References, Call Hierarchy, Document Highlights |
| Symbols | Document Symbols, Workspace Symbols, Selection Range |
| Editing | Completion, Rename, Code Actions, Document Formatting, Range Formatting, On-type Formatting |
| Insight | Hover, Signature Help, Diagnostics, Semantic Tokens, Inlay Hints, Code Lens, Document Color |
| Structure | Folding Range, Document Links |
In practice, this gives you a full day-to-day Lua editing workflow: symbol navigation, annotation-aware type feedback, project-wide references, incremental diagnostics, and formatting support in editors that expose standard LSP features.
# Default stdio mode
emmylua_ls
# TCP mode for remote debugging
emmylua_ls -c tcp --port 5007 --log-level debug --log-path ./logs
| Parameter | Description |
|---|---|
-c, --communication |
stdio (default) or tcp |
--port |
TCP port (default: 5007) |
--log-level |
debug / info / warn / error |
--log-path |
Log output directory |
emmylua_check . # Analyze current directory
emmylua_check ./src --verbose --format json # Detailed JSON output
emmylua_doc_cli ./src --output ./docs
git clone https://github.com/EmmyLuaLs/emmylua-analyzer-rust.git
cd emmylua-analyzer-rust
cargo build --release # Build everything
cargo build --release -p emmylua_ls # Build only the language server
cargo test # Run all tests
cargo test -p emmylua_parser # Run parser tests only
We welcome contributions! See CONTRIBUTING.md for details.
Thanks to all contributors and the Lua community.
$ claude mcp add emmylua-analyzer-rust \
-- python -m otcore.mcp_server <graph>