From 4afb8e73479293b1f7966583d315a94873648cdf Mon Sep 17 00:00:00 2001 From: traxys Date: Sun, 22 Jan 2023 04:36:24 +0100 Subject: [PATCH] nvim-lightbulb: init * plugins: Add nvim-lightbulb plugin, showing if code actions are available * Update nvim-lightbulb.nix Co-authored-by: Pedro Alves --- plugins/default.nix | 1 + plugins/helpers.nix | 14 +++++ plugins/nvim-lsp/nvim-lightbulb.nix | 93 +++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 plugins/nvim-lsp/nvim-lightbulb.nix diff --git a/plugins/default.nix b/plugins/default.nix index 585ce8cc..9cb055b1 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -35,6 +35,7 @@ ./nvim-lsp ./nvim-lsp/lspsaga.nix ./nvim-lsp/lsp-lines.nix + ./nvim-lsp/nvim-lightbulb.nix ./nvim-lsp/trouble.nix ./pluginmanagers/packer.nix diff --git a/plugins/helpers.nix b/plugins/helpers.nix index 70c85d77..f976cfe9 100644 --- a/plugins/helpers.nix +++ b/plugins/helpers.nix @@ -66,6 +66,20 @@ rec { description = desc; }; + defaultNullOpts = rec { + mkNullable = type: default: desc: mkNullOrOption type (let + defaultDesc = "default: `${default}`"; + in if desc == "" then defaultDesc else '' + ${desc} + + ${defaultDesc} + ''); + + mkInt = default: mkNullable lib.types.int (toString default); + mkBool = default: mkNullable lib.types.bool (toString default); + mkStr = default: mkNullable lib.types.str ''"${default}"''; + }; + mkPlugin = { config, lib, ... }: { name, description, diff --git a/plugins/nvim-lsp/nvim-lightbulb.nix b/plugins/nvim-lsp/nvim-lightbulb.nix new file mode 100644 index 00000000..fc8621c7 --- /dev/null +++ b/plugins/nvim-lsp/nvim-lightbulb.nix @@ -0,0 +1,93 @@ +{ + pkgs, + lib, + config, + helpers, + ... +}: +with lib; { + options.plugins.nvim-lightbulb = { + enable = mkEnableOption "nvim-lightbulb, showing available code actions"; + + package = mkOption { + type = types.package; + default = pkgs.vimPlugins.nvim-lightbulb; + description = "Plugin to use for nvim-lightbulb"; + }; + + ignore = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" '' + LSP client names to ignore + ''; + + sign = { + enabled = helpers.defaultNullOpts.mkBool true ""; + priority = helpers.defaultNullOpts.mkInt 10 ""; + }; + + float = { + enabled = helpers.defaultNullOpts.mkBool false ""; + + text = helpers.defaultNullOpts.mkStr "💡" "Text to show in the popup float"; + + winOpts = helpers.defaultNullOpts.mkNullable (types.attrsOf types.anything) "{}" '' + Options for the floating window (see |vim.lsp.util.open_floating_preview| for more information) + ''; + }; + + virtualText = { + enabled = helpers.defaultNullOpts.mkBool false ""; + + text = helpers.defaultNullOpts.mkStr "💡" "Text to show at virtual text"; + + hlMode = helpers.defaultNullOpts.mkStr "replace" '' + highlight mode to use for virtual text (replace, combine, blend), see + :help nvim_buf_set_extmark() for reference + ''; + }; + + statusText = { + enabled = helpers.defaultNullOpts.mkBool false ""; + + text = helpers.defaultNullOpts.mkStr "💡" "Text to provide when code actions are available"; + + textUnavailable = helpers.defaultNullOpts.mkStr "" '' + Text to provide when no actions are available + ''; + }; + + autocmd = { + enabled = helpers.defaultNullOpts.mkBool false ""; + + pattern = helpers.defaultNullOpts.mkNullable (types.listOf types.str) ''["*"]'' ""; + + events = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''["CursorHold" "CursorHoldI"]'' ""; + }; + }; + + config = let + cfg = config.plugins.nvim-lightbulb; + setupOptions = { + inherit (cfg) ignore sign autocmd; + float = { + inherit (cfg.float) enabled text; + win_opts = cfg.float.winOpts; + }; + virtual_text = { + inherit (cfg.virtualText) enabled text; + hl_mode = cfg.virtualText.hlMode; + }; + status_text = { + inherit (cfg.statusText) enabled text; + text_unavailable = cfg.statusText.textUnavailable; + }; + }; + in + mkIf cfg.enable { + extraPlugins = [cfg.package]; + extraConfigLua = '' + require("nvim-lightbulb").setup(${helpers.toLuaObject setupOptions}) + ''; + }; +}