From b9941583fdf452566d5694eb8106a19202ec3f62 Mon Sep 17 00:00:00 2001 From: Joe Hanson Date: Sat, 22 Feb 2025 10:41:38 -0600 Subject: [PATCH] utility/multicursors-nvim: init #610) * feat: add multicursors-nvim plugin multicursors-nvim with hydra dependency and static config. * add most used default options * add more descriptions and refine * disable debug mode * maximal by default * add multicursors addition to changelog * Update modules/plugins/hydra/hydra.nix place hydra plugin in utility folder Co-authored-by: raf * clean up hydra config and implementation * mention hydra dependency addition * update to using npins instead of flake based additions. --------- Co-authored-by: raf Co-authored-by: raf --- configuration.nix | 2 +- docs/release-notes/rl-0.8.md | 6 + modules/plugins/hydra/config.nix | 22 +++ modules/plugins/hydra/default.nix | 6 + modules/plugins/hydra/hydra.nix | 7 + modules/plugins/utility/default.nix | 1 + .../plugins/utility/multicursors/config.nix | 36 +++++ .../plugins/utility/multicursors/default.nix | 6 + .../utility/multicursors/multicursors.nix | 126 ++++++++++++++++++ npins/sources.json | 30 +++++ 10 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 modules/plugins/hydra/config.nix create mode 100644 modules/plugins/hydra/default.nix create mode 100644 modules/plugins/hydra/hydra.nix create mode 100644 modules/plugins/utility/multicursors/config.nix create mode 100644 modules/plugins/utility/multicursors/default.nix create mode 100644 modules/plugins/utility/multicursors/multicursors.nix diff --git a/configuration.nix b/configuration.nix index c7b0f288..35dffca5 100644 --- a/configuration.nix +++ b/configuration.nix @@ -183,7 +183,7 @@ isMaximal: { leap.enable = true; precognition.enable = isMaximal; }; - + multicursors.enable = isMaximal; images = { image-nvim.enable = false; }; diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 93e93e8d..a5a791d8 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -159,6 +159,12 @@ - Add support for [nixd](https://github.com/nix-community/nixd) language server. +[jahanson](https://github.com/jahanson): + +- Add [multicursors.nvim](https://github.com/smoka7/multicursors.nvim) to + available plugins, under `vim.utility.multicursors`. +- Add [hydra.nvim](https://github.com/nvimtools/hydra.nvim) as dependency for + `multicursors.nvim` and lazy loads by default. [folospior](https://github.com/folospior) - Fix plugin name for lsp/lspkind. diff --git a/modules/plugins/hydra/config.nix b/modules/plugins/hydra/config.nix new file mode 100644 index 00000000..bc5b2de8 --- /dev/null +++ b/modules/plugins/hydra/config.nix @@ -0,0 +1,22 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + cfg = config.vim.hydra; +in { + config = mkIf cfg.enable { + vim = { + startPlugins = []; + lazy.plugins.hydra = { + package = "hydra.nvim"; + setupModule = "hydra"; + inherit (cfg) setupOpts; + + event = ["DeferredUIEnter"]; + cmd = ["MCstart" "MCvisual" "MCclear" "MCpattern" "MCvisualPattern" "MCunderCursor"]; + }; + }; + }; +} diff --git a/modules/plugins/hydra/default.nix b/modules/plugins/hydra/default.nix new file mode 100644 index 00000000..d35f4d7c --- /dev/null +++ b/modules/plugins/hydra/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./hydra.nix + ./config.nix + ]; +} diff --git a/modules/plugins/hydra/hydra.nix b/modules/plugins/hydra/hydra.nix new file mode 100644 index 00000000..59287a7b --- /dev/null +++ b/modules/plugins/hydra/hydra.nix @@ -0,0 +1,7 @@ +{lib, ...}: let + inherit (lib.options) mkEnableOption; +in { + options.vim.utility.hydra = { + enable = mkEnableOption "utility for creating custom submodes and menus [nvimtools/hydra.nvim]"; + }; +} diff --git a/modules/plugins/utility/default.nix b/modules/plugins/utility/default.nix index 372a4f53..4abb4515 100644 --- a/modules/plugins/utility/default.nix +++ b/modules/plugins/utility/default.nix @@ -8,6 +8,7 @@ ./icon-picker ./images ./motion + ./multicursors ./new-file-template ./outline ./preview diff --git a/modules/plugins/utility/multicursors/config.nix b/modules/plugins/utility/multicursors/config.nix new file mode 100644 index 00000000..8eaa3e28 --- /dev/null +++ b/modules/plugins/utility/multicursors/config.nix @@ -0,0 +1,36 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + cfg = config.vim.utility.multicursors; +in { + config = mkIf cfg.enable { + vim = { + startPlugins = ["hydra-nvim"]; + lazy.plugins."multicursors-nvim" = { + package = "multicursors-nvim"; + setupModule = "multicursors"; + inherit (cfg) setupOpts; + + event = ["DeferredUIEnter"]; + cmd = ["MCstart" "MCvisual" "MCclear" "MCpattern" "MCvisualPattern" "MCunderCursor"]; + keys = [ + { + mode = ["v" "n"]; + key = "mcs"; + action = ":MCstart"; + desc = "Create a selection for selected text or word under the cursor [multicursors.nvim]"; + } + { + mode = ["v" "n"]; + key = "mcp"; + action = ":MCpattern"; + desc = "Create a selection for pattern entered [multicursors.nvim]"; + } + ]; + }; + }; + }; +} diff --git a/modules/plugins/utility/multicursors/default.nix b/modules/plugins/utility/multicursors/default.nix new file mode 100644 index 00000000..a1ddac8e --- /dev/null +++ b/modules/plugins/utility/multicursors/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./multicursors.nix + ./config.nix + ]; +} diff --git a/modules/plugins/utility/multicursors/multicursors.nix b/modules/plugins/utility/multicursors/multicursors.nix new file mode 100644 index 00000000..d533b8a9 --- /dev/null +++ b/modules/plugins/utility/multicursors/multicursors.nix @@ -0,0 +1,126 @@ +{lib, ...}: let + inherit (lib.types) bool int str; + inherit (lib.nvim.types) mkPluginSetupOption; + inherit (lib.options) mkOption mkEnableOption; + hintConfig = {lib, ...}: { + options = { + float_opts = mkOption { + description = "The options for the floating hint window"; + type = lib.types.submodule { + options = { + border = mkOption { + type = lib.types.str; + default = "none"; + description = "The border style for the hint window"; + }; + }; + }; + }; + position = mkOption { + type = lib.types.str; + default = "bottom"; + description = "The position of the hint window"; + }; + }; + }; + generateHints = {lib, ...}: { + options = { + normal = mkOption { + type = lib.types.bool; + description = "Generate hints for the normal mode"; + default = true; + }; + insert = mkOption { + type = lib.types.bool; + description = "Generate hints for the insert mode"; + default = true; + }; + extend = mkOption { + type = lib.types.bool; + description = "Generate hints for the extend mode"; + default = true; + }; + config = mkOption { + description = "The configuration for generating hints for multicursors.nvim"; + type = lib.types.submodule { + options = { + column_count = mkOption { + type = lib.types.nullOr int; + description = "The number of columns to use for the hint window"; + default = null; + }; + max_hint_length = mkOption { + type = int; + description = "The maximum length of the hint"; + default = 25; + }; + }; + }; + default = { + column_count = null; + max_hint_length = 25; + }; + }; + }; + }; +in { + options.vim.utility.multicursors = { + enable = mkEnableOption "multicursors.nvim plugin (vscode like multiple cursors)"; + + setupOpts = mkPluginSetupOption "multicursors" { + DEBUG_MODE = mkOption { + type = bool; + default = false; + description = "Enable debug mode."; + }; + create_commands = mkOption { + type = bool; + default = true; + description = "Create Multicursor user commands"; + }; + updatetime = mkOption { + type = int; + default = 50; + description = "The time in milliseconds to wait before updating the cursor in insert mode"; + }; + nowait = mkOption { + type = bool; + description = "Don't wait for the cursor to move before updating the cursor"; + default = true; + }; + mode_keys = mkOption { + type = lib.types.attrsOf str; + description = "The keys to use for each mode"; + default = { + insert = "i"; + append = "a"; + change = "c"; + extend = "e"; + }; + }; + hint_config = mkOption { + type = lib.types.submodule hintConfig; + description = "The configuration for the hint window"; + default = { + float_opts = { + border = "none"; + }; + position = "bottom"; + }; + }; + generate_hints = mkOption { + type = lib.types.submodule generateHints; + description = "The configuration for generating hints"; + default = { + normal = true; + insert = true; + extend = true; + config = { + column_count = null; + max_hint_length = 25; + }; + }; + }; + }; + }; +} diff --git a/npins/sources.json b/npins/sources.json index d6fb562f..4bbaa056 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -507,6 +507,21 @@ "url": "https://github.com/phaazon/hop.nvim/archive/1a1eceafe54b5081eae4cb91c723abd1d450f34b.tar.gz", "hash": "08h18cam2yr57qvfsnf1bra28vbl6013wlchnr5crb757xw8aysa" }, + "hydra-nvim": { + "type": "GitRelease", + "repository": { + "type": "GitHub", + "owner": "nvimtools", + "repo": "hydra.nvim" + }, + "pre_releases": false, + "version_upper_bound": null, + "release_prefix": null, + "version": "v1.0.2", + "revision": "8578056a2226ed49fc608167edc143a87f75d809", + "url": "https://api.github.com/repos/nvimtools/hydra.nvim/tarball/v1.0.2", + "hash": "13f04pmqrfl65xx9bfkdak6ll57s94anaw7nqd0fm5hp50b7c6j3" + }, "icon-picker-nvim": { "type": "Git", "repository": { @@ -1202,6 +1217,21 @@ "url": "https://github.com/mvllow/modes.nvim/archive/c7a4b1b383606832aab150902719bd5eb5cdb2b0.tar.gz", "hash": "1hy3ghscf8hfmg487p9b8cwd0y8nsi8j24kq2ir3vhd82gqhl4ja" }, + "multicursors-nvim": { + "type": "GitRelease", + "repository": { + "type": "GitHub", + "owner": "smoka7", + "repo": "multicursors.nvim" + }, + "pre_releases": false, + "version_upper_bound": null, + "release_prefix": null, + "version": "v2.0.0", + "revision": "782820896b1691ed664e4c24f1cd9793dcb33dfb", + "url": "https://api.github.com/repos/smoka7/multicursors.nvim/tarball/v2.0.0", + "hash": "171aysqsyapw434xkibxv69p5fkwha4addkqfdssdm0wq9n9cm4q" + }, "neo-tree-nvim": { "type": "Git", "repository": {