diff --git a/configuration.nix b/configuration.nix index 8de0010..98b9999 100644 --- a/configuration.nix +++ b/configuration.nix @@ -77,20 +77,17 @@ isMaximal: { }; visuals = { - enable = true; - nvimWebDevicons.enable = true; - scrollBar.enable = isMaximal; - smoothScroll.enable = true; - cellularAutomaton.enable = false; + nvim-scrollbar.enable = isMaximal; + nvim-web-devicons.enable = true; + nvim-cursorline.enable = true; + cinnamon-nvim.enable = true; fidget-nvim.enable = true; + highlight-undo.enable = true; + indent-blankline.enable = true; - indentBlankline.enable = true; - - cursorline = { - enable = true; - lineTimeout = 0; - }; + # Fun + cellular-automaton.enable = false; }; statusline = { diff --git a/modules/plugins/visuals/cellular-automaton/cellular-automaton.nix b/modules/plugins/visuals/cellular-automaton/cellular-automaton.nix new file mode 100644 index 0000000..6d432e7 --- /dev/null +++ b/modules/plugins/visuals/cellular-automaton/cellular-automaton.nix @@ -0,0 +1,60 @@ +{lib, ...}: let + inherit (lib.modules) mkRenamedOptionModule; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.nvim.types) luaInline; + inherit (lib.nvim.binds) mkMappingOption; + inherit (lib.generators) mkLuaInline; +in { + imports = [ + (mkRenamedOptionModule ["vim" "visuals" "cellularAutomaton"] ["vim" "visuals" "cellular-automaton"]) + ]; + + options.vim.visuals.cellular-automaton = { + enable = mkEnableOption "cellular-automaton to help you cope with stubborn code [cellular-automaton]"; + + mappings = { + makeItRain = mkMappingOption "Make it rain [cellular-automaton]" "fml"; + }; + + animation = { + register = mkEnableOption "registering configured animation(s) automatically" // {default = true;}; + setup = mkOption { + type = luaInline; + default = mkLuaInline '' + local ca_config = { + fps = 50, + name = 'slide', + } + + -- init function is invoked only once at the start + -- config.init = function (grid) + -- + -- end + + -- update function + ca_config.update = function (grid) + for i = 1, #grid do + local prev = grid[i][#(grid[i])] + for j = 1, #(grid[i]) do + grid[i][j], prev = prev, grid[i][j] + end + end + return true + end + ''; + description = '' + Configuration used to generate an animation to be registered. + + The final value for `ca_config` will be used to register a new + animation using `require("cellular-automaton").register_animation(ca_config)` + + ::: {.warning} + `ca_config` **must** eval to a valid Lua table. nvf does not and cannot + perform any kind of validation on your Lua code, so bogus values will + result in errors when the animation is registered. + ::: + ''; + }; + }; + }; +} diff --git a/modules/plugins/visuals/cellular-automaton/config.nix b/modules/plugins/visuals/cellular-automaton/config.nix new file mode 100644 index 0000000..2c0c466 --- /dev/null +++ b/modules/plugins/visuals/cellular-automaton/config.nix @@ -0,0 +1,39 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.strings) optionalString; + inherit (lib.nvim.lua) toLuaObject; + inherit (lib.nvim.dag) entryAnywhere entryAfter; + inherit (lib.nvim.binds) mkBinding; + + cfg = config.vim.visuals.cellular-automaton; +in { + config = mkIf cfg.enable { + vim = { + startPlugins = ["cellular-automaton"]; + + maps.normal = mkBinding cfg.mappings.makeItRain "CellularAutomaton make_it_rain" "Make it rain"; + + pluginRC = { + # XXX: This has no error handling. User can set + # `animation.setup` to a bogus value, and we would + # have an error in our hands. I don't think there + # is a good way to check for errors, so I'm leaving + # it like this under the assumption that the user + # will not mess it up for no reason. + cellular-automaton-anim = entryAnywhere (optionalString cfg.animation.register '' + -- Coerce user animation config into pluginRC + ${toLuaObject cfg.animation.setup} + ''); + + cellular-automaton = entryAfter ["cellular-automaton-anim"] '' + -- Register the animation + require("cellular-automaton").register_animation(ca_config) + ''; + }; + }; + }; +} diff --git a/modules/plugins/visuals/cellular-automaton/default.nix b/modules/plugins/visuals/cellular-automaton/default.nix new file mode 100644 index 0000000..4bb43af --- /dev/null +++ b/modules/plugins/visuals/cellular-automaton/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./cellular-automaton.nix + ]; +} diff --git a/modules/plugins/visuals/cinnamon-nvim/cinnamon-nvim.nix b/modules/plugins/visuals/cinnamon-nvim/cinnamon-nvim.nix new file mode 100644 index 0000000..109b06f --- /dev/null +++ b/modules/plugins/visuals/cinnamon-nvim/cinnamon-nvim.nix @@ -0,0 +1,35 @@ +{lib, ...}: let + inherit (lib.modules) mkRemovedOptionModule; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.types) submodule attrs attrsOf; + inherit (lib.nvim.types) mkPluginSetupOption; +in { + imports = [ + (mkRemovedOptionModule ["vim" "visuals" "smoothScroll"] '' + `vim.visuals.smoothScroll` has been removed. You may consider enabling the + option `vim.visuals.cinnamon-nvim` to repliace previous smooth scrolling + behaviour. + '') + ]; + + options.vim.visuals.cinnamon-nvim = { + enable = mkEnableOption "smooth scrolling for ANY command [cinnamon-nvim]"; + setupOpts = mkPluginSetupOption "cinnamon.nvim" { + options = mkOption { + type = attrs; + default = { + # Defaults provided for the sake of documentation only! + # Who would've guessed setupOpts.options would be confusing? + mode = "cursor"; + count_only = false; + }; + description = "Scroll options"; + }; + + keymaps = { + basic = mkEnableOption "basic animation keymaps"; + extra = mkEnableOption "extra animation keymaps"; + }; + }; + }; +} diff --git a/modules/plugins/visuals/cinnamon-nvim/config.nix b/modules/plugins/visuals/cinnamon-nvim/config.nix new file mode 100644 index 0000000..8e42022 --- /dev/null +++ b/modules/plugins/visuals/cinnamon-nvim/config.nix @@ -0,0 +1,21 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.nvim.lua) toLuaObject; + inherit (lib.nvim.dag) entryAnywhere; + + cfg = config.vim.visuals.cinnamon-nvim; +in { + config = mkIf cfg.enable { + vim = { + startPlugins = ["cinnamon-nvim"]; + + pluginRC.cursorline = entryAnywhere '' + require("cinnamon").setup(${toLuaObject cfg.setupOpts}) + ''; + }; + }; +} diff --git a/modules/plugins/visuals/cinnamon-nvim/default.nix b/modules/plugins/visuals/cinnamon-nvim/default.nix new file mode 100644 index 0000000..29ced8e --- /dev/null +++ b/modules/plugins/visuals/cinnamon-nvim/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./cinnamon-nvim.nix + ]; +} diff --git a/modules/plugins/visuals/config.nix b/modules/plugins/visuals/config.nix deleted file mode 100644 index 1457ff3..0000000 --- a/modules/plugins/visuals/config.nix +++ /dev/null @@ -1,118 +0,0 @@ -{ - config, - lib, - ... -}: let - inherit (lib.modules) mkIf mkMerge; - inherit (lib.trivial) boolToString; - inherit (lib.nvim.binds) mkBinding; - inherit (lib.nvim.dag) entryAnywhere; - inherit (lib.nvim.lua) toLuaObject; - - cfg = config.vim.visuals; -in { - config = mkIf cfg.enable (mkMerge [ - (mkIf cfg.indentBlankline.enable { - vim.startPlugins = ["indent-blankline"]; - vim.pluginRC.indent-blankline = entryAnywhere '' - require("ibl").setup(${toLuaObject cfg.indentBlankline.setupOpts}) - ''; - }) - - (mkIf cfg.cursorline.enable { - vim.startPlugins = ["nvim-cursorline"]; - vim.pluginRC.cursorline = entryAnywhere '' - require('nvim-cursorline').setup { - cursorline = { - timeout = ${toString cfg.cursorline.lineTimeout}, - number = ${boolToString (!cfg.cursorline.lineNumbersOnly)}, - } - } - ''; - }) - - (mkIf cfg.nvimWebDevicons.enable { - vim.startPlugins = ["nvim-web-devicons"]; - }) - - (mkIf cfg.scrollBar.enable { - vim.startPlugins = ["scrollbar-nvim"]; - vim.pluginRC.scrollBar = entryAnywhere '' - require('scrollbar').setup{ - excluded_filetypes = { - 'prompt', - 'TelescopePrompt', - 'noice', - 'NvimTree', - 'alpha', - 'notify', - 'Navbuddy' - }, - } - ''; - }) - - (mkIf cfg.smoothScroll.enable { - vim.startPlugins = ["cinnamon-nvim"]; - vim.pluginRC.smoothScroll = entryAnywhere '' - require('cinnamon').setup() - ''; - }) - - (mkIf cfg.cellularAutomaton.enable { - vim.startPlugins = ["cellular-automaton"]; - - vim.maps.normal = mkBinding cfg.cellularAutomaton.mappings.makeItRain "CellularAutomaton make_it_rain" "Make it rain"; - - vim.pluginRC.cellularAUtomaton = entryAnywhere '' - local config = { - fps = 50, - name = 'slide', - } - - -- init function is invoked only once at the start - -- config.init = function (grid) - -- - -- end - - -- update function - config.update = function (grid) - for i = 1, #grid do - local prev = grid[i][#(grid[i])] - for j = 1, #(grid[i]) do - grid[i][j], prev = prev, grid[i][j] - end - end - return true - end - - require("cellular-automaton").register_animation(config) - ''; - }) - - (mkIf cfg.highlight-undo.enable { - vim.startPlugins = ["highlight-undo"]; - vim.pluginRC.highlight-undo = entryAnywhere '' - require('highlight-undo').setup({ - duration = ${toString cfg.highlight-undo.duration}, - highlight_for_count = ${boolToString cfg.highlight-undo.highlightForCount}, - undo = { - hlgroup = ${cfg.highlight-undo.undo.hlGroup}, - mode = 'n', - lhs = 'u', - map = 'undo', - opts = {} - }, - - redo = { - hlgroup = ${cfg.highlight-undo.redo.hlGroup}, - mode = 'n', - lhs = '', - map = 'redo', - opts = {} - }, - }) - ''; - }) - ]); -} diff --git a/modules/plugins/visuals/default.nix b/modules/plugins/visuals/default.nix index 3c977cb..7b413c3 100644 --- a/modules/plugins/visuals/default.nix +++ b/modules/plugins/visuals/default.nix @@ -1,7 +1,19 @@ -{...}: { +{lib, ...}: let + inherit (lib.modules) mkRemovedOptionModule; +in { imports = [ - ./config.nix - ./visuals.nix - ./fidget + (mkRemovedOptionModule ["vim" "visuals" "enable"] '' + As top-level toggles are being deprecated, you are encouraged + to handle plugin toggles under individual options. + '') + + ./cellular-automaton + ./cinnamon-nvim + ./fidget-nvim + ./highlight-undo + ./indent-blankline + ./nvim-cursorline + ./nvim-scrollbar + ./nvim-web-devicons ]; } diff --git a/modules/plugins/visuals/fidget/config.nix b/modules/plugins/visuals/fidget-nvim/config.nix similarity index 100% rename from modules/plugins/visuals/fidget/config.nix rename to modules/plugins/visuals/fidget-nvim/config.nix diff --git a/modules/plugins/visuals/fidget/default.nix b/modules/plugins/visuals/fidget-nvim/default.nix similarity index 100% rename from modules/plugins/visuals/fidget/default.nix rename to modules/plugins/visuals/fidget-nvim/default.nix diff --git a/modules/plugins/visuals/fidget/fidget.nix b/modules/plugins/visuals/fidget-nvim/fidget.nix similarity index 98% rename from modules/plugins/visuals/fidget/fidget.nix rename to modules/plugins/visuals/fidget-nvim/fidget.nix index 79974bd..fa2ecb4 100644 --- a/modules/plugins/visuals/fidget/fidget.nix +++ b/modules/plugins/visuals/fidget-nvim/fidget.nix @@ -12,8 +12,11 @@ in { imports = [ (mkRenamedOptionModule ["vim" "visuals" "fidget-nvim" "align" "bottom"] ["vim" "visuals" "fidget-nvim" "setupOpts" "notification" "window" "align"]) - (mkRemovedOptionModule ["vim" "visuals" "fidget-nvim" "align" "right"] - "Option `vim.fidget-nvim.align.right` has been removed and does not have an equivalent replacement in rewritten fidget.nvim configuration.") + (mkRemovedOptionModule ["vim" "visuals" "fidget-nvim" "align" "right"] '' + Option `vim.fidget-nvim.align.right` has been removed and does not have an + equivalent replacement in rewritten fidget.nvim configuration. Please remove + it from your configuration. + '') ]; options.vim.visuals.fidget-nvim = { diff --git a/modules/plugins/visuals/highlight-undo/config.nix b/modules/plugins/visuals/highlight-undo/config.nix new file mode 100644 index 0000000..d41c6a6 --- /dev/null +++ b/modules/plugins/visuals/highlight-undo/config.nix @@ -0,0 +1,21 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.nvim.lua) toLuaObject; + inherit (lib.nvim.dag) entryAnywhere; + + cfg = config.vim.visuals.highlight-undo; +in { + config = mkIf cfg.enable { + vim = { + startPlugins = ["highlight-undo"]; + + pluginRC.highlight-undo = entryAnywhere '' + require("highlight-undo").setup(${toLuaObject cfg.setupOpts}) + ''; + }; + }; +} diff --git a/modules/plugins/visuals/highlight-undo/default.nix b/modules/plugins/visuals/highlight-undo/default.nix new file mode 100644 index 0000000..b862488 --- /dev/null +++ b/modules/plugins/visuals/highlight-undo/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./highlight-undo.nix + ]; +} diff --git a/modules/plugins/visuals/highlight-undo/highlight-undo.nix b/modules/plugins/visuals/highlight-undo/highlight-undo.nix new file mode 100644 index 0000000..fc5d722 --- /dev/null +++ b/modules/plugins/visuals/highlight-undo/highlight-undo.nix @@ -0,0 +1,32 @@ +{lib, ...}: let + inherit (lib.modules) mkRemovedOptionModule; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.types) int; + inherit (lib.nvim.types) mkPluginSetupOption; + + checkDocsMsg = '' + highlight-undo.nvim has deprecated previously used configuration options in + a recent update, so previous values will no longer work as expected. + + Please use `vim.visuals.highlight-undo.setupOpts` with upstream instructions + ''; +in { + imports = [ + # This gives a lot of error messages for those with default values set or modified. Could + # there be a better way to handle his? Perhaps an assertion? + (mkRemovedOptionModule ["vim" "visuals" "highlight-undo" "highlightForCount"] checkDocsMsg) + (mkRemovedOptionModule ["vim" "visuals" "highlight-undo" "undo" "hlGroup"] checkDocsMsg) + (mkRemovedOptionModule ["vim" "visuals" "highlight-undo" "redo" "hlGroup"] checkDocsMsg) + ]; + + options.vim.visuals.highlight-undo = { + enable = mkEnableOption "highlight undo [highlight-undo]"; + setupOpts = mkPluginSetupOption "highlight-undo" { + duration = mkOption { + type = int; + default = 500; + description = "Duration of the highlight"; + }; + }; + }; +} diff --git a/modules/plugins/visuals/indent-blankline/config.nix b/modules/plugins/visuals/indent-blankline/config.nix new file mode 100644 index 0000000..581bd13 --- /dev/null +++ b/modules/plugins/visuals/indent-blankline/config.nix @@ -0,0 +1,21 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.nvim.lua) toLuaObject; + inherit (lib.nvim.dag) entryAnywhere; + + cfg = config.vim.visuals.indent-blankline; +in { + config = mkIf cfg.enable { + vim = { + startPlugins = ["indent-blankline"]; + + pluginRC.indent-blankline = entryAnywhere '' + require("ibl").setup(${toLuaObject cfg.setupOpts}) + ''; + }; + }; +} diff --git a/modules/plugins/visuals/indent-blankline/default.nix b/modules/plugins/visuals/indent-blankline/default.nix new file mode 100644 index 0000000..57ebc6a --- /dev/null +++ b/modules/plugins/visuals/indent-blankline/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./indent-blankline.nix + ]; +} diff --git a/modules/plugins/visuals/indent-blankline/indent-blankline.nix b/modules/plugins/visuals/indent-blankline/indent-blankline.nix new file mode 100644 index 0000000..ff9bccc --- /dev/null +++ b/modules/plugins/visuals/indent-blankline/indent-blankline.nix @@ -0,0 +1,195 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkRenamedOptionModule; + inherit (lib.options) mkOption mkEnableOption literalExpression; + inherit (lib.types) int bool str nullOr either listOf attrsOf; + + cfg = config.vim.visuals; +in { + imports = [ + (mkRenamedOptionModule ["vim" "visuals" "indentBlankline"] ["vim" "visuals" "indent-blankline"]) + ]; + + options.vim.visuals.indent-blankline = { + enable = mkEnableOption "indentation guides [indent-blankline]"; + setupOpts = { + debounce = mkOption { + type = int; + description = "Debounce time in milliseconds"; + default = 200; + }; + + viewport_buffer = { + min = mkOption { + type = int; + description = "Number of lines above and below of what is currently + visible in the window"; + default = 30; + }; + + max = mkOption { + type = int; + description = "Number of lines above and below of what is currently + visible in the window"; + default = 500; + }; + }; + + indent = { + char = mkOption { + type = either str (listOf str); + description = "Character(s) for indentation guide"; + default = "│"; + }; + + tab_char = mkOption { + type = nullOr (either str (listOf str)); + description = '' + Character(s) for tab indentation guide. + + See `:help ibl.config.indent.tab_char`. + ''; + default = null; + }; + + highlight = mkOption { + type = nullOr (either str (listOf str)); + description = '' + The highlight group(s) applied to the indentation guide. + + See `:help ibl.config.indent.highlight`. + ''; + default = null; + }; + + smart_indent_cap = mkOption { + type = bool; + description = "Caps the number of indentation levels based on surrounding code"; + default = true; + }; + + priority = mkOption { + type = int; + description = "Virtual text priority for the indentation guide"; + default = 1; + }; + + repeat_linebreak = mkOption { + type = bool; + description = "Repeat indentation guides on wrapped lines"; + default = true; + }; + }; + + whitespace = { + highlight = mkOption { + type = nullOr (either str (listOf str)); + description = '' + The highlight group(s) applied to whitespace. + + See `:help ibl.config.whitespace.highlight`. + ''; + default = null; + }; + + remove_blankline_trail = mkOption { + type = bool; + description = "Remove trailing whitespace on blanklines"; + default = true; + }; + }; + + scope = { + enabled = mkOption { + description = "Highlight current scope from treesitter"; + type = bool; + default = config.vim.treesitter.enable; + defaultText = literalExpression "config.vim.treesitter.enable"; + }; + + char = mkOption { + type = either str (listOf str); + description = "The character(s) for the scope indentation guide"; + default = cfg.indent-blankline.setupOpts.indent.char; + defaultText = literalExpression "config.vim.visuals.indent-blankline.setupOpts.indent.char"; + }; + + show_start = mkOption { + type = bool; + description = "Show an underline on the first line of the scope"; + default = false; + }; + + show_end = mkOption { + type = bool; + description = "Show an underline on the last line of the scope"; + default = false; + }; + + show_exact_scope = mkOption { + type = bool; + description = "Show the scope underline at the exact start of the scope, even if that's to the right of the indentation guide"; + default = false; + }; + + injected_languages = mkOption { + type = bool; + description = "Check for injected languages (treesitter)"; + default = config.vim.treesitter.enable; + defaultText = literalExpression "config.vim.treesitter.enable"; + }; + + highlight = mkOption { + type = nullOr (either str (listOf str)); + description = '' + The highlight group(s) applied to the scope. + + See `:help `ibl.config.scope.highlight`. + ''; + default = null; + }; + + priority = mkOption { + type = int; + description = "Virtual text priority for the scope"; + default = 1024; + }; + + include.node_type = mkOption { + type = attrsOf (listOf str); + description = "Additional nodes to be used for scope checking, per language"; + default = {}; + }; + + exclude = { + language = mkOption { + type = listOf str; + description = '' + The list of treesitter languages to disable scope for. + + `*` can be used as a wildcard for every language/node type. + ''; + default = []; + }; + + node_type = mkOption { + type = attrsOf (listOf str); + description = '' + Nodes to ignore in scope checking, per language. + + `*` can be used as a wildcard for every language. + ''; + default = { + "*" = ["source_file" "program"]; + lua = ["chunk"]; + python = ["module"]; + }; + }; + }; + }; + }; + }; +} diff --git a/modules/plugins/visuals/nvim-cursorline/config.nix b/modules/plugins/visuals/nvim-cursorline/config.nix new file mode 100644 index 0000000..487c9af --- /dev/null +++ b/modules/plugins/visuals/nvim-cursorline/config.nix @@ -0,0 +1,21 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.nvim.lua) toLuaObject; + inherit (lib.nvim.dag) entryAnywhere; + + cfg = config.vim.visuals.nvim-cursorline; +in { + config = mkIf cfg.enable { + vim = { + startPlugins = ["nvim-cursorline"]; + + pluginRC.nvim-cursorline = entryAnywhere '' + require("nvim-cursorline").setup(${toLuaObject cfg.setupOpts}) + ''; + }; + }; +} diff --git a/modules/plugins/visuals/nvim-cursorline/default.nix b/modules/plugins/visuals/nvim-cursorline/default.nix new file mode 100644 index 0000000..b09014d --- /dev/null +++ b/modules/plugins/visuals/nvim-cursorline/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./nvim-cursorline.nix + ]; +} diff --git a/modules/plugins/visuals/nvim-cursorline/nvim-cursorline.nix b/modules/plugins/visuals/nvim-cursorline/nvim-cursorline.nix new file mode 100644 index 0000000..7e9e124 --- /dev/null +++ b/modules/plugins/visuals/nvim-cursorline/nvim-cursorline.nix @@ -0,0 +1,65 @@ +{lib, ...}: let + inherit (lib.modules) mkRenamedOptionModule mkRemovedOptionModule; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.types) int bool; + inherit (lib.nvim.types) mkPluginSetupOption; +in { + imports = [ + (mkRenamedOptionModule ["vim" "visuals" "cursorline"] ["vim" "visuals" "nvim-cursorline"]) + (mkRenamedOptionModule ["vim" "visuals" "nvim-cursorline" "lineTimeout"] ["vim" "visuals" "nvim-cursorline" "setupOpts" "line_timeout"]) + (mkRemovedOptionModule ["vim" "visuals" "nvim-cursorline" "lineNumbersOnly"] '' + `vim.visuals.nvim-cursorline.lineNumbersOnly` has been removed. Use `vim.visuals.nvim-cursorline.number` instead. + '') + ]; + + options.vim.visuals.nvim-cursorline = { + enable = mkEnableOption "cursor word and line highlighting [nvim-cursorline]"; + + # Upstream has **zero** documentation whatsoever. I'm making wild assumptions + # on what goes into description based don the source code. I'm sorry. Not. + setupOpts = mkPluginSetupOption "nvim-cursorline" { + cursorline = { + enable = mkEnableOption "cursor line highlighting"; + timeout = mkOption { + type = int; + default = 1000; + description = "Cursorline timeout"; + }; + + number = mkOption { + type = bool; + default = false; + description = '' + If true, `vim.wo.cursorlineopt` will be set to "number" + when the trigger conditions are met. + ''; + }; + }; + + cursorword = { + enable = mkEnableOption "cursor word highlighting"; + timeout = mkOption { + type = int; + default = 1000; + description = "Cursorword timeout"; + }; + + min_length = mkOption { + type = int; + default = 3; + description = '' + The min_length option defines the minimum number of characters + a word must have to be highlighted as a "cursor word." Any word + shorter than this value will be ignored and not highlighted. + ''; + }; + + hl.underline = mkOption { + type = bool; + default = true; + description = "Whether to underline matching cursorword"; + }; + }; + }; + }; +} diff --git a/modules/plugins/visuals/nvim-scrollbar/config.nix b/modules/plugins/visuals/nvim-scrollbar/config.nix new file mode 100644 index 0000000..1d0ebc7 --- /dev/null +++ b/modules/plugins/visuals/nvim-scrollbar/config.nix @@ -0,0 +1,21 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.nvim.lua) toLuaObject; + inherit (lib.nvim.dag) entryAnywhere; + + cfg = config.vim.visuals.nvim-scrollbar; +in { + config = mkIf cfg.enable { + vim = { + startPlugins = ["nvim-scrollbar"]; + + pluginRC.cursorline = entryAnywhere '' + require("scrollbar").setup(${toLuaObject cfg.setupOpts}) + ''; + }; + }; +} diff --git a/modules/plugins/visuals/nvim-scrollbar/default.nix b/modules/plugins/visuals/nvim-scrollbar/default.nix new file mode 100644 index 0000000..3341c65 --- /dev/null +++ b/modules/plugins/visuals/nvim-scrollbar/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./scrollbar-nvim.nix + ]; +} diff --git a/modules/plugins/visuals/nvim-scrollbar/scrollbar-nvim.nix b/modules/plugins/visuals/nvim-scrollbar/scrollbar-nvim.nix new file mode 100644 index 0000000..bdf48cb --- /dev/null +++ b/modules/plugins/visuals/nvim-scrollbar/scrollbar-nvim.nix @@ -0,0 +1,21 @@ +{lib, ...}: let + inherit (lib.modules) mkRenamedOptionModule; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.types) listOf str; + inherit (lib.nvim.types) mkPluginSetupOption; +in { + imports = [ + (mkRenamedOptionModule ["vim" "visuals" "scrollBar"] ["vim" "visuals" "nvim-scrollbar"]) + ]; + + options.vim.visuals.nvim-scrollbar = { + enable = mkEnableOption "extensible Neovim Scrollbar [nvim-scrollbar]"; + setupOpts = mkPluginSetupOption "scrollbar-nvim" { + excluded_filetypes = mkOption { + type = listOf str; + default = ["prompt" "TelescopePrompt" "noice" "noice" "NvimTree" "neo-tree" "alpha" "notify" "Navbuddy"]; + description = "Filetypes to hide the scrollbar on"; + }; + }; + }; +} diff --git a/modules/plugins/visuals/nvim-web-devicons/config.nix b/modules/plugins/visuals/nvim-web-devicons/config.nix new file mode 100644 index 0000000..9c8e941 --- /dev/null +++ b/modules/plugins/visuals/nvim-web-devicons/config.nix @@ -0,0 +1,21 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.nvim.lua) toLuaObject; + inherit (lib.nvim.dag) entryAnywhere; + + cfg = config.vim.visuals.nvim-web-devicons; +in { + config = mkIf cfg.enable { + vim = { + startPlugins = ["nvim-web-devicons"]; + + pluginRC.nvim-web-devicons = entryAnywhere '' + require("nvim-web-devicons").setup(${toLuaObject cfg.setupOpts}) + ''; + }; + }; +} diff --git a/modules/plugins/visuals/nvim-web-devicons/default.nix b/modules/plugins/visuals/nvim-web-devicons/default.nix new file mode 100644 index 0000000..57a3dbc --- /dev/null +++ b/modules/plugins/visuals/nvim-web-devicons/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./nvim-web-devicons.nix + ]; +} diff --git a/modules/plugins/visuals/nvim-web-devicons/nvim-web-devicons.nix b/modules/plugins/visuals/nvim-web-devicons/nvim-web-devicons.nix new file mode 100644 index 0000000..7883486 --- /dev/null +++ b/modules/plugins/visuals/nvim-web-devicons/nvim-web-devicons.nix @@ -0,0 +1,48 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkRenamedOptionModule; + inherit (lib.options) mkOption mkEnableOption literalExpression; + inherit (lib.types) nullOr attrsOf attrs enum; + inherit (lib.nvim.types) mkPluginSetupOption; +in { + imports = [ + (mkRenamedOptionModule ["vim" "visuals" "nvimWebDevicons"] ["vim" "visuals" "nvim-web-devicons"]) + ]; + + options.vim.visuals.nvim-web-devicons = { + enable = mkEnableOption "Neovim dev icons [nvim-web-devicons]"; + + setupOpts = mkPluginSetupOption "nvim-web-devicons" { + color_icons = mkEnableOption "different highlight colors per icon"; + variant = mkOption { + type = nullOr (enum ["light" "dark"]); + default = null; + description = "Set the light or dark variant manually, instead of relying on `background`"; + }; + + override = mkOption { + type = attrsOf attrs; + default = {}; + example = literalExpression '' + { + zsh = { + name = "Zsh"; + icon = ""; + color = "#428850"; + cterm_color = "65"; + }; + } + ''; + description = '' + Your personal icon overrides. + + You can specify color or cterm_color instead of specifying + both of them. DevIcon will be appended to `name` + ''; + }; + }; + }; +} diff --git a/modules/plugins/visuals/visuals.nix b/modules/plugins/visuals/visuals.nix deleted file mode 100644 index d3cfac1..0000000 --- a/modules/plugins/visuals/visuals.nix +++ /dev/null @@ -1,261 +0,0 @@ -{ - config, - lib, - ... -}: let - inherit (lib.options) mkEnableOption mkOption literalExpression; - inherit (lib.types) int bool str nullOr either listOf attrsOf; - inherit (lib.nvim.binds) mkMappingOption; - - cfg = config.vim.visuals; -in { - options.vim.visuals = { - enable = mkEnableOption "Visual enhancements."; - - nvimWebDevicons.enable = mkEnableOption "dev icons. Required for certain plugins [nvim-web-devicons]."; - - scrollBar.enable = mkEnableOption "scrollbar [scrollbar.nvim]"; - - smoothScroll.enable = mkEnableOption "smooth scrolling [cinnamon-nvim]"; - - cellularAutomaton = { - enable = mkEnableOption "cellular automaton [cellular-automaton]"; - - mappings = { - makeItRain = mkMappingOption "Make it rain [cellular-automaton]" "fml"; - }; - }; - - cursorline = { - enable = mkEnableOption "line hightlighting on the cursor [nvim-cursorline]"; - - lineTimeout = mkOption { - type = int; - description = "Time in milliseconds for cursorline to appear"; - default = 0; - }; - - lineNumbersOnly = mkOption { - type = bool; - description = "Hightlight only in the presence of line numbers"; - default = true; - }; - }; - - indentBlankline = { - enable = mkEnableOption "indentation guides [indent-blankline]"; - - setupOpts = { - debounce = mkOption { - type = int; - description = "Debounce time in milliseconds"; - default = 200; - }; - - viewport_buffer = { - min = mkOption { - type = int; - description = "Number of lines above and below of what is currently - visible in the window"; - default = 30; - }; - - max = mkOption { - type = int; - description = "Number of lines above and below of what is currently - visible in the window"; - default = 500; - }; - }; - - indent = { - char = mkOption { - type = either str (listOf str); - description = "Character(s) for indentation guide"; - default = "│"; - }; - - tab_char = mkOption { - type = nullOr (either str (listOf str)); - description = '' - Character(s) for tab indentation guide. - - See `:help ibl.config.indent.tab_char`. - ''; - default = null; - }; - - highlight = mkOption { - type = nullOr (either str (listOf str)); - description = '' - The highlight group(s) applied to the indentation guide. - - See `:help ibl.config.indent.highlight`. - ''; - default = null; - }; - - smart_indent_cap = mkOption { - type = bool; - description = "Caps the number of indentation levels based on surrounding code"; - default = true; - }; - - priority = mkOption { - type = int; - description = "Virtual text priority for the indentation guide"; - default = 1; - }; - - repeat_linebreak = mkOption { - type = bool; - description = "Repeat indentation guides on wrapped lines"; - default = true; - }; - }; - - whitespace = { - highlight = mkOption { - type = nullOr (either str (listOf str)); - description = '' - The highlight group(s) applied to whitespace. - - See `:help ibl.config.whitespace.highlight`. - ''; - default = null; - }; - - remove_blankline_trail = mkOption { - type = bool; - description = "Remove trailing whitespace on blanklines"; - default = true; - }; - }; - - scope = { - enabled = mkOption { - description = "Highlight current scope from treesitter"; - type = bool; - default = config.vim.treesitter.enable; - defaultText = literalExpression "config.vim.treesitter.enable"; - }; - - char = mkOption { - type = either str (listOf str); - description = "The character(s) for the scope indentation guide"; - default = cfg.indentBlankline.setupOpts.indent.char; - defaultText = literalExpression "config.vim.visuals.indentBlankline.setuopOpts.indent.char"; - }; - - show_start = mkOption { - type = bool; - description = "Show an underline on the first line of the scope"; - default = false; - }; - - show_end = mkOption { - type = bool; - description = "Show an underline on the last line of the scope"; - default = false; - }; - - show_exact_scope = mkOption { - type = bool; - description = "Show the scope underline at the exact start of the scope, even if that's to the right of the indentation guide"; - default = false; - }; - - injected_languages = mkOption { - type = bool; - description = "Check for injected languages (treesitter)"; - default = config.vim.treesitter.enable; - defaultText = literalExpression "config.vim.treesitter.enable"; - }; - - highlight = mkOption { - type = nullOr (either str (listOf str)); - description = '' - The highlight group(s) applied to the scope. - - See `:help `ibl.config.scope.highlight`. - ''; - default = null; - }; - - priority = mkOption { - type = int; - description = "Virtual text priority for the scope"; - default = 1024; - }; - - include.node_type = mkOption { - type = attrsOf (listOf str); - description = "Additional nodes to be used for scope checking, per language"; - default = {}; - }; - - exclude = { - language = mkOption { - type = listOf str; - description = '' - The list of treesitter languages to disable scope for. - - `*` can be used as a wildcard for every language/node type. - ''; - default = []; - }; - - node_type = mkOption { - type = attrsOf (listOf str); - description = '' - Nodes to ignore in scope checking, per language. - - `*` can be used as a wildcard for every language. - ''; - default = { - "*" = ["source_file" "program"]; - lua = ["chunk"]; - python = ["module"]; - }; - }; - }; - }; - }; - }; - - highlight-undo = { - enable = mkEnableOption "highlight undo [highlight-undo]"; - - highlightForCount = mkOption { - type = bool; - default = true; - description = '' - Enable support for highlighting when a is provided before the key - If set to false it will only highlight when the mapping is not prefixed with a - ''; - }; - - duration = mkOption { - type = int; - description = "Duration of highlight"; - default = 500; - }; - - undo = { - hlGroup = mkOption { - type = str; - description = "Highlight group for undo"; - default = "HighlightUndo"; - }; - }; - - redo = { - hlGroup = mkOption { - type = str; - description = "Highlight group for redo"; - default = "HighlightUndo"; - }; - }; - }; - }; -}