Nvim-Utils

nvim-utils is a collection of utility functions and modules for managing Neovim configurations / plugins in Nix. It aims to simplify the creation of reproducible, reusable, and extensible configurations.

nvim-utils is module-based. Just like with NixOS modules, users may create their own modules or use one of several prebuilt ones to build up their configs, depending on their needs.

The plugin backend used in nvim-utils is the wonderful lazy.nvim. For one, this plugin manager is extremely performant and allows for trivial implementation of lazy-loading, resulting in snappy configs. Furthermore, the structure of lazy.nvim's plugin specs lends itself quite nicely to the module structure found within nvim-utils.

Under the hood, each module corresponding to a plugin or component of a user's config is simply transpiled to Lua and inserted into a final init.lua file, as one may already be familiar with. In fact, you may also use nvim-utils to simply generate a valid init.lua and use it as-is!

To get started, view the next page to get your first configuration going.

Getting Started

To create a basic config without any tweaks, we can simply call mkNvimPkg without any additional arguments.

# default.nix
{pkgs ? import <nixpkgs> {}}: let
  nvim-utils = import (builtins.fetchGit {
    url = "https://github.com/toalaah/nvim-utils";
  });
in
  nvim-utils.lib.mkNvimPkg {
    inherit pkgs;
  }

Using Modules

Let's try to set the colorscheme by using the builtin colorschemes module. Make sure to include the corresponding module, otherwise you will get definition errors!

# default.nix
nvim-utils.lib.mkNvimPkg {
  inherit pkgs;
  modules = with nvim-utils.lib.baseModules; [colorschemes.tokyonight];
  configuration = {
    colorschemes.tokyonight.enable = true;
  };
}

Refer to the builtin modules for all available modules along with their options.

Writing Custom Modules

Say we want to use a colorscheme which is not a builtin module. No problem, let's write our own. The process is very similar to writing a NixOS module, as under the hood the same process is used to merge and apply each module.

Let's create a file myCoolColorscheme.nix and use mkSimplePlugin to reduce the amount of boilerplate needed.

# myCoolColorscheme.nix
{ config, pkgs, mkSimplePlugin, ... }: mkSimplePlugin {
  inherit config;
  # The category correspondes to the module path. So we will be able to
  # activate this module by specifying `colorschemes.myCoolColorscheme`
  category = "colorschemes/myCoolColorscheme";
  plugin = pkgs.fetchFromGitHub {
    owner = "user";
    repo = "myCoolColorscheme";
    rev = "v1.0.0";
  };
}

Then in default.nix, simply add the module file and enable the configuration.

# default.nix
nvim-utils.lib.mkNvimPkg {
  inherit pkgs;
  modules = [ ./myCoolColorscheme.nix ];
  configuration = {
    colorschemes.myCoolColorscheme.enable = true;
    # Opts are converted to lua and passed to `myCoolColorscheme.setup()` by lazy.nvim.
    colorschemes.myCoolColorscheme.opts = {
        style = "foo";
        highlights = [ "bar" "baz" ];
    }
  };
}

Autocmds, Keymaps, etc.

Besides plugins, there are a number of other components which you can configure, for instance:

  • Autocommands
  • Keymaps
  • Pre- and post-hooks

Refer to the core module for more information.

Note: The core and lazy modules are implicitly included and do not need to be specified in the modules argument of mkNvimPkg.

Flake Usage

In addition to standard Nix expressions, nvim-utils fully supports flake usage. See the example below.

# flake.nix
{
  inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";

  inputs.nvim-utils.url = "github:/toalaah/nvim-utils";
  inputs.nvim-utils.inputs.nixpkgs.follows = "nixpkgs";

  outputs = {
    self,
    nixpkgs,
    nvim-utils,
  }: let
    system = "x86_64-linux";
  in {
    packages.${system}.default = with nvim-utils.lib;
      mkNvimPkg {
        pkgs = import nixpkgs {inherit system;};
        modules = [baseModules.all];
        configuration = import ./configuration.nix;
      };

    apps.${system}.default = let
      pkg = self.packages.${system}.default;
    in {
      type = "app";
      program = "${pkg}/bin/nvim";
    };
  };
}

NixOS / Home Manager Modules

nvim-utils can also directly be used as a NixOS or Home Manager module.

You can import the NixOS module by adding nvim-utils.nixosModules.nvim to your configuration imports.

# configuration.nix
{
  imports = [nvim-utils.nixosModules.nvim]
  # ...
  programs.nvim = {
    enable = true;
    configuraiton = {};
    modules = [];
  };
}

Similarly, you can import the Home Manager module to specify your configuration in a homeManagerConfiguration. Again, you must add the module to Home Manager's extraSpecialArgs when using flakes.

# flake.nix
# ...
outputs = {...}: {
}
# home.nix
{
  imports = [nvim-utils.homeManagerModules.nvim];
  programs.nvim = {
    enable = true;
    configuraiton = {};
    modules = [];
  };
}

lib.lua

lib.lua.rawLua

Type: rawLua :: String -> (a -> String)

Embed raw lua code in a nix expression.

code The lua expression to embed

lib.lua.rawLua usage example

x = rawLua "function(msg) print('hello ' .. msg) end"

toLua x
=> _: "function(msg) print('hello ' .. msg) end"

lib.lua.luaFile

Type: luaFile :: String -> (a -> String)

Embed raw lua code from a file into a nix expression.

The contents of file is embedded as-is into the assigned variable.

file Function argument

lib.lua.luaFile usage example

builtins.readFile ./test.lua
=> "function(msg) print('hello ' .. msg) end"

x = luaFile ./test.lua
=> _: "function(msg) print('hello ' .. msg) end"

lib.lua.processPrimitive

Type: processPrimitive :: value -> String

Converts a primitive value to its stringified lua counterpart.

Types nil, boolean, number, string, and table are convertable from their respective nix-equivalents. Functions are supported in limited a fashion; a passed function must be callable with exactly one argument (which should be ignored in the implementation). The function must return raw lua code (stringified). The following lambda is an example of such a valid function:

foo = _: "function(msg) print('hello ' .. msg) end"

The remaining types userdata and thread are not able to be converted to.

value Value to convert to stringified lua representation

lib.lua.processPrimitive usage example

x = { a = "foo"; b = null }
processPrimitive x.a
=> "\"foo\""
processPrimitive x.b
=> "nil"

lib.lua.toLua

Type: toLua :: values -> String

Converts an attribute set, list, or primitive into its stringified lua representation.

Note on converting attribute sets: Since lua supports both named and unnamed table values (but nix attrsets do not), a magic identifier __index__ is used to convert from named values to anonymous ones. This identified may occur anywhere inside the name. Note that since attrsets are implicitly sorted by key names, you will need to lexicographically sort the keys which you want to anonymize by hand, ex: zzz__index__.

values values to convert to lua

lib.lua.toLua usage example

x = { a = { b = 3; }; __index__baz = "some string"; c = "foo"; d = null; }
y = "some string"

toLua x
=> ''
 { "some string", a = { b = 3 }, c = "foo", d = nil }
''

toLua y
=> "\"some string\""

lib.vim

lib.vim.processVimPrefs

processes each vim namespace (for example vim.g or vim.o) into stringified lua code

ns Function argument

values Function argument

lib.vim.mkKeymap

Creates a lua keymap. Note that opts may be omitted when using this function. Although this results in a curried function, the internal keymap module takes care of this by automatically adding an empty option set at eval-time (see modules/core/keymap.nix).

mode Function argument

lhs Function argument

rhs Function argument

opts Function argument

lib.vim.mkSimplePlugin

Type: mkSimplePlugin :: Attrs -> Attrs

Convenience wrapper for creating plugin modules. Note that this function simply returns a standard module, and as such is equivalent to you doing so.

structured function argument

: config

: The top-level config you have access to in your module.

plugin

: The plugin source (for instance a source produced by pkgs.fetchFromGitHub).

category

: The path to expose your module options under. Each element correspons to a level of nesting in the config. For instace, category = ["foo" "bar"] would expose the options: foo.bar = {...}. You may also pass a string where each nested level is separated by a /. For instance, "foo/bar" is equivalent to the example above.

derivePluginNameFunc

: A function to derive the plugin name from the plugin source. The default implementation uses the repo attribute from plugin (assumes structure similar to a source produced by fetchFromGitHub). The input to this function is plugin. The output must be a string.

moduleName

: The name of the plugin to use in the module options. By default, the implmentation uses the result of derivePluginNameFunc to derive the option namespace from the plugin source.

extraPluginConfig

: Extra options to pass to the lazy plugin spec. The function receives the plugin config at evaluation time as its only input. The output must be an attribute set, which is merged with the final spec. Any options which are accepted by layz's plugin spec should be valid.

noSetup

: Omit the opt options from the final module as well as the plugin spec. You may want to use this if the plugin which you specify does not support a conventional setup() function, for example a vimscript plugin which simply gets loaded.

extraModuleOpts

: Any extra module options to generate for this module. Standard option-conventions apply.

extraConfig

: Extra config to generate for this module if it is enabled. This is merged with the final config. You may, for example, use this to set additional pre/post-hooks or set keymaps, etc.

lib.vim.mkSimplePlugin usage example

myPluginSrc = pkgs.fetchFromGitHub {
  owner = "aUser";
  repo = "aRepo";
  # ...
}

# From inside a module, call mkSimplePlugin:

# myModule.nix
{pkgs, config, lib, ...}: lib.mkSimplePlugin {
  inherit config;
  plugin = myPluginSrc;
  category = [ "colorschemes" "myColorscheme"]
}

Modules

There are a number of pre-built modules offered by nvim-utils. Most of these are completely optional, although some are hard-coded to be included due to their primitive nature.

The following modules are builtin to mkNvimPkg. They cannot be omitted or overwritten.

All other modules are completely optional and need to be manually included as dependencies in mkNvimPkg. For instance, to add the optional treesitter module, you would add baseModules.treesitter to your list of modules.

nvim-utils.lib.mkNvimPkg {
  inherit pkgs;
  modules = with nvim-utils.lib.baseModules; [
    treesitter
    # other modules, for instance your own...
  ];
  # ...
}

plugins

Combined plugin spec passed to lazy.nvim startup function. You should pass your plugin specs generated in modules to this configuration value (see usage examples).

Type: list of (attribute set)

Default: [ ]

Declared by:

rtp

A list of paths to add to the runtimepath. The paths must be placed inside a parent folder named in accordance to where they should be in the runtimepath.

For instance, if you wish to have a lua module module.lua to be available in the rtp, you must place it inside a folder named lua, then add this folder to opt.rtp.

See :h rtp for more information.

Type: list of path

Default: [ ]

Declared by:

preHooks

Lua statements to be executed before lazy startup, newline separated.

Type: strings concatenated with “\n”

Default: ""

Example:

''
  print('hello world')
''

Declared by:

postHooks

Lua statements to be executed after lazy startup, newline separated.

Type: strings concatenated with “\n”

Default: ""

Example:

''
  print('hello world')
''

Declared by:

extraPackages

Extra packages to be included in the wrapped program’s $PATH.

Type: list of package

Default: [ ]

Example:

[ pkgs.hello ]

Declared by:

autocmds

List of autocmds to set. Refer to vim.api.nvim_create_autocmd for usage and option documentation.

Type: list of (submodule)

Default: [ ]

Declared by:

autocmds.*.callback

lua / vimscript function to execute on trigger. Mutually exclusive with command.

Type: null or (function that evaluates to a(n) string) or string

Default: null

Declared by:

autocmds.*.command

The (vim) command to run on trigger. Mutually exclusive with callback

Type: null or string

Default: null

Declared by:

autocmds.*.description

Description of the autocommand.

Type: null or string

Default: null

Declared by:

autocmds.*.event

Event(s) to trigger the autocommand on.

Type: (list of ((function that evaluates to a(n) string) or string)) or (function that evaluates to a(n) string) or string

Default: [ ]

Declared by:

autocmds.*.group

Group of the autocommand.

Type: null or (function that evaluates to a(n) string) or string

Default: null

Declared by:

autocmds.*.nested

Run any further nested autocommands.

Type: boolean

Default: false

Declared by:

autocmds.*.once

Run the autocommand only once.

Type: boolean

Default: false

Declared by:

autocmds.*.pattern

Pattern(s) to match against.

Type: (list of ((function that evaluates to a(n) string) or string)) or (function that evaluates to a(n) string) or string

Default: [ ]

Declared by:

keymaps

List of keymaps to set. Refer to nvim’s documentation on vim.keymap.set for usage and option documentation. Also see lib.vim.mkKeymap.

Type: list of ((function that evaluates to a(n) (attribute set)) or (submodule))

Default: [ ]

Example:

[
  # syntactic sugar for setting a (non recursive) normal-mode keymap.
  (vim.nnoremap "<leader>p" (rawLua "function() print('hello world') end"))
  # note that you can also (but do not have to) pass additional keymap options
  (vim.nnoremap 'j'  "v:count == 0 ? 'gj' : 'j'"  "Move down"  { expr = true; silent = true; })
  # you can also just use raw attrsets if you prefer
  {
    mode = "n";
    lhs = "<leader>r";
    rhs = rawLua "function() print('hello world 2') end";
    opts = {desc = "print another cool message";};
  }
]

Declared by:

lazy.opts

Options passed to lazy.nvim startup function.

Consult the project’s readme for all currently available options.

Note that some options, notably root are hard-coded inside the derivation and are not overridable.

Type: attribute set of unspecified value

Default: { }

Example:

{
  dev.path = "~/dev";
  defaults = {
    lazy = true;
  };
};

Declared by:

lazy.src

Source to use for this plugin. This allows you to swap out the pinned version with a newer revision/fork or add patches by creating a wrapper derivation.

Type: package

Default: <derivation source>

Declared by:

vim.g

Values to set under the vim.g namespace.

Run :help vim.o for from inside the nvim process more information.

Type: attribute set

Default: { }

Declared by:

vim.opt

Values to set under the vim.opt namespace.

Run :help vim.o for from inside the nvim process more information.

Type: attribute set

Default: { }

Declared by:

Adding Telescope Extensions

Since everyone has different needs in their workflow, we have opted not to pre-configure any telescope extensions. You can, however, quite easily add your own in only a couple lines of code.

Let's use the very popular telescope-fzf-native.nvim extension as an example. From your configuration, simple declare the extension source. Registration with telescope will be handled automatically.

{ pkgs, ... }: {
  telescope.extensions.fzf-native = {
    # you can optionally specify `module` to override the lua module which is #
    # called during `telescope.load_extension(<module>)`. By default, the name of
    # the attribute set is used (in this case `fzf-native`, but since we
    # specified a module name `fzf` will be used instead)
    module = "fzf";
    src =
      pkgs.vimPlugins.telescope-fzf-native-nvim
      // {
        owner = "nvim-telescope";
        repo = "fzf-native.nvim";
      };
  };
}

You can, of course, use any source type for src, so fetchers such as pkgs.fetchFromGithub will work as well.

{pkgs, ... }: {
  telescope.extensions.terraform_doc = {
    enable = true;
    src = pkgs.fetchFromGitHub {
      owner = "ANGkeith";
      repo = "telescope-terraform-doc.nvim";
      rev = "4b539fc9a9b647dddebe6b0ccc3eac2a23e3ddcf";
      hash = "sha256-8ry5Og/JLk0n3Ayx1YWUsQSJnA+FBXjilb3f1tKaE/4=";
    };
  };
  # these options are passed to `extensions` in `telescope.setup()`
  opts = {
    wrap = "wrap";
  };
}

Options

telescope.enable

Whether to enable telescope.

Type: boolean

Default: false

Example: true

Declared by:

telescope.extensions

The set of telescope extensions to make available.

Type: attribute set of (submodule)

Default: { }

Declared by:

telescope.extensions.<name>.module

The name of the lua module to load for this extension. If not set, the attribute’s name is used.

Type: null or string

Default: null

Declared by:

telescope.extensions.<name>.opts

Options to use for this extension. These are passed into telescope’s extension opts during setup.

Type: attribute set

Default: { }

Declared by:

telescope.extensions.<name>.src

Source to use for this plugin. This allows you to swap out the pinned version with a newer revision/fork or add patches by creating a wrapper derivation.

Type: package

Declared by:

telescope.keys

A list of keybindings to set up for telescope. follows standard lazy keymap spec.

Type: list of (attribute set)

Default: [ ]

Declared by:

telescope.opts

Options to pass to telescope.

Type: attribute set

Default: { }

Declared by:

telescope.src

Source to use for this plugin. This allows you to swap out the pinned version with a newer revision/fork or add patches by creating a wrapper derivation.

Type: package

Default: <derivation source>

Declared by:

Adding Treesitter Extensions

Since everyone has different needs in their workflow, we have opted not to pre-configure any treesitter extensions. You can, however, quite easily add your own in only a couple lines of code.

Let's use the very popular treesitter playground extension as an example. All you have to to is declare the extension source from your configuration. Registration with treesitter will be handled automatically.

{ pkgs, ... }: {
  treesitter.extensions.treesitter-playground = {
    # you can optionally specify `module` to override the name of the table
    # entry which is passed to `telescope.opts`. By default, the name of
    # the attribute set is used (in this case `treesitter-playground`), but
    # since we specified the `module` parameter explicitly, `playground` will be used
    # instead.
    module = "playground"
    src = pkgs.fetchFromGitHub {
      owner = "nvim-treesitter";
      repo = "playground";
      rev = "2b81a018a49f8e476341dfcb228b7b808baba68b";
      hash = "sha256-2wSTVSkuEvTAq3tB5yLw13WWpp1lAycCL4U1BKMm8Kw=";
    };
    # these values are passed under `opts.playground` in `treesitter.setup()`
    opts.enable = true;
  };
}

Options

treesitter.enable

Whether to enable treesitter.

Type: boolean

Default: false

Example: true

Declared by:

treesitter.extensions

The set of treesitter extensions to make available.

Type: attribute set of (submodule)

Default: { }

Declared by:

treesitter.extensions.<name>.module

The name of the lua module to load for this extension. If not set, the attribute’s name is used.

Type: null or string

Default: null

Declared by:

treesitter.extensions.<name>.opts

Options to use for this extension. These are passed into treesitter’s extension opts during setup.

Type: attribute set

Default: { }

Declared by:

treesitter.extensions.<name>.src

Source to use for this plugin. This allows you to swap out the pinned version with a newer revision/fork or add patches by creating a wrapper derivation.

Type: package

Declared by:

treesitter.keys

A list of keybindings to set up for treesitter. follows standard lazy keymap spec.

Type: list of (attribute set)

Default: [ ]

Declared by:

treesitter.opts

Options to pass to treesitter.

Type: attribute set

Default: { }

Declared by:

treesitter.parsers

list of language parsers to install

Type: list of string

Default: [ ]

Example:

[ "c" "lua" ]

Declared by:

treesitter.src

Source to use for this plugin. This allows you to swap out the pinned version with a newer revision/fork or add patches by creating a wrapper derivation.

Type: package

Default: <derivation source>

Declared by:

lsp.completion.enable

Whether to enable completion support. Uses nvim-cmp under the hood.

Type: boolean

Default: false

Example: true

Declared by:

lsp.completion.opts

Additional options to pass to cmp.setup(). Note that for simple setups (ex: keybindings and sources), you do not need to pass anything to this option and should instead use the keys and sources options respectively (in fact, default keymaps are already set, although they may be overwritten using this option).

The nvim-cmp module is made available in this scope under the variable name cmp.

Type: attribute set

Default: { }

Example:

window = {
  completion = rawLua "cmp.config.window.bordered()";
  documentation = rawLua "cmp.config.window.bordered()";
};

Declared by:

lsp.completion.sources

Extra cmp sources to make available during cmp.setup().

Type: attribute set of (submodule)

Default: { }

Declared by:

lsp.completion.sources.<name>.name

The name of the completion source module. If not set, the attribute’s name is used.

Type: null or string

Default: null

Declared by:

lsp.completion.sources.<name>.opts

Options to use for this completion source. Consult the nvim-cmp documentation for available options.

Type: attribute set

Default: { }

Example:

{
  keyword_length = 5;
}

Declared by:

lsp.completion.sources.<name>.src

The source of the completion module.

Type: package

Declared by:

lsp.completion.src

Source to use for this plugin (note this source refers to the nvim-cmp package to use, although you could swap this out for whatever you like (at the cost of functionality).

Type: package

Default: <derivation source>

Declared by:

lsp.lsp-config.enable

Whether to enable lsp-config.

Type: boolean

Default: false

Example: true

Declared by:

lsp.lsp-config.capabilities

A stringified lua table which is inserted into each language server’s setup function as the capabilities parameter.

Type: string

Default: "vim.lsp.protocol.make_client_capabilities()"

Declared by:

lsp.lsp-config.onAttach

A stringified lua function which is inserted into each language server’s setup function as the on_attach parameter.

Type: string

Default:

''
  function(_, bufnr)
    local opts = { silent = true, buffer = bufnr }
    vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts)
    vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
    vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
    vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts)
    vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, opts)
    vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, opts)
    vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, opts)
    vim.keymap.set('n', '<space>wl', function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, opts)
    vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, opts)
    vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, opts)
    vim.keymap.set({ 'n', 'v' }, '<space>ca', vim.lsp.buf.code_action, opts)
    vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts)
    vim.keymap.set('n', '<space>f', function() vim.lsp.buf.format { async = true } end, opts)
  end
''

Declared by:

lsp.lsp-config.servers

A map of server names to their configuration. The configuration is passed to the setup function of the server.

Type: attribute set of (submodule)

Default: { }

Declared by:

lsp.lsp-config.servers.<name>.cmd

The command used to start the language server. Each argv should be a separate list entry.

If you want to use the default lspconfig ‘cmd’ value, set this value to null (this is the default).

Type: null or (list of string)

Default: null

Example:

cmd = [ "${pkgs.myLanguageServer}/bin/my-lsp" "--stdio"];

Declared by:

lsp.lsp-config.servers.<name>.extraOpts

Additional options to pass to the lsp server setup in require('lspconfig')[<name>].setup(<opts>).

Refer to the LSPconfig server configuration documentation for all available options.

Type: attribute set

Default: { }

Declared by:

lsp.lsp-config.src

Source to use for this plugin (note this source refers to the nvim-lspconfig package to use, although you could swap this out for whatever you like (at the cost of functionality).

Type: package

Default: <derivation source>

Declared by:

lsp.snippets.enable

Whether to enable snippet support. Uses luasnip under the hood.

Type: boolean

Default: false

Example: true

Declared by:

lsp.snippets.keys

A list of keybindings to set up for Luasnip. Follows standard lazy keymap spec.

Type: list of (attribute set)

Default: [ ]

Declared by:

lsp.snippets.src

Source to use for this plugin (note this source refers to the luasnip package to use, although you could swap this out for whatever you like (at the cost of functionality).

Type: package

Default: <derivation vimplugin-luasnip-2023-07-26>

Declared by:

languages.lua.enable

Whether to enable lua LSP features / additional language tooling…

Type: boolean

Default: false

Example: true

Declared by:

languages.lua.lspPkg

Lua language server package to use

Type: package

Default: <derivation lua-language-server-3.6.25>

Declared by:

languages.lua.settings

server-configuration settings to pass to the lsp-config setup.

Type: attribute set

Default:

{
  Lua = {
    diagnostics = {
      globals = [
        "vim"
      ];
      unusedLocalExclude = [
        "_*"
      ];
    };
    semantic = {
      enable = false;
    };
    workspace = {
      library = [
        "/nix/store/bn7q02pqq0cjsj239dg1h7s2f3h818jc-rtp"
      ];
    };
  };
  single_file_support = true;
}

Declared by:

languages.nix.enable

Whether to enable nix LSP features / additional language tooling…

Type: boolean

Default: false

Example: true

Declared by:

languages.nix.settings

Additional options passed to nix-lsp.

Consult the project’s documentation for all available options.

Type: attribute set

Default: { }

Declared by:

languages.rust.enable

Whether to enable rust LSP features / additional language tooling…

Type: boolean

Default: false

Example: true

Declared by:

languages.rust.settings

Additional options passed to rust-lsp.

Consult the project’s documentation for all available options.

Type: attribute set

Default: { }

Declared by: