From f3dc0dcd4c0c75ae46ea8d6bccd715c5107f22fd Mon Sep 17 00:00:00 2001 From: Camille Dejoye Date: Wed, 13 Apr 2022 06:58:31 +0200 Subject: [PATCH] feat(themes): add automatic theme for nvim-base16 colorschemes(#597) --- THEMES.md | 12 +++++ lua/lualine/themes/auto.lua | 5 ++ lua/lualine/themes/base16.lua | 92 +++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 lua/lualine/themes/base16.lua diff --git a/THEMES.md b/THEMES.md index 917b517..6b4b0ea 100644 --- a/THEMES.md +++ b/THEMES.md @@ -46,6 +46,18 @@ load ayu_light when background=light and ayu_dark when background=dark But if `g:ayuprefermirage` exists, it will load ayu_mirage instead when `background=dark`. +### base16 + +This theme will automatically uses colors defined by your colorscheme using [RRethy/nvim-base16](https://github.com/RRethy/nvim-base16)] plugin. +The following example is using the `tomorrow-night` colorscheme: + +

+ + + + +

+ ### codedark

diff --git a/lua/lualine/themes/auto.lua b/lua/lualine/themes/auto.lua index 0870d79..256c2ec 100644 --- a/lua/lualine/themes/auto.lua +++ b/lua/lualine/themes/auto.lua @@ -5,6 +5,11 @@ local loader = require('lualine.utils.loader') local color_name = vim.g.colors_name if color_name then + -- All base16 colorschemes share the same theme + if 'base16' == color_name:sub(1, 6) then + color_name = 'base16' + end + -- Check if there's a theme for current colorscheme -- If there is load that instead of genarating a new one local ok, theme = pcall(loader.load_theme, color_name) diff --git a/lua/lualine/themes/base16.lua b/lua/lualine/themes/base16.lua new file mode 100644 index 0000000..2f1b86d --- /dev/null +++ b/lua/lualine/themes/base16.lua @@ -0,0 +1,92 @@ +local modules = require('lualine_require').lazy_require({ notices = 'lualine.utils.notices' }) + +local function add_notice(notice) + modules.notices.add_notice('theme(base16): ' .. notice) +end + +local function setup(colors) + local theme = { + normal = { + a = { fg = colors.bg, bg = colors.normal }, + b = { fg = colors.light_fg, bg = colors.alt_bg }, + c = { fg = colors.fg, bg = colors.bg }, + }, + replace = { + a = { fg = colors.bg, bg = colors.replace }, + b = { fg = colors.light_fg, bg = colors.alt_bg }, + }, + insert = { + a = { fg = colors.bg, bg = colors.insert }, + b = { fg = colors.light_fg, bg = colors.alt_bg }, + }, + visual = { + a = { fg = colors.bg, bg = colors.visual }, + b = { fg = colors.light_fg, bg = colors.alt_bg }, + }, + inactive = { + a = { fg = colors.dark_fg, bg = colors.bg }, + b = { fg = colors.dark_fg, bg = colors.bg }, + c = { fg = colors.dark_fg, bg = colors.bg }, + }, + } + + theme.command = theme.normal + theme.terminal = theme.insert + + return theme +end + +local function setup_default() + return setup { + bg = '#282a2e', + alt_bg = '#373b41', + dark_fg = '#969896', + fg = '#b4b7b4', + light_fg = '#c5c8c6', + normal = '#81a2be', + insert = '#b5bd68', + visual = '#b294bb', + replace = '#de935f', + } +end + +local function setup_base16() + local loaded, base16 = pcall(require, 'base16-colorscheme') + + if not loaded then + add_notice( + 'nvim-base16 is not currently present in your runtimepath, make sure it is properly installed,' + .. ' fallback to default colors.' + ) + + return nil + end + + if not base16.colors and not vim.env.BASE16_THEME then + add_notice( + 'nvim-base16 is not loaded yet, you should update your configuration to load it before lualine' + .. ' so that the colors from your colorscheme can be used, fallback to "tomorrow-night" theme.' + ) + elseif not base16.colors and not base16.colorschemes[vim.env.BASE16_THEME] then + add_notice( + 'The colorscheme "%s" defined by the environment variable "BASE16_THEME" is not handled by' + .. ' nvim-base16, fallback to "tomorrow-night" theme.' + ) + end + + local colors = base16.colors or base16.colorschemes[vim.env.BASE16_THEME or 'tomorrow-night'] + + return setup { + bg = colors.base01, + alt_bg = colors.base02, + dark_fg = colors.base03, + fg = colors.base04, + light_fg = colors.base05, + normal = colors.base0D, + insert = colors.base0B, + visual = colors.base0E, + replace = colors.base09, + } +end + +return setup_base16() or setup_default()