diff --git a/plugins/nvim-lsp/default.nix b/plugins/nvim-lsp/default.nix index e3eb1b4b..dfbf6c81 100644 --- a/plugins/nvim-lsp/default.nix +++ b/plugins/nvim-lsp/default.nix @@ -16,6 +16,37 @@ in { plugins.lsp = { enable = mkEnableOption "neovim's built-in LSP"; + keymaps = { + silent = mkOption { + type = types.bool; + description = "Whether nvim-lsp keymaps should be silent"; + default = false; + }; + + diagnostic = mkOption { + type = types.attrsOf types.str; + description = "Mappings for `vim.diagnostic.` functions."; + example = { + "k" = "goto_prev"; + "j" = "goto_next"; + }; + default = {}; + }; + + lspBuf = mkOption { + type = types.attrsOf types.str; + description = "Mappings for `vim.lsp.buf.` functions."; + example = { + "gd" = "definition"; + "gD" = "references"; + "gt" = "type_definition"; + "gi" = "implementation"; + "K" = "hover"; + }; + default = {}; + }; + }; + enabledServers = mkOption { type = with types; listOf (oneOf [ @@ -79,6 +110,30 @@ in { mkIf cfg.enable { extraPlugins = [pkgs.vimPlugins.nvim-lspconfig]; + maps.normal = let + diagnosticMaps = + mapAttrs + (key: action: { + silent = cfg.keymaps.silent; + action = "vim.diagnostic.${action}"; + lua = true; + }) + cfg.keymaps.diagnostic; + + lspBuf = + mapAttrs + (key: action: { + silent = cfg.keymaps.silent; + action = "vim.lsp.buf.${action}"; + lua = true; + }) + cfg.keymaps.lspBuf; + in + mkMerge [ + diagnosticMaps + lspBuf + ]; + # Enable all LSP servers extraConfigLua = '' -- LSP {{{ diff --git a/tests/plugins/nvim-lsp.nix b/tests/plugins/nvim-lsp.nix new file mode 100644 index 00000000..be70ad8a --- /dev/null +++ b/tests/plugins/nvim-lsp.nix @@ -0,0 +1,39 @@ +{ + empty = { + plugins.lsp.enable = true; + }; + + test = { + plugins.lsp = { + enable = true; + + keymaps = { + silent = true; + diagnostic = { + "k" = "goto_prev"; + "j" = "goto_next"; + }; + + lspBuf = { + "gd" = "definition"; + "gD" = "references"; + "gt" = "type_definition"; + "gi" = "implementation"; + "K" = "hover"; + }; + }; + + servers = { + bashls.enable = true; + clangd.enable = true; + nil_ls.enable = true; + rust-analyzer.enable = true; + pylsp = { + enable = true; + filetypes = ["python"]; + autostart = false; + }; + }; + }; + }; +}