diff --git a/docs/release-notes/rl-0.7.md b/docs/release-notes/rl-0.7.md index a770952a..487fad51 100644 --- a/docs/release-notes/rl-0.7.md +++ b/docs/release-notes/rl-0.7.md @@ -229,3 +229,8 @@ everyone. - Add LSP and Treesitter support for R under `vim.languages.R`. - Add Otter support under `vim.lsp.otter` and an assert to prevent conflict with ccc + +[Bloxx12](https://github.com/Bloxx12) + +- Add support for [base16 theming](https://github.com/RRethy/base16-nvim) under + `vim.theme` diff --git a/flake.lock b/flake.lock index ecc02f27..c7447b47 100644 --- a/flake.lock +++ b/flake.lock @@ -172,6 +172,22 @@ "type": "github" } }, + "plugin-base16": { + "flake": false, + "locked": { + "lastModified": 1716483968, + "narHash": "sha256-GRF/6AobXHamw8TZ3FjL7SI6ulcpwpcohsIuZeCSh2A=", + "owner": "rrethy", + "repo": "base16-nvim", + "rev": "6ac181b5733518040a33017dde654059cd771b7c", + "type": "github" + }, + "original": { + "owner": "rrethy", + "repo": "base16-nvim", + "type": "github" + } + }, "plugin-bufdelete-nvim": { "flake": false, "locked": { @@ -1802,6 +1818,7 @@ "nixpkgs": "nixpkgs", "nmd": "nmd", "plugin-alpha-nvim": "plugin-alpha-nvim", + "plugin-base16": "plugin-base16", "plugin-bufdelete-nvim": "plugin-bufdelete-nvim", "plugin-catppuccin": "plugin-catppuccin", "plugin-ccc": "plugin-ccc", diff --git a/flake.nix b/flake.nix index 987e3e59..c4a1a2a8 100644 --- a/flake.nix +++ b/flake.nix @@ -349,6 +349,11 @@ }; # Themes + plugin-base16 = { + url = "github:rrethy/base16-nvim"; + flake = false; + }; + plugin-tokyonight = { url = "github:folke/tokyonight.nvim"; flake = false; diff --git a/lib/types/default.nix b/lib/types/default.nix index 6751229c..70ca6bef 100644 --- a/lib/types/default.nix +++ b/lib/types/default.nix @@ -6,10 +6,10 @@ typesDag = import ./dag.nix {inherit lib;}; typesPlugin = import ./plugins.nix {inherit inputs lib;}; typesLanguage = import ./languages.nix {inherit lib;}; - typesCustom = import ./custom.nix {inherit lib;}; + typesTypes = import ./types.nix {inherit lib;}; in { inherit (typesDag) dagOf; inherit (typesPlugin) pluginsOpt extraPluginType mkPluginSetupOption luaInline pluginType borderType; inherit (typesLanguage) diagnostics mkGrammarOption; - inherit (typesCustom) anythingConcatLists char; + inherit (typesTypes) anythingConcatLists char hexColor; } diff --git a/lib/types/custom.nix b/lib/types/types.nix similarity index 90% rename from lib/types/custom.nix rename to lib/types/types.nix index a94735c5..250d7636 100644 --- a/lib/types/custom.nix +++ b/lib/types/types.nix @@ -1,8 +1,9 @@ {lib}: let inherit (lib) isStringLike showOption showFiles getFiles mergeOneOption mergeEqualOption mkOptionType; + inherit (lib.strings) isString; inherit (lib.types) anything attrsOf; inherit (lib.nvim.types) anythingConcatLists; - inherit (builtins) typeOf isAttrs any head concatLists stringLength; + inherit (builtins) typeOf isAttrs any head concatLists stringLength match; in { # HACK: Does this break anything in our case? # A modified version of the nixpkgs anything type that concatenates lists @@ -58,4 +59,11 @@ in { check = value: stringLength value < 2; merge = mergeEqualOption; }; + + hexColor = mkOptionType { + name = "hex-color"; + descriptionClass = "noun"; + description = "RGB color in hex format"; + check = v: isString v && (match "#?[0-9a-fA-F]{6}" v) != null; + }; } diff --git a/modules/plugins/theme/supported-themes.nix b/modules/plugins/theme/supported-themes.nix index 63335e41..27951750 100644 --- a/modules/plugins/theme/supported-themes.nix +++ b/modules/plugins/theme/supported-themes.nix @@ -4,7 +4,14 @@ }: let inherit (lib.strings) optionalString; inherit (lib.trivial) boolToString warnIf; + inherit (lib.nvim.lua) toLuaObject; in { + base16 = { + setup = {base16-colors, ...}: '' + -- Base16 theme + require('base16-colorscheme').setup(${toLuaObject base16-colors}) + ''; + }; onedark = { setup = {style ? "dark", ...}: '' -- OneDark theme @@ -20,6 +27,7 @@ in { setup = { style ? "night", transparent, + ... }: '' require('tokyonight').setup { transparent = ${boolToString transparent}; @@ -42,6 +50,7 @@ in { setup = { style ? "mocha", transparent ? false, + ... }: '' -- Catppuccin theme require('catppuccin').setup { diff --git a/modules/plugins/theme/theme.nix b/modules/plugins/theme/theme.nix index 85f8430f..95d15d40 100644 --- a/modules/plugins/theme/theme.nix +++ b/modules/plugins/theme/theme.nix @@ -4,32 +4,51 @@ ... }: let inherit (lib.options) mkOption; - inherit (lib.attrsets) attrNames; + inherit (lib.attrsets) attrNames listToAttrs; + inherit (lib.strings) hasPrefix; inherit (lib.types) bool lines enum; inherit (lib.modules) mkIf; inherit (lib.nvim.dag) entryBefore; + inherit (lib.nvim.types) hexColor; cfg = config.vim.theme; supportedThemes = import ./supported-themes.nix { inherit lib config; }; + + numbers = ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F"]; + base16Options = listToAttrs (map (n: { + name = "base0${n}"; + value = mkOption { + description = "The base0${n} color to use"; + type = hexColor; + apply = v: + if hasPrefix "#" v + then v + else "#${v}"; + }; + }) + numbers); in { options.vim.theme = { enable = mkOption { type = bool; description = "Enable theming"; }; - name = mkOption { type = enum (attrNames supportedThemes); - description = "Supported themes can be found in `supportedThemes.nix`"; + description = '' + Supported themes can be found in {file}`supportedThemes.nix`. + Setting the theme to "base16" enables base16 theming and + requires all of the colors in {option}`vim.theme.base16-colors` to be set. + ''; }; + base16-colors = base16Options; style = mkOption { type = enum supportedThemes.${cfg.name}.styles; description = "Specific style for theme if it supports it"; }; - transparent = mkOption { type = bool; default = false; @@ -47,7 +66,7 @@ in { startPlugins = [cfg.name]; luaConfigRC.theme = entryBefore ["pluginConfigs"] '' ${cfg.extraConfig} - ${supportedThemes.${cfg.name}.setup {inherit (cfg) style transparent;}} + ${supportedThemes.${cfg.name}.setup {inherit (cfg) style transparent base16-colors;}} ''; }; };