1
0
Fork 0
mirror of https://github.com/nix-community/nixvim.git synced 2025-11-08 19:46:06 +01:00
nixvim/modules/lsp/keymaps.nix
Matt Sturgeon cb3653a1a8 modules/lsp: select relevant fields in keymaps table
We only use `mode`, `key`, `action`, and `options`; so explicitly
inherit those.

This means we don't serialise attrs that aren't needed at runtime,
such as `lspBufAction`.
2025-09-30 17:01:17 +00:00

138 lines
3.5 KiB
Nix

{ lib, config, ... }:
let
inherit (lib) types;
inherit (lib.nixvim.keymaps) mkMapOptionSubmodule;
cfg = config.lsp;
# An extra module to include in the keymap option submodule
# Declares and implements a specialised `lspBufAction` option
extraKeymapModule =
{ config, options, ... }:
{
options.lspBufAction = lib.mkOption {
type = types.nullOr types.str;
description = ''
LSP buffer action to use for `action`.
If non-null, the keymap's `action` will be defined as `vim.lsp.buf.<action>`.
See [`:h lsp-buf`](https://neovim.io/doc/user/lsp.html#lsp-buf)
'';
default = null;
example = "hover";
};
config.action = lib.mkIf (config.lspBufAction != null) (
lib.mkDerivedConfig options.lspBufAction (
action: lib.nixvim.mkRaw "vim.lsp.buf[${lib.nixvim.toLuaObject action}]"
)
);
};
in
{
options.lsp = {
keymaps = lib.mkOption {
type = types.listOf (mkMapOptionSubmodule {
action.example = "<CMD>LspRestart<Enter>";
extraModules = [ extraKeymapModule ];
});
description = ''
Keymaps to register when a language server is attached.
'';
default = [ ];
example = [
{
key = "gd";
lspBufAction = "definition";
}
{
key = "gD";
lspBufAction = "references";
}
{
key = "gt";
lspBufAction = "type_definition";
}
{
key = "gi";
lspBufAction = "implementation";
}
{
key = "K";
lspBufAction = "hover";
}
{
key = "<leader>k";
action = lib.nixvim.nestedLiteralLua "function() vim.diagnostic.jump({ count=-1, float=true }) end";
}
{
key = "<leader>j";
action = lib.nixvim.nestedLiteralLua "function() vim.diagnostic.jump({ count=1, float=true }) end";
}
{
key = "<leader>lx";
action = "<CMD>LspStop<Enter>";
}
{
key = "<leader>ls";
action = "<CMD>LspStart<Enter>";
}
{
key = "<leader>lr";
action = "<CMD>LspRestart<Enter>";
}
{
key = "gd";
action = lib.nixvim.nestedLiteralLua "require('telescope.builtin').lsp_definitions";
}
{
key = "K";
action = "<CMD>Lspsaga hover_doc<Enter>";
}
];
};
};
config = lib.mkIf (cfg.keymaps != [ ]) {
autoGroups.nixvim_lsp_binds.clear = false;
autoCmd = [
{
event = "LspAttach";
group = "nixvim_lsp_binds";
callback = lib.nixvim.mkRaw ''
function(args)
local __keymaps = ${
lib.pipe cfg.keymaps [
(map (keymap: {
inherit (keymap)
mode
key
action
options
;
}))
(lib.nixvim.lua.toLua' {
multiline = true;
indent = " ";
})
]
}
for _, keymap in ipairs(__keymaps) do
local options = vim.tbl_extend(
"keep",
keymap.options or {},
{ buffer = args.buf }
)
vim.keymap.set(keymap.mode, keymap.key, keymap.action, options)
end
end
'';
desc = "Load LSP keymaps";
}
];
};
}