nix-community.nixvim/modules/lsp/on-attach.nix
Matt Sturgeon a45b5f372f modules/lsp: add onAttach option
Similar to `plugins.lsp.onAttach`, implement a "global" equivalent to
the per-server `on_attach` callback.

This is implemented using a `LspAttach` autoCmd.
2025-05-06 14:08:03 +01:00

48 lines
1.3 KiB
Nix

{ lib, config, ... }:
let
cfg = config.lsp;
in
{
options.lsp = {
onAttach = lib.mkOption {
type = lib.types.lines;
description = ''
Lines of lua to be run when a language server is attached.
> [!TIP]
> The variables `client` and `bufnr` are made available in scope.
This is a global equivialent to the per-server `on_attach` callback,
which can be defined via `lsp.servers.<name>.settings.on_attach`.
Unlike the per-server callback, which should be defined as a lua
callback function, this option should be defined as the function body.
'';
default = "";
};
};
config = lib.mkIf (cfg.onAttach != "") {
autoGroups.nixvim_lsp_on_attach.clear = false;
autoCmd = [
{
event = "LspAttach";
group = "nixvim_lsp_on_attach";
callback = lib.nixvim.mkRaw ''
function(args)
do
-- client and bufnr are supplied to the builtin `on_attach` callback,
-- so make them available in scope for our global `onAttach` impl
local client = vim.lsp.get_client_by_id(args.data.client_id)
local bufnr = args.bufnr
${cfg.onAttach}
end
end
'';
desc = "Run LSP onAttach";
}
];
};
}