Miser is a minimalist tool manager for Neovim users who prefer mise over system-wide installs.
Miser ensures that project-required tools like formatters, linters and language servers are available in the project's environment.
If tools are missing, Miser automatically triggers their install process.
- Automatic tool and runtime installation for each project
- Seamless integration with mise
- Minimal setup: just list the tools you need
- Easily add support for new tools and runtimes / environments
- Works with any language server, formatter, linter or debugger
- Miser listens for
FileType
events - When you open a file, Miser checks if the necessary tools and runtimes are installed via mise
- If a runtime or tool is missing, Miser installs it
- Once installed, the tool and runtime is ready to use
Using lazy.nvim:
{
"carldaws/miser.nvim",
config = function()
require("miser").setup({
tools = { "gopls", "rubocop", "prettier", "black", "zls" }
})
end
}
Just pass a table of tools
to the setup function:
require("miser").setup({
tools = { "gopls", "rubocop", "prettier", "black", "zls" }
})
Tools are defined in lua/miser/tools/<tool-name>.lua
and consist of:
- Which filetype it applies to
- Which runtime(s) or environment(s) it requires (ruby, rust, go, zig, node, etc.)
- A command to verify the tool is installed
- A command to install the tool using mise
Here's what a typical Miser tool definition looks like:
return {
requires = { "ruby" },
filetypes = { "ruby" },
commands = {
install = "gem install rubocop",
verify = "mise which rubocop",
}
}
requires
- runtimes which must be available before installing the toolfiletypes
- Neovim filetypes this tool should be active forcommands.install
- A command used to install the tool if it's missingcommands.verify
- A command used to check if the tool is installed
If you have a tool you think others would benefit from, please submit a PR
Adding a new tool is simple:
- Create a new file
lua/miser/tools/<my-new-tool>.lua
- Define the required runtime(s), filetypes and commands
That's it!
- Adjust Miser syntax to make it a drop-in replacement for Mason
- Add the option to globally install tools when missing
- Enable auto-install (no prompting) by default
- Add tool type (LSP, linter, debugger etc.) to tool definitions to allow for smart post-install behaviour such as reattaching LSPs
- Allow multiple install commands to support different environments for the same tool (Bun vs Node, for example)