diff --git a/plugins/colorschemes/catppuccin.nix b/plugins/colorschemes/catppuccin.nix new file mode 100644 index 00000000..bf79040d --- /dev/null +++ b/plugins/colorschemes/catppuccin.nix @@ -0,0 +1,352 @@ +{ + pkgs, + config, + lib, + ... +} @ args: +with lib; let + cfg = config.colorschemes.catppuccin; + helpers = import ../helpers.nix args; +in { + options = { + colorschemes.catppuccin = { + enable = mkEnableOption "catppuccin"; + + package = + helpers.mkPackageOption "catppuccin" pkgs.vimPlugins.catppuccin-nvim; + + flavour = helpers.defaultNullOpts.mkEnumFirstDefault [ + "latte" + "mocha" + "frappe" + "macchiato" + ] "Theme flavour"; + + background = let + mkBackgroundStyle = name: + helpers.defaultNullOpts.mkEnumFirstDefault [ + "latte" + "mocha" + "frappe" + "macchiato" + ] "Background for ${name}"; + in { + light = mkBackgroundStyle "light"; + dark = mkBackgroundStyle "dark"; + }; + + terminalColors = + helpers.defaultNullOpts.mkBool false + "Configure the colors used when opening a :terminal in Neovim"; + + transparentBackground = + helpers.defaultNullOpts.mkBool false "Enable Transparent background"; + + showBufferEnd = + helpers.defaultNullOpts.mkBool false + "show the '~' characters after the end of buffers"; + + dimInactive = { + enabled = + helpers.defaultNullOpts.mkBool false + "if true, dims the background color of inactive window or buffer or split"; + + shade = + helpers.defaultNullOpts.mkStr "dark" + "sets the shade to apply to the inactive split or window or buffer"; + + percentage = + helpers.defaultNullOpts.mkNullable (types.numbers.between 0.0 1.0) + "0.15" + "percentage of the shade to apply to the inactive window, split or buffer"; + }; + + disableItalic = helpers.defaultNullOpts.mkBool false "Force no italic"; + + disableBold = helpers.defaultNullOpts.mkBool false "Force no bold"; + + styles = { + comments = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''[ "italic" ]'' "Define comments highlight properties"; + + conditionals = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''[ 'italic" ]'' "Define conditionals highlight properties"; + + loops = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" + "Define loops highlight properties"; + + functions = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" + "Define functions highlight properties"; + + keywords = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" + "Define keywords highlight properties"; + + strings = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" + "Define strings highlight properties"; + + variables = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" + "Define variables highlight properties"; + + numbers = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" + "Define numbers highlight properties"; + + booleans = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" + "Define booleans highlight properties"; + + properties = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" + "Define properties highlight properties"; + + types = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" + "Define types highlight properties"; + + operators = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" + "Define operators highlight properties"; + }; + + colorOverrides = helpers.defaultNullOpts.mkNullable (types.attrsOf types.str) "{}" '' + Define color overrides + Example: + color_overrides = { + all = { + text = "#ffffff", + }, + latte = { + base = "#ff0000", + mantle = "#242424", + crust = "#474747", + }, + frappe = {}, + macchiato = {}, + mocha = {}, + } + ''; + + customHighlights = + helpers.defaultNullOpts.mkNullable + (with types; either str (attrsOf attrs)) "" '' + Override specific highlight groups to use other groups or a hex color + Example: + function(colors) + return { + Comment = { fg = colors.flamingo }, + ["@constant.builtin"] = { fg = colors.peach, style = {} }, + ["@comment"] = { fg = colors.surface2, style = { "italic" } }, + } + end + ''; + + integrations = { + aerial = helpers.defaultNullOpts.mkBool false ""; + + barbar = helpers.defaultNullOpts.mkBool config.plugins.barbar.enable ""; + + beacon = helpers.defaultNullOpts.mkBool false ""; + + cmp = helpers.defaultNullOpts.mkBool config.plugins.nvim-cmp.enable ""; + + coc_nvim = helpers.defaultNullOpts.mkBool false ""; + + dashboard = + helpers.defaultNullOpts.mkBool config.plugins.dashboard.enable ""; + + fern = helpers.defaultNullOpts.mkBool false ""; + + fidget = helpers.defaultNullOpts.mkBool false ""; + + gitgutter = + helpers.defaultNullOpts.mkBool config.plugins.gitgutter.enable ""; + + gitsigns = + helpers.defaultNullOpts.mkBool config.plugins.gitsigns.enable ""; + + harpoon = + helpers.defaultNullOpts.mkBool config.plugins.harpoon.enable ""; + + headlines = helpers.defaultNullOpts.mkBool false ""; + + hop = helpers.defaultNullOpts.mkBool false ""; + + illuminate = helpers.defaultNullOpts.mkBool false ""; + + leap = helpers.defaultNullOpts.mkBool false ""; + + lightspeed = helpers.defaultNullOpts.mkBool false ""; + + lsp_saga = + helpers.defaultNullOpts.mkBool config.plugins.lspsaga.enable ""; + + lsp_trouble = + helpers.defaultNullOpts.mkBool config.plugins.trouble.enable ""; + + markdown = helpers.defaultNullOpts.mkBool false ""; + + mason = helpers.defaultNullOpts.mkBool false ""; + + mini = helpers.defaultNullOpts.mkBool false ""; + + neogit = helpers.defaultNullOpts.mkBool config.plugins.neogit.enable ""; + + neotest = helpers.defaultNullOpts.mkBool false ""; + + neotree = + helpers.defaultNullOpts.mkBool config.plugins.neo-tree.enable ""; + + noice = helpers.defaultNullOpts.mkBool config.plugins.noice.enable ""; + + notify = helpers.defaultNullOpts.mkBool config.plugins.notify.enable ""; + + nvimtree = + helpers.defaultNullOpts.mkBool config.plugins.nvim-tree.enable ""; + + octo = helpers.defaultNullOpts.mkBool false ""; + + overseer = helpers.defaultNullOpts.mkBool false ""; + + pounce = helpers.defaultNullOpts.mkBool false ""; + + sandwich = helpers.defaultNullOpts.mkBool false ""; + + semantic_tokens = helpers.defaultNullOpts.mkBool false ""; + + symbols_outline = helpers.defaultNullOpts.mkBool false ""; + + telekasten = helpers.defaultNullOpts.mkBool false ""; + + telescope = + helpers.defaultNullOpts.mkBool config.plugins.telescope.enable ""; + + treesitter = + helpers.defaultNullOpts.mkBool config.plugins.treesitter.enable ""; + + treesitter_context = + helpers.defaultNullOpts.mkBool config.plugins.treesitter.enable ""; + + ts_rainbow = + helpers.defaultNullOpts.mkBool + config.plugins.treesitter-rainbow.enable ""; + + ts_rainbow2 = helpers.defaultNullOpts.mkBool false ""; + + vim_sneak = helpers.defaultNullOpts.mkBool false ""; + + vimwiki = helpers.defaultNullOpts.mkBool false ""; + + which_key = + helpers.defaultNullOpts.mkBool config.plugins.which-key.enable ""; + + barbecue = { + dim_dirname = helpers.defaultNullOpts.mkBool true ""; + + bold_basename = helpers.defaultNullOpts.mkBool true ""; + + dim_context = helpers.defaultNullOpts.mkBool false ""; + + alt_background = helpers.defaultNullOpts.mkBool false ""; + }; + + dap = { + enabled = helpers.defaultNullOpts.mkBool false ""; + + enable_ui = helpers.defaultNullOpts.mkBool false ""; + }; + indent_blankline = { + enabled = + helpers.defaultNullOpts.mkBool + config.plugins.indent-blankline.enable ""; + + colored_indent_levels = helpers.defaultNullOpts.mkBool false ""; + }; + + native_lsp = { + enabled = helpers.defaultNullOpts.mkBool config.plugins.lsp.enable ""; + + virtual_text = { + errors = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''[ "italic" ]'' ""; + + hints = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''[ "italic" ]'' ""; + + warnings = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''[ "italic" ]'' ""; + + information = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''[ "italic" ]'' ""; + }; + + underlines = { + errors = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''[ "underline" ]'' ""; + + hints = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''[ "underline" ]'' ""; + + warnings = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''[ "underline" ]'' ""; + + information = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''[ "underline" ]'' ""; + }; + }; + + navic = { + enabled = helpers.defaultNullOpts.mkBool false ""; + + custom_bg = helpers.defaultNullOpts.mkStr "NONE" ""; + }; + }; + }; + }; + config = mkIf cfg.enable { + colorscheme = "catppuccin"; + extraPlugins = [cfg.package]; + options = {termguicolors = true;}; + extraConfigLuaPre = let + setupOptions = with cfg; { + inherit (cfg) flavour background styles integrations; + transparent_background = transparentBackground; + show_end_of_buffer = showBufferEnd; + term_colors = terminalColors; + dim_inactive = dimInactive; + no_italic = disableItalic; + no_bold = disableBold; + color_overrides = colorOverrides; + custom_highlights = + helpers.ifNonNull' cfg.customHighlights + ( + if isString customHighlights + then helpers.mkRaw customHighlights + else + helpers.mkRaw '' + function(colors) + return + ${helpers.toLuaObject customHighlights} + end + '' + ); + }; + in '' + require("catppuccin").setup(${helpers.toLuaObject setupOptions}) + ''; + }; +} diff --git a/plugins/default.nix b/plugins/default.nix index 49462a9f..255daf8c 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -10,6 +10,7 @@ ./colorschemes/onedark.nix ./colorschemes/poimandres.nix ./colorschemes/tokyonight.nix + ./colorschemes/catppuccin.nix ./completion/coq.nix ./completion/coq-thirdparty.nix diff --git a/tests/test-sources/plugins/colorschemes/catppuccin.nix b/tests/test-sources/plugins/colorschemes/catppuccin.nix new file mode 100644 index 00000000..d1359db7 --- /dev/null +++ b/tests/test-sources/plugins/colorschemes/catppuccin.nix @@ -0,0 +1,50 @@ +{ + # Empty configuration + empty = {colorschemes.catppuccin.enable = true;}; + + # All the upstream default options of poimandres + defaults = { + colorschemes.catppuccin = { + enable = true; + flavour = "mocha"; + background = { + light = "latte"; + dark = "mocha"; + }; + transparentBackground = false; + terminalColors = true; + showBufferEnd = false; + dimInactive = { + enabled = true; + shade = "dark"; + percentage = 0.15; + }; + disableItalic = true; + disableBold = true; + styles = { + comments = ["italic"]; + conditionals = ["italic"]; + loops = []; + functions = []; + keywords = []; + strings = []; + variables = []; + numbers = []; + booleans = []; + properties = []; + types = []; + operators = []; + }; + colorOverrides = {}; + customHighlights = {}; + integrations = { + cmp = true; + gitsigns = true; + nvimtree = true; + telescope = true; + notify = false; + mini = false; + }; + }; + }; +}