Skip to content

Commit

Permalink
plugin/nvim-lightbulb: update and switch to mkNeovimPlugin
Browse files Browse the repository at this point in the history
  • Loading branch information
rsHalford authored and GaetanLepage committed Feb 15, 2024
1 parent 6d7e429 commit 2594863
Show file tree
Hide file tree
Showing 2 changed files with 291 additions and 58 deletions.
252 changes: 194 additions & 58 deletions plugins/lsp/nvim-lightbulb.nix
Original file line number Diff line number Diff line change
Expand Up @@ -5,85 +5,221 @@
pkgs,
...
}:
with lib; {
options.plugins.nvim-lightbulb = {
enable = mkEnableOption "nvim-lightbulb, showing available code actions";
with lib;
helpers.neovim-plugin.mkNeovimPlugin config {
name = "nvim-lightbulb";
defaultPackage = pkgs.vimPlugins.nvim-lightbulb;

maintainers = [maintainers.GaetanLepage];

# TODO introduced 2024-02-15. Remove on 2024-03-15
imports =
map
(
optionName:
mkRemovedOptionModule
["plugins" "nvim-lightbulb" optionName]
"Please use `plugins.nvim-lightbulb.settings` instead."
)
[
"ignore"
"sign"
"float"
"virtualText"
"statusText"
"autocmd"
];

settingsOptions = {
priority = helpers.defaultNullOpts.mkUnsignedInt 10 ''
Priority of the lightbulb for all handlers except float.
'';

package = helpers.mkPackageOption "nvim-lightbulb" pkgs.vimPlugins.nvim-lightbulb;
hide_in_unfocused_buffer = helpers.defaultNullOpts.mkBool true ''
Whether or not to hide the lightbulb when the buffer is not focused.
Only works if configured during `NvimLightbulb.setup`.
'';

ignore = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" ''
LSP client names to ignore
'';
link_highlights = helpers.defaultNullOpts.mkBool true ''
Whether or not to link the highlight groups automatically.
Default highlight group links:
- `LightBulbSign` -> `DiagnosticSignInfo`
- `LightBulbFloatWin` -> `DiagnosticFloatingInfo`
- `LightBulbVirtualText` -> `DiagnosticVirtualTextInfo`
- `LightBulbNumber` -> `DiagnosticSignInfo`
- `LightBulbLine` -> `CursorLine`
sign = {
enabled = helpers.defaultNullOpts.mkBool true "";
priority = helpers.defaultNullOpts.mkInt 10 "";
};
Only works if configured during `NvimLightbulb.setup`.
'';

float = {
enabled = helpers.defaultNullOpts.mkBool false "";
validate_config = helpers.defaultNullOpts.mkEnumFirstDefault ["auto" "always" "never"] ''
Perform full validation of configuration.
text = helpers.defaultNullOpts.mkStr "💡" "Text to show in the popup float";
- "auto" only performs full validation in `NvimLightbulb.setup`.
- "always" performs full validation in `NvimLightbulb.update_lightbulb` as well.
- "never" disables config validation.
'';

winOpts = helpers.defaultNullOpts.mkNullable (types.attrsOf types.anything) "{}" ''
Options for the floating window (see |vim.lsp.util.open_floating_preview| for more information)
action_kinds = helpers.mkNullOrOption (with types; listOf str) ''
Code action kinds to observe.
To match all code actions, set to `null`.
Otherwise, set to a list of kinds.
Example:
```nix
[
"quickfix"
"refactor.rewrite"
]
```
See: https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#codeActionKind
'';
};

virtualText = {
enabled = helpers.defaultNullOpts.mkBool false "";
sign = {
enabled = helpers.defaultNullOpts.mkBool true "Sign column.";

text = helpers.defaultNullOpts.mkStr "💡" "Text to show at virtual text";
text = helpers.defaultNullOpts.mkStr "💡" ''
Text to show in the sign column.
Must be between 1-2 characters.
'';

hlMode = helpers.defaultNullOpts.mkStr "replace" ''
highlight mode to use for virtual text (replace, combine, blend), see
:help nvim_buf_set_extmark() for reference
'';
};
hl = helpers.defaultNullOpts.mkStr "LightBulbSign" ''
Highlight group to highlight the sign column text.
'';
};

statusText = {
enabled = helpers.defaultNullOpts.mkBool false "";
virtual_text = {
enabled = helpers.defaultNullOpts.mkBool false "Virtual text.";

text = helpers.defaultNullOpts.mkStr "💡" "Text to provide when code actions are available";
text = helpers.defaultNullOpts.mkStr "💡" "Text to show in the virt_text.";

textUnavailable = helpers.defaultNullOpts.mkStr "" ''
Text to provide when no actions are available
'';
};
pos = helpers.defaultNullOpts.mkStr "eol" ''
Position of virtual text given to |nvim_buf_set_extmark|.
Can be a number representing a fixed column (see `virt_text_pos`).
Can be a string representing a position (see `virt_text_win_col`).
'';

hl = helpers.defaultNullOpts.mkStr "LightBulbVirtualText" ''
Highlight group to highlight the virtual text.
'';

hl_mode = helpers.defaultNullOpts.mkStr "combine" ''
How to combine other highlights with text highlight.
See `hl_mode` of |nvim_buf_set_extmark|.
'';
};

float = {
enabled = helpers.defaultNullOpts.mkBool false "Floating window.";

autocmd = {
enabled = helpers.defaultNullOpts.mkBool false "";
text = helpers.defaultNullOpts.mkStr "💡" "Text to show in the floating window.";

hl = helpers.defaultNullOpts.mkStr "LightBulbFloatWin" ''
Highlight group to highlight the floating window.
'';

win_opts = helpers.defaultNullOpts.mkAttrsOf types.anything "{}" ''
Window options.
See |vim.lsp.util.open_floating_preview| and |nvim_open_win|.
Note that some options may be overridden by |open_floating_preview|.
'';
};

status_text = {
enabled = helpers.defaultNullOpts.mkBool false ''
Status text.
When enabled, will allow using |NvimLightbulb.get_status_text| to retrieve the configured text.
'';

pattern = helpers.defaultNullOpts.mkNullable (types.listOf types.str) ''["*"]'' "";
text = helpers.defaultNullOpts.mkStr "💡" "Text to set if a lightbulb is available.";

events =
helpers.defaultNullOpts.mkNullable (types.listOf types.str)
''["CursorHold" "CursorHoldI"]'' "";
text_unavailable = helpers.defaultNullOpts.mkStr "" ''
Text to set if a lightbulb is unavailable.
'';
};

number = {
enabled = helpers.defaultNullOpts.mkBool false "Number column.";

hl = helpers.defaultNullOpts.mkStr "LightBulbNumber" ''
Highlight group to highlight the number column if there is a lightbulb.
'';
};

line = {
enabled = helpers.defaultNullOpts.mkBool false "Content line.";

hl = helpers.defaultNullOpts.mkStr "LightBulbLine" ''
Highlight group to highlight the line if there is a lightbulb.
'';
};

autocmd = {
enabled = helpers.defaultNullOpts.mkBool false ''
Autocmd configuration.
If enabled, automatically defines an autocmd to show the lightbulb.
If disabled, you will have to manually call |NvimLightbulb.update_lightbulb|.
Only works if configured during `NvimLightbulb.setup`.
'';

updatetime = helpers.defaultNullOpts.mkInt 200 ''
See |updatetime|.
Set to a negative value to avoid setting the updatetime.
'';

pattern = helpers.defaultNullOpts.mkListOf types.str ''["*"]'' ''
See |nvim_create_autocmd| and |autocmd-pattern|.
'';

events = helpers.defaultNullOpts.mkListOf types.str ''["CursorHold" "CursorHoldI"]'' ''
See |nvim_create_autocmd|.
'';
};

ignore = {
clients = helpers.defaultNullOpts.mkListOf types.str "[]" ''
LSP client names to ignore.
Example: {"null-ls", "lua_ls"}
'';

ft = helpers.defaultNullOpts.mkListOf types.str "[]" ''
Filetypes to ignore.
Example: {"neo-tree", "lua"}
'';

actions_without_kind = helpers.defaultNullOpts.mkBool false ''
Ignore code actions without a `kind` like `refactor.rewrite`, quickfix.
'';
};
};
};

config = let
cfg = config.plugins.nvim-lightbulb;
setupOptions = {
inherit (cfg) ignore sign autocmd;
float = {
inherit (cfg.float) enabled text;
win_opts = cfg.float.winOpts;
settingsExample = {
sign = {
enabled = false;
text = "󰌶";
};
virtual_text = {
inherit (cfg.virtualText) enabled text;
hl_mode = cfg.virtualText.hlMode;
enabled = true;
text = "󰌶";
};
float = {
enabled = false;
text = " 󰌶 ";
win_opts.border = "rounded";
};
status_text = {
inherit (cfg.statusText) enabled text;
text_unavailable = cfg.statusText.textUnavailable;
enabled = false;
text = " 󰌶 ";
};
number = {
enabled = false;
};
line = {
enabled = false;
};
autocmd = {
enabled = true;
updatetime = 200;
};
};
in
mkIf cfg.enable {
extraPlugins = [cfg.package];
extraConfigLua = ''
require("nvim-lightbulb").setup(${helpers.toLuaObject setupOptions})
'';
};
}
}
97 changes: 97 additions & 0 deletions tests/test-sources/plugins/lsp/nvim-lightbulb.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
{
empty = {
plugins.nvim-lightbulb.enable = true;
};

defaults = {
plugins.nvim-lightbulb = {
enable = true;

settings = {
priority = 10;
hide_in_unfocused_buffer = true;
link_highlights = true;
validate_config = "auto";
action_kinds = null;
sign = {
enabled = true;
text = "💡";
hl = "LightBulbSign";
};
virtual_text = {
enabled = false;
text = "💡";
pos = "eol";
hl = "LightBulbVirtualText";
hl_mode = "combine";
};
float = {
enabled = false;
text = "💡";
hl = "LightBulbFloatWin";
win_opts = {};
};
status_text = {
enabled = false;
text = "💡";
text_unavailable = "";
};
number = {
enabled = false;
hl = "LightBulbNumber";
};
line = {
enabled = false;
hl = "LightBulbLine";
};
autocmd = {
enabled = false;
updatetime = 200;
pattern = ["*"];
events = ["CursorHold" "CursorHoldI"];
};
ignore = {
clients = [];
ft = [];
actions_without_kind = false;
};
};
};
};

example = {
plugins.nvim-lightbulb = {
enable = true;

settings = {
sign = {
enabled = false;
text = "󰌶";
};
virtual_text = {
enabled = true;
text = "󰌶";
};
float = {
enabled = false;
text = " 󰌶 ";
win_opts.border = "rounded";
};
status_text = {
enabled = false;
text = " 󰌶 ";
};
number = {
enabled = false;
};
line = {
enabled = false;
};
autocmd = {
enabled = true;
updatetime = 200;
};
};
};
};
}

0 comments on commit 2594863

Please sign in to comment.