From e6f1af27674f5421b9b9d753e796db5323cd0722 Mon Sep 17 00:00:00 2001 From: Gaetan Lepage Date: Mon, 15 Jan 2024 08:39:48 +0100 Subject: [PATCH] plugins/marks: init --- plugins/default.nix | 1 + plugins/utils/marks.nix | 186 +++++++++++++++++++++ tests/test-sources/plugins/utils/marks.nix | 23 +++ 3 files changed, 210 insertions(+) create mode 100644 plugins/utils/marks.nix create mode 100644 tests/test-sources/plugins/utils/marks.nix diff --git a/plugins/default.nix b/plugins/default.nix index 85f01f4b04..1676eb9be2 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -125,6 +125,7 @@ ./utils/leap.nix ./utils/magma-nvim.nix ./utils/mark-radar.nix + ./utils/marks.nix ./utils/mini.nix ./utils/mkdnflow.nix ./utils/molten.nix diff --git a/plugins/utils/marks.nix b/plugins/utils/marks.nix new file mode 100644 index 0000000000..52db38426f --- /dev/null +++ b/plugins/utils/marks.nix @@ -0,0 +1,186 @@ +{ + lib, + helpers, + config, + pkgs, + ... +}: +with lib; let + cfg = config.plugins.marks; +in { + meta.maintainers = [maintainers.GaetanLepage]; + + options.plugins.marks = + helpers.extraOptionsOptions + // { + enable = mkEnableOption "marks.nvim"; + + package = helpers.mkPackageOption "marks.nvim" pkgs.vimPlugins.marks-nvim; + + builtinMarks = helpers.defaultNullOpts.mkListOf (types.enum ["'" "^" "." "<" ">"]) "[]" '' + Which builtin marks to track and show. If set, these marks will also show up in the + signcolumn and will update on `|CursorMoved|`. + ''; + + defaultMappings = helpers.defaultNullOpts.mkBool true '' + Whether to use the default plugin mappings or not. + See `|marks-mappings|` for more. + ''; + + signs = helpers.defaultNullOpts.mkBool true '' + Whether to show marks in the signcolumn or not. + If set to true, its recommended to also set `|signcolumn|` to "auto", for cases where + multiple marks are placed on the same line. + ''; + + cyclic = helpers.defaultNullOpts.mkBool true '' + Whether forward/backwards movement should cycle back to the beginning/end of buffer. + ''; + + forceWriteShada = helpers.defaultNullOpts.mkBool false '' + If true, then deleting global (uppercase) marks will also update the `|shada|` file + accordingly and force deletion of the mark permanently. + This option can be destructive and should be set only after reading more about the shada + file. + ''; + + refreshInterval = helpers.defaultNullOpts.mkUnsignedInt 150 '' + How often (in ms) `marks.nvim` should update the marks list and recompute mark + positions/redraw signs. + Lower values means that mark positions and signs will refresh much quicker, but may incur a + higher performance penalty, whereas higher values may result in better performance, but may + also cause noticable lag in signs updating. + ''; + + signPriority = + helpers.defaultNullOpts.mkNullable + ( + with types; + either + ints.unsigned + (submodule { + freeformType = attrs; + options = + mapAttrs + ( + name: desc: + helpers.mkNullOrOption ints.unsigned "Sign priority for ${desc}." + ) + { + lower = "lowercase marks"; + upper = "uppercase marks"; + builtin = "builtin marks"; + bookmark = "bookmarks"; + }; + }) + ) "10" + '' + The sign priority to be used for marks. + Can either be a number, in which case the priority applies to all types of marks, or a + table with some or all of the following keys: + + - lower: sign priority for lowercase marks + - upper: sign priority for uppercase marks + - builtin: sign priority for builtin marks + - bookmark: sign priority for bookmarks + ''; + + excludedFiletypes = helpers.defaultNullOpts.mkListOf types.str "[]" '' + Which filetypes to ignore. + If a buffer with this filetype is opened, then `marks.nvim` will not track any marks set in + this buffer, and will not display any signs. + Setting and moving to marks with ` or ' will still work, but movement commands like "m]" or + "m[" will not. + ''; + + excludedBuftypes = helpers.defaultNullOpts.mkListOf types.str "[]" '' + Which buftypes to ignore. + If a buffer with this buftype is opened, then `marks.nvim` will not track any marks set in + this buffer, and will not display any signs. + Setting and moving to marks with ` or ' will still work, but movement commands like "m]" or + "m[" will not. + ''; + + bookmarks = mkOption { + description = "Configuration table for each bookmark group (see `|marks-bookmarks|`)."; + type = with types; + attrsOf ( + submodule { + options = { + sign = helpers.mkNullOrOption (either str (enum [false])) '' + The character to use in the signcolumn for this bookmark group. + + Defaults to "!@#$%^&*()" - in order from group 1 to 10. + Set to `false` to turn off signs for this bookmark. + ''; + + virtText = helpers.mkNullOrOption str '' + Virtual text annotations to place at the eol of a bookmark. + Defaults to `null`, meaning no virtual text. + ''; + + annotate = helpers.defaultNullOpts.mkBool false '' + When true, explicitly prompts the user for an annotation that will be displayed + above the bookmark. + ''; + }; + } + ); + default = {}; + apply = mapAttrs (_: v: + with v; { + inherit sign; + virt_text = virtText; + inherit annotate; + }); + }; + + mappings = helpers.defaultNullOpts.mkAttrsOf (with types; either str (enum [false])) "{}" '' + Custom mappings. + Set a mapping to `false` to disable it. + ''; + }; + + config = mkIf cfg.enable { + extraPlugins = [cfg.package]; + + assertions = [ + { + assertion = all (n: elem n (range 0 9)) (attrNames cfg.bookmarks); + message = '' + Nixvim (plugins.marks): The keys of the `bookmarks` option should be integers between 0 and 9. + ''; + } + ]; + + extraConfigLua = let + bookmarks = + mapAttrs' + ( + bookmarkNumber: bookmarkOptions: + nameValuePair "bookmark_${bookmarkNumber}" bookmarkOptions + ) + cfg.bookmarks; + + setupOptions = with cfg; + { + builtin_marks = builtinMarks; + default_mappings = defaultMappings; + inherit + signs + cyclic + ; + force_write_shada = forceWriteShada; + refresh_interval = refreshInterval; + sign_priority = signPriority; + excluded_filetypes = excludedFiletypes; + excluded_buftypes = excludedBuftypes; + inherit mappings; + } + // bookmarks + // cfg.extraOptions; + in '' + require('marks').setup(${helpers.toLuaObject setupOptions}) + ''; + }; +} diff --git a/tests/test-sources/plugins/utils/marks.nix b/tests/test-sources/plugins/utils/marks.nix new file mode 100644 index 0000000000..3a278600b7 --- /dev/null +++ b/tests/test-sources/plugins/utils/marks.nix @@ -0,0 +1,23 @@ +{ + empty = { + plugins.marks.enable = true; + }; + + defaults = { + plugins.marks = { + enable = true; + + builtinMarks = []; + defaultMappings = true; + signs = true; + cyclic = true; + forceWriteShada = false; + refreshInterval = 150; + signPriority = 10; + excludedFiletypes = []; + excludedBuftypes = []; + bookmarks = {}; + mappings = {}; + }; + }; +}