From 3d24cb72618738130e6af9c644c81fe42aa34ebc Mon Sep 17 00:00:00 2001 From: Gaetan Lepage Date: Mon, 4 Nov 2024 14:14:32 +0100 Subject: [PATCH] plugins/fastaction: init --- plugins/by-name/fastaction/default.nix | 194 ++++++++++++++++++ .../plugins/by-name/fastaction/default.nix | 84 ++++++++ 2 files changed, 278 insertions(+) create mode 100644 plugins/by-name/fastaction/default.nix create mode 100644 tests/test-sources/plugins/by-name/fastaction/default.nix diff --git a/plugins/by-name/fastaction/default.nix b/plugins/by-name/fastaction/default.nix new file mode 100644 index 00000000..26290966 --- /dev/null +++ b/plugins/by-name/fastaction/default.nix @@ -0,0 +1,194 @@ +{ lib, ... }: +let + inherit (lib.nixvim) defaultNullOpts mkNullOrStr'; + inherit (lib) types; +in +lib.nixvim.neovim-plugin.mkNeovimPlugin { + name = "fastaction"; + originalName = "fastaction.nvim"; + package = "fastaction-nvim"; + + maintainers = [ lib.maintainers.GaetanLepage ]; + + settingsOptions = { + popup = { + title = defaultNullOpts.mkStr "Select one of:" '' + Title of the popup. + ''; + + relative = defaultNullOpts.mkStr "cursor" '' + Specifies what the popup is relative to. + ''; + + border = defaultNullOpts.mkNullable (with types; either str (listOf str)) "rounded" '' + Style of the popup border. Can be "single", "double", "rounded", "thick", or a table of + strings in the format: + ```nix + [ + "top left" + "top" + "top right" + "right" + "bottom right" + "bottom" + "bottom left" + "left" + ] + ``` + ''; + + hide_cursor = defaultNullOpts.mkBool true '' + Whether to hide the cursor when the popup is shown. + ''; + + highlight = + defaultNullOpts.mkAttrsOf types.str + { + divider = "FloatBorder"; + key = "MoreMsg"; + title = "Title"; + window = "NormalFloat"; + } + '' + Configures the highlights of different aspects of the popup. + ''; + + x_offset = defaultNullOpts.mkInt 0 '' + Configures the horizontal position of the popup with respect to the relative value. + ''; + + y_offset = defaultNullOpts.mkInt 0 '' + Configures the vertical position of the popup with respect to the relative value. + ''; + }; + + priority = defaultNullOpts.mkAttrsOf' { + type = + with types; + listOf (submodule { + freeformType = attrsOf anything; + options = { + pattern = mkNullOrStr' { + example = "organize import"; + description = '' + Pattern for this code action. + ''; + }; + + key = mkNullOrStr' { + example = "o"; + description = '' + Keyboard shortcut for this code action. + ''; + }; + + order = defaultNullOpts.mkUnsignedInt' { + example = 1; + pluginDefault = 10; + description = '' + Priority for this code action. + ''; + }; + }; + }); + description = '' + Specifies the priority and keys to map to patterns matching code actions. + ''; + pluginDefault = { + default = [ ]; + }; + example = { + dart = [ + { + pattern = "organize import"; + key = "o"; + order = 1; + } + { + pattern = "extract method"; + key = "x"; + order = 2; + } + { + pattern = "extract widget"; + key = "e"; + order = 3; + } + ]; + }; + }; + + register_ui_select = defaultNullOpts.mkBool false '' + Determines if the select popup should be registered as a `vim.ui.select` handler. + ''; + + keys = + defaultNullOpts.mkNullable (with types; either str (listOf str)) "qwertyuiopasdfghlzxcvbnm" + '' + Keys to use to map options. + ''; + + dismiss_keys = + defaultNullOpts.mkListOf types.str + [ + "j" + "k" + "" + "q" + ] + '' + Keys to use to dismiss the popup. + ''; + + override_function = defaultNullOpts.mkNullable types.rawLua { __raw = "function(_) end"; } '' + Override function to map keys to actions. + + ```lua + fun(params: GetActionConfigParams): ActionConfig | nil + ``` + ''; + + fallback_threshold = defaultNullOpts.mkUnsignedInt 26 '' + Configures number of options after which fastaction must fallback on `vim.ui.select`. + ''; + }; + + settingsExample = { + dismiss_keys = [ + "j" + "k" + "" + "q" + ]; + keys = "qwertyuiopasdfghlzxcvbnm"; + popup = { + border = "rounded"; + hide_cursor = true; + highlight = { + divider = "FloatBorder"; + key = "MoreMsg"; + title = "Title"; + window = "NormalFloat"; + }; + title = "Select one of:"; + }; + priority.dart = [ + { + pattern = "organize import"; + key = "o"; + order = 1; + } + { + pattern = "extract method"; + key = "x"; + order = 2; + } + { + pattern = "extract widget"; + key = "e"; + order = 3; + } + ]; + register_ui_select = false; + }; +} diff --git a/tests/test-sources/plugins/by-name/fastaction/default.nix b/tests/test-sources/plugins/by-name/fastaction/default.nix new file mode 100644 index 00000000..1110d056 --- /dev/null +++ b/tests/test-sources/plugins/by-name/fastaction/default.nix @@ -0,0 +1,84 @@ +{ + empty = { + plugins.fastaction.enable = true; + }; + + defaults = { + plugins.fastaction = { + enable = true; + + settings = { + popup = { + title = "Select one of:"; + relative = "cursor"; + border = "rounded"; + hide_cursor = true; + highlight = { + divider = "FloatBorder"; + key = "MoreMsg"; + title = "Title"; + window = "NormalFloat"; + }; + x_offset = 0; + y_offset = 0; + }; + priority.default = [ ]; + register_ui_select = false; + keys = "qwertyuiopasdfghlzxcvbnm"; + dismiss_keys = [ + "j" + "k" + "" + "q" + ]; + override_function.__raw = "function(_) end"; + fallback_threshold = 26; + }; + }; + }; + + example = { + plugins.fastaction = { + enable = true; + + settings = { + dismiss_keys = [ + "j" + "k" + "" + "q" + ]; + keys = "qwertyuiopasdfghlzxcvbnm"; + popup = { + border = "rounded"; + hide_cursor = true; + highlight = { + divider = "FloatBorder"; + key = "MoreMsg"; + title = "Title"; + window = "NormalFloat"; + }; + title = "Select one of:"; + }; + priority.dart = [ + { + pattern = "organize import"; + key = "o"; + order = 1; + } + { + pattern = "extract method"; + key = "x"; + order = 2; + } + { + pattern = "extract widget"; + key = "e"; + order = 3; + } + ]; + register_ui_select = false; + }; + }; + }; +}