@seokgukim/mlua-language-server
v1.0.1
Published
Standalone LSP server for the mLua language (MapleStory Worlds scripting). Wraps the msw.mlua VS Code extension and exposes a standard stdio JSON-RPC interface compatible with any LSP client.
Maintainers
Readme
mlua-language-server
Standalone LSP server for the mLua language (MapleStory Worlds scripting).
Wraps the msw.mlua VS Code extension and exposes a standard stdio JSON-RPC interface compatible with any LSP client (Neovim, Zed, Helix, etc.).
Requirements
- Node.js >= 16
Installation
npm install -g mlua-language-serverOr clone and use directly:
git clone https://github.com/...
cd mlua-language-server
node mlua-server.js --stdioUsage
mlua-language-server --stdioThe extension (msw.mlua) is downloaded automatically from the VS Code Marketplace on first run. Subsequent runs use the cached copy.
To pin a specific install directory:
MLUA_INSTALL_DIR=/path/to/msw.mlua-1.1.5 mlua-language-server --stdioEditor Setup
Neovim
Use mlua.nvim which bundles this wrapper and handles setup automatically.
For manual setup with nvim-lspconfig:
vim.lsp.config('mlua', {
cmd = { 'mlua-language-server', '--stdio' },
filetypes = { 'mlua' },
root_dir = function(bufnr, on_dir)
-- point to your project root
on_dir(vim.fn.getcwd())
end,
})
vim.lsp.enable('mlua')Zed
Add to settings.json:
{
"lsp": {
"mlua": {
"binary": {
"path": "mlua-language-server",
"args": ["--stdio"]
}
}
}
}Helix
Add to languages.toml:
[[language]]
name = "mlua"
language-servers = ["mlua-language-server"]
[language-server.mlua-language-server]
command = "mlua-language-server"
args = ["--stdio"]Project Root Detection
The server indexes the entire project on startup. The project root is determined from the rootUri sent by the editor, with the following logic:
- If the given directory (or any ancestor) contains both a
RootDesk/and anEnvironment/sibling, that ancestor is used as the project root. - Otherwise the directory sent by the editor is used as-is.
This ensures Environment/NativeScripts/ (type definitions) is always included in the workspace index regardless of which subdirectory the editor reports as the root.
How It Works
Editor ──stdio──▶ mlua-server.js ──▶ proxy.js ──stdio──▶ languageServer.js
(entry) (LSP bridge) (msw.mlua engine)proxy.js intercepts the LSP initialize request, resolves the project root, indexes all .mlua and entry files (.map, .ui, .model, .collisiongroupset), and injects the result into initializationOptions before forwarding to the language server engine.
File watching is set up for the resolved project root so entry file changes (.ent) are forwarded to the server in real time.
Environment Variables
| Variable | Description |
|---|---|
| MLUA_INSTALL_DIR | Absolute path to the msw.mlua-<version>/ directory. Skips auto-discovery. |
