diff --git a/flake.lock b/flake.lock index 4b56f7fa..32103866 100644 --- a/flake.lock +++ b/flake.lock @@ -588,6 +588,22 @@ "type": "github" } }, + "plugin-feline-nvim": { + "flake": false, + "locked": { + "lastModified": 1731467236, + "narHash": "sha256-/TqgHJo2ej/V5bubTdTlf5S+EZmSpU5F2Mdi0SHCD30=", + "owner": "freddiehaddad", + "repo": "feline.nvim", + "rev": "9f1313f61a75ec5ebe805fedd46bdc130c420963", + "type": "github" + }, + "original": { + "owner": "freddiehaddad", + "repo": "feline.nvim", + "type": "github" + } + }, "plugin-fidget-nvim": { "flake": false, "locked": { @@ -2133,6 +2149,7 @@ "plugin-dressing-nvim": "plugin-dressing-nvim", "plugin-elixir-tools": "plugin-elixir-tools", "plugin-fastaction-nvim": "plugin-fastaction-nvim", + "plugin-feline-nvim": "plugin-feline-nvim", "plugin-fidget-nvim": "plugin-fidget-nvim", "plugin-flutter-tools": "plugin-flutter-tools", "plugin-friendly-snippets": "plugin-friendly-snippets", diff --git a/flake.nix b/flake.nix index f5014afe..1bf2e249 100644 --- a/flake.nix +++ b/flake.nix @@ -288,6 +288,12 @@ flake = false; }; + plugin-feline-nvim = { + url = "github:freddiehaddad/feline.nvim"; + flake = false; + }; + + # Completion plugin-nvim-cmp = { url = "github:hrsh7th/nvim-cmp"; flake = false; diff --git a/modules/plugins/statusline/default.nix b/modules/plugins/statusline/default.nix index 4f433985..7c16980e 100644 --- a/modules/plugins/statusline/default.nix +++ b/modules/plugins/statusline/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./feline ./lualine ]; } diff --git a/modules/plugins/statusline/feline/config.nix b/modules/plugins/statusline/feline/config.nix new file mode 100644 index 00000000..ddc5473e --- /dev/null +++ b/modules/plugins/statusline/feline/config.nix @@ -0,0 +1,21 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + + cfg = config.vim.statusline.feline-nvim; +in { + config = mkIf cfg.enable { + vim = { + lazy.plugins.feline-nvim = { + event = "UIEnter"; + + package = "feline-nvim"; + setupModule = "feline"; + inherit (cfg) setupOpts; + }; + }; + }; +} diff --git a/modules/plugins/statusline/feline/default.nix b/modules/plugins/statusline/feline/default.nix new file mode 100644 index 00000000..0ebbb778 --- /dev/null +++ b/modules/plugins/statusline/feline/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./feline.nix + ]; +} diff --git a/modules/plugins/statusline/feline/feline.nix b/modules/plugins/statusline/feline/feline.nix new file mode 100644 index 00000000..e362e5c0 --- /dev/null +++ b/modules/plugins/statusline/feline/feline.nix @@ -0,0 +1,129 @@ +{ + config, + lib, + ... +}: let + inherit (builtins) elem; + inherit (lib.options) mkOption mkEnableOption literalExpression; + inherit (lib.types) str listOf attrsOf anything either submodule; + inherit (lib.lists) optional; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.types) mkPluginSetupOption; + + conditionalRenderers = { + options = { + filetypes = mkOption { + type = listOf str; + default = [ + "^NvimTree$" + "^neo-tree$" + "^startify$" + "^fugitive$" + "^fugitiveblame$" + "^qf$" + "^help$" + ]; + + description = "Filetypes in which to force render inactive statusline"; + }; + + buftypes = mkOption { + type = listOf str; + default = ["^terminal$"]; + description = "Buffer types in which to force render inactive statusline"; + }; + + bufnames = mkOption { + type = listOf str; + default = []; + description = "Buffer names in which to force render inactive statusline"; + }; + }; + }; +in { + options.vim.statusline.feline-nvim = { + enable = mkEnableOption "minimal, stylish and customizable statusline, statuscolumn, and winbar [feline.nvim]"; + setupOpts = mkPluginSetupOption "feline-nvim" { + custom_providers = mkOption { + type = attrsOf anything; + default = {}; + example = literalExpression '' + { + window_number = mkLuaInline '''' + function() + return tostring(vim.api.nvim_win_get_number(0)) + end + ''''; + } + ''; + + description = "User-defined feline provider functions"; + }; + + theme = mkOption { + type = either str (attrsOf str); + default = {}; + example = { + fg = "#fff"; + bg = "#111"; + }; + description = '' + Either a string containing the color theme name or an attribute set of + strings, containing the colors. + + The theme’s `fg` and `bg` values also represent the default foreground + and background colors, respectively. + ''; + }; + + separators = mkOption { + type = listOf str; + default = []; + example = ["slant_right_2"]; + description = '' + A table containing custom Feline separator prests. + + :::{.warning} + This option is not type-checked! Before setting this option, please take + a look at {command}`:help feline-separator-preset` for a list of + available separator presets. + ::: + ''; + }; + + force_inactive = mkOption { + default = {}; + type = attrsOf (submodule conditionalRenderers); + description = '' + A table that determines which buffers should always have the inactive + statusline, even when they are active. + ''; + }; + + disable = mkOption { + default = {}; + type = attrsOf (submodule conditionalRenderers); + description = '' + A table that determines which buffers should always have the statusline + disabled, even when they are active. + ''; + }; + + vi_mode_colors = mkOption { + type = attrsOf str; + default = {}; + description = '' + Attribute set containing colors associated with specific Vi modes. + + It can later be used to get the color associated with the current Vim + mode using `require('feline.providers.vi_mode').get_mode_color()`. + + See `:help feline-vi-mode` for more details on vi mode. + + + + ''; + }; + }; + }; +}