diff --git a/lua/catppuccin/command.lua b/lua/catppuccin/command.lua new file mode 100644 index 0000000..e69de29 diff --git a/lua/catppuccin/config.lua b/lua/catppuccin/config.lua index 817559d..f851929 100644 --- a/lua/catppuccin/config.lua +++ b/lua/catppuccin/config.lua @@ -4,6 +4,11 @@ local config = {} config.options = { transparent_background = false, term_colors = false, + compile = { + enable = false, + path = vim.fn.stdpath "cache" .. "/catppuccin", + suffix = "_compiled" + }, dim_inactive = { enable = false, shade = "dark", diff --git a/lua/catppuccin/main.lua b/lua/catppuccin/main.lua index 0f96ba7..bcac01a 100644 --- a/lua/catppuccin/main.lua +++ b/lua/catppuccin/main.lua @@ -1,6 +1,5 @@ local M = {} -local utils = require("catppuccin.utils.util") local flavours = {"latte", "frappe", "macchiato", "mocha"} function M.cli_flavour_completion() @@ -14,8 +13,20 @@ local function load() catppuccin.before_loading() end + local config = require("catppuccin.config").options + if config.compile.enable == true then + local compiled_path = config.compile.path .. (vim.loop.os_uname().sysname == 'Windows' and "\\" or "/") .. vim.g.catppuccin_flavour .. config.compile.suffix .. ".lua" + local f = io.open(compiled_path, "r") + if f ~= nil then + io.close(f) + vim.cmd("luafile " .. compiled_path) + vim.api.nvim_exec_autocmds("User", { pattern = "CatppuccinLoaded" }) + return + end + end -- colorscheme gets evaluated from mapper.lua local theme = require("catppuccin.core.mapper").apply() + local utils = require("catppuccin.utils.util") utils.load(theme) if catppuccin.after_loading ~= nil then diff --git a/lua/catppuccin/utils/util.lua b/lua/catppuccin/utils/util.lua index be3e05b..52a41ee 100644 --- a/lua/catppuccin/utils/util.lua +++ b/lua/catppuccin/utils/util.lua @@ -99,4 +99,79 @@ function util.load(theme) end end +-- Credit: https://github.com/EdenEast/nightfox.nvim +local fmt = string.format +local function inspect(t) + local list = {} + for k, v in pairs(t) do + local q = type(v) == "string" and [["]] or "" + table.insert(list, fmt([[%s = %s%s%s]], k, q, v, q)) + end + + table.sort(list) + return fmt([[{ %s }]], table.concat(list, ", ")) +end + +function util.compile() + if vim.fn.has "nvim-0.7" == 0 then + print "Compiling requires neovim 0.7" + end + local theme = require("catppuccin.core.mapper").apply() + local lines = { [[ +-- This file is autogenerated by CATPPUCCIN. +-- Do not make changes directly to this file. + +vim.cmd("hi clear") +if vim.fn.exists("syntax_on") then + vim.cmd("syntax reset") +end +vim.g.colors_name = "catppuccin"]] } + local config = require("catppuccin.config").options + local custom_highlights = config.custom_highlights + for property, value in pairs(theme.properties) do + table.insert(lines, fmt("vim.o.%s = %s", property, value)) + end + local tbl = vim.tbl_deep_extend("keep", theme.integrations, theme.base) + tbl = vim.tbl_deep_extend("keep", custom_highlights, tbl) + + for group, color in pairs(tbl) do + if color.link then + table.insert(lines, fmt([[vim.api.nvim_set_hl(0, "%s", { link = "%s" })]], group, color.link)) + else + if color.style then + if color.style ~= "NONE" then + if type(color.style) == "table" then + for _, style in ipairs(color.style) do + color[style] = true + end + else + color[color.style] = true + end + end + end + + color.style = nil + vim.api.nvim_set_hl(0, group, color) + table.insert(lines, fmt([[vim.api.nvim_set_hl(0, "%s", %s)]], group, inspect(color))) + end + end + + if config.term_colors then + local colors = { "overlay0", "red", "green", "yellow", "blue", "pink", "sky", "text", "overlay1", "red", "green", "yellow", "blue", "pink", "sky", "text"} + for i = 0, 15 do + table.insert(lines, fmt('vim.g.terminal_color_%d = "%s"', i, theme.terminal[colors[i + 1]])) + end + end + os.execute(string.format("mkdir %s %s", vim.loop.os_uname().sysname == 'Windows' and "" or "-p", config.compile.path)) + local file = io.open(config.compile.path .. (vim.loop.os_uname().sysname == 'Windows' and "\\" or "/") .. vim.g.catppuccin_flavour .. config.compile.suffix .. ".lua", "w") + file:write(table.concat(lines, "\n")) + file:close() +end + +function util.clean() + local config = require("catppuccin.config").options + local compiled_path = config.compile.path .. (vim.loop.os_uname().sysname == 'Windows' and "\\" or "/") .. vim.g.catppuccin_flavour .. config.compile.suffix .. ".lua" + os.remove(compiled_path) +end + return util diff --git a/plugin/catppuccin.vim b/plugin/catppuccin.vim index 141b212..7395b6b 100644 --- a/plugin/catppuccin.vim +++ b/plugin/catppuccin.vim @@ -10,5 +10,7 @@ function! s:ApplyFlavour(args) abort endfunction command! -nargs=1 -complete=custom,s:FlavourCompletion Catppuccin call s:ApplyFlavour([]) +command! CatppuccinCompile lua require("catppuccin.utils.util").compile() +command! CatppuccinClean lua require("catppuccin.utils.util").clean() let g:loaded_catppuccin = 1