This port of Catppuccin is special because it was the first one and the one that originated the project itself. Given this, it's important to acknowledge that it all didn't come to be what it is now out of nowhere. So, if you are interested in knowing more about the initial stages of the theme, you can find it under the v0.1 tag.
Previews
Features
- Supports both Vim and Neovim (requires neovim >= 0.8 or vim >= 9 compiled with lua >= 5.1)
- Highly configurable with 4 different flavours and the ability to create your own!
- Compiled configuration for fast startup time
- Integrations with lsp, treesitter and a bunch of plugins
- Support for many other applications
Installation
{ "catppuccin/nvim", name = "catppuccin", priority = 1000 }add({ source = "catppuccin/nvim", name = "catppuccin" })
use { "catppuccin/nvim", as = "catppuccin" }
Plug 'catppuccin/nvim', { 'as': 'catppuccin' }
Usage
colorscheme catppuccin " catppuccin-latte, catppuccin-frappe, catppuccin-macchiato, catppuccin-mocha
vim.cmd.colorscheme "catppuccin"
Configuration
There is no need to call setup if you don't want to change the default options and settings.
require("catppuccin").setup({ flavour = "auto", -- latte, frappe, macchiato, mocha background = { -- :h background light = "latte", dark = "mocha", }, transparent_background = false, -- disables setting the background color. float = { transparent = false, -- enable transparent floating windows solid = false, -- use solid styling for floating windows, see |winborder| }, show_end_of_buffer = false, -- shows the '~' characters after the end of buffers term_colors = false, -- sets terminal colors (e.g. `g:terminal_color_0`) dim_inactive = { enabled = false, -- dims the background color of inactive window shade = "dark", percentage = 0.15, -- percentage of the shade to apply to the inactive window }, no_italic = false, -- Force no italic no_bold = false, -- Force no bold no_underline = false, -- Force no underline styles = { -- Handles the styles of general hi groups (see `:h highlight-args`): comments = { "italic" }, -- Change the style of comments conditionals = { "italic" }, loops = {}, functions = {}, keywords = {}, strings = {}, variables = {}, numbers = {}, booleans = {}, properties = {}, types = {}, operators = {}, -- miscs = {}, -- Uncomment to turn off hard-coded styles }, lsp_styles = { -- Handles the style of specific lsp hl groups (see `:h lsp-highlight`). virtual_text = { errors = { "italic" }, hints = { "italic" }, warnings = { "italic" }, information = { "italic" }, ok = { "italic" }, }, underlines = { errors = { "underline" }, hints = { "underline" }, warnings = { "underline" }, information = { "underline" }, ok = { "underline" }, }, inlay_hints = { background = true, }, }, color_overrides = {}, custom_highlights = {}, default_integrations = true, auto_integrations = false, integrations = { cmp = true, gitsigns = true, nvimtree = true, notify = false, mini = { enabled = true, indentscope_color = "", }, -- For more plugins integrations please scroll down (https://github.com/catppuccin/nvim#integrations) }, }) -- setup must be called before loading vim.cmd.colorscheme "catppuccin"
Customization
Getting colors
local latte = require("catppuccin.palettes").get_palette "latte" local frappe = require("catppuccin.palettes").get_palette "frappe" local macchiato = require("catppuccin.palettes").get_palette "macchiato" local mocha = require("catppuccin.palettes").get_palette "mocha"
Returns a table where the key is the name of the color and the value is the hex code.
Overwriting colors
Colors can be overwritten using color_overrides, see #323 for inspiration:
require("catppuccin").setup { color_overrides = { all = { text = "#ffffff", }, latte = { base = "#ff0000", mantle = "#242424", crust = "#474747", }, frappe = {}, macchiato = {}, mocha = {}, } }
Overwriting highlight groups
Global highlight groups can be overwritten, for example:
require("catppuccin").setup { custom_highlights = function(colors) return { Comment = { fg = colors.flamingo }, TabLineSel = { bg = colors.pink }, CmpBorder = { fg = colors.surface2 }, Pmenu = { bg = colors.none }, } end }
Highlight groups per flavour can also be overwritten, for example:
require("catppuccin").setup { highlight_overrides = { all = function(colors) return { NvimTreeNormal = { fg = colors.none }, CmpBorder = { fg = "#3e4145" }, } end, latte = function(latte) return { Normal = { fg = latte.base }, } end, frappe = function(frappe) return { ["@comment"] = { fg = frappe.surface2, style = { "italic" } }, } end, macchiato = function(macchiato) return { LineNr = { fg = macchiato.overlay1 }, } end, mocha = function(mocha) return { Comment = { fg = mocha.flamingo }, } end, }, }
Integrations
Catppuccin provides theme support for other plugins in the Neovim ecosystem and extended Neovim functionality through integrations.
To enable/disable an integration you just need to set it to true/false, for example:
require("catppuccin").setup({ integrations = { cmp = true, gitsigns = true, nvimtree = true, notify = false, mini = { enabled = true, indentscope_color = "", }, } })
Some integrations are enabled by default, you can control this behaviour with default_integrations option.
require("catppuccin").setup({ default_integrations = false, })
If you use lazy.nvim as your package manager, you can use the auto_integrations option to let catppuccin automatically detect installed plugins and enable their respective integrations.
require("catppuccin").setup({ auto_integrations = true, })
Below is a list of supported plugins and their corresponding integration module.
| Plugin | Default |
| aerial.nvim |
aerial = false |
| alpha-nvim |
alpha = true |
| barbar.nvim |
barbar = false |
| barbecue.nvim |
barbecue = { dim_dirname = true, -- directory name is dimmed by default bold_basename = true, dim_context = false, alt_background = false, }, SpecialUse this to set it up: require("barbecue").setup { theme = "catppuccin", -- catppuccin-latte, catppuccin-frappe, catppuccin-macchiato, catppuccin-mocha } |
| beacon.nvim |
beacon = false |
| blink.cmp |
blink_cmp = { style = 'bordered', } |
| blink.indent |
blink_indent = true |
| blink.pairs |
blink_pairs = true SpecialUse this to set it up: require("blink.pairs").setup { highlights = { groups = { "BlinkPairsRed", "BlinkPairsYellow", "BlinkPairsBlue", "BlinkPairsOrange", "BlinkPairsGreen", "BlinkPairsPurple", "BlinkPairsCyan", }, }, } |
| bufferline.nvim |
SpecialUpdate your bufferline config to use the Catppuccin components:
use "akinsho/bufferline.nvim" { after = "catppuccin", config = function() require("bufferline").setup { highlights = require("catppuccin.special.bufferline").get_theme() } end } Configurations are self-explanatory, see local mocha = require("catppuccin.palettes").get_palette "mocha" bufferline.setup { highlights = require("catppuccin.special.bufferline").get_theme { styles = { "italic", "bold" }, custom = { all = { fill = { bg = "#000000" }, }, mocha = { background = { fg = mocha.text }, }, latte = { background = { fg = "#000000" }, }, }, }, } |
| buffon.nvim |
buffon = false |
| coc.nvim |
coc_nvim = false SpecialSetting coc_nvim = true,
In the nested tables you can set the style for the diagnostics, both lsp_styles = { virtual_text = { errors = { "italic" }, hints = { "italic" }, warnings = { "italic" }, information = { "italic" }, ok = { "italic" }, }, underlines = { errors = { "underline" }, hints = { "underline" }, warnings = { "underline" }, information = { "underline" }, ok = { "underline" }, }, inlay_hints = { background = true, }, }, |
| colorful-winsep.nvim |
colorful_winsep = { enabled = false, color = "red", } |
| dashboard-nvim |
dashboard = true |
| diffview.nvim |
diffview = false |
| dropbar.nvim |
dropbar = { enabled = false, color_mode = false, -- enable color for kind's texts, not just kind's icons }, |
| feline.nvim |
SpecialUpdate your Feline config to use the Catppuccin components: local ctp_feline = require('catppuccin.special.feline') ctp_feline.setup() require("feline").setup({ components = ctp_feline.get_statusline(), }) Notice that calling Here are the defaults: local clrs = require("catppuccin.palettes").get_palette() local ctp_feline = require('catppuccin.special.feline') local U = require "catppuccin.utils.colors" ctp_feline.setup({ assets = { left_separator = "๎ถ", right_separator = "๎ด", mode_icon = "๏ฎ", dir = "๓ฐ", file = "๓ฐ", lsp = { server = "๓ฐ ก", error = "๏", warning = "๏", info = "๏", hint = "๏", }, git = { branch = "๎ฅ", added = "๏", changed = "๏ ", removed = "๏", }, }, sett = { text = U.vary_color({ latte = latte.base }, clrs.surface0), bkg = U.vary_color({ latte = latte.crust }, clrs.surface0), diffs = clrs.mauve, extras = clrs.overlay1, curr_file = clrs.maroon, curr_dir = clrs.flamingo, show_modified = false, -- show if the file has been modified show_lazy_updates = false -- show the count of updatable plugins from lazy.nvim -- need to set checker.enabled = true in lazy.nvim first -- the icon is set in ui.icons.plugin in lazy.nvim }, mode_colors = { ["n"] = { "NORMAL", clrs.lavender }, ["no"] = { "N-PENDING", clrs.lavender }, ["i"] = { "INSERT", clrs.green }, ["ic"] = { "INSERT", clrs.green }, ["t"] = { "TERMINAL", clrs.green }, ["v"] = { "VISUAL", clrs.flamingo }, ["V"] = { "V-LINE", clrs.flamingo }, ["๏ฟฝ"] = { "V-BLOCK", clrs.flamingo }, ["R"] = { "REPLACE", clrs.maroon }, ["Rv"] = { "V-REPLACE", clrs.maroon }, ["s"] = { "SELECT", clrs.maroon }, ["S"] = { "S-LINE", clrs.maroon }, ["๏ฟฝ"] = { "S-BLOCK", clrs.maroon }, ["c"] = { "COMMAND", clrs.peach }, ["cv"] = { "COMMAND", clrs.peach }, ["ce"] = { "COMMAND", clrs.peach }, ["r"] = { "PROMPT", clrs.teal }, ["rm"] = { "MORE", clrs.teal }, ["r?"] = { "CONFIRM", clrs.mauve }, ["!"] = { "SHELL", clrs.green }, }, view = { lsp = { progress = true, -- if true the status bar will display an lsp progress indicator name = false, -- if true the status bar will display the lsp servers name, otherwise it will display the text "Lsp" exclude_lsp_names = {}, -- lsp server names that should not be displayed when name is set to true separator = "|", -- the separator used when there are multiple lsp servers }, } })
vim.api.nvim_create_autocmd("ColorScheme", { pattern = "*", callback = function() package.loaded["feline"] = nil package.loaded["catppuccin.special.feline"] = nil require("feline").setup { components = require("catppuccin.special.feline").get_statusline(), } end, }) |
| fern.vim |
fern = false |
| fidget.nvim |
fidget = false SpecialSet `notification.window.winblend` to `0`:require("fidget").setup { notification = { window = { winblend = 0, }, } -- ... the rest of your fidget config } |
| flash.nvim |
flash = true |
| fzf-lua |
fzf = true |
| gitgraph.nvim |
gitgraph = false |
| gitsigns.nvim |
gitsigns = true Specialgitsigns = { enabled = true, -- align with the transparent_background option by default transparent = false, } |
| grug-far.nvim |
grug_far = false |
| harpoon |
harpoon = false |
| headlines.nvim |
headlines = false |
| hop.nvim |
hop = false |
| indent-blankline.nvim |
indent_blankline = { enabled = true, scope_color = "", -- catppuccin color (eg. `lavender`) Default: text colored_indent_levels = false, }, Special
|
| leap.nvim |
leap = false |
| lightline.vim |
Speciallet g:lightline = {'colorscheme': 'catppuccin'} |
| lightspeed.nvim |
lightspeed = false |
| lir.nvim |
lir = { enabled = false, git_status = false } |
| lspsaga.nvim |
lsp_saga = false SpecialFor custom Lsp Kind Icon and Color require("lspsaga").setup { ui = { kind = require("catppuccin.groups.integrations.lsp_saga").custom_kind(), }, } |
| lualine.nvim |
-- transparent_bg = opts.transparent_background and "NONE" or C.mantle lualine = { normal = { a = { bg = C.blue, fg = C.mantle, gui = "bold" }, b = { bg = C.surface0, fg = C.blue }, c = { bg = transparent_bg, fg = C.text }, }, insert = { a = { bg = C.green, fg = C.base, gui = "bold" }, b = { bg = C.surface0, fg = C.green }, }, terminal = { a = { bg = C.green, fg = C.base, gui = "bold" }, b = { bg = C.surface0, fg = C.green }, }, command = { a = { bg = C.peach, fg = C.base, gui = "bold" }, b = { bg = C.surface0, fg = C.peach }, }, visual = { a = { bg = C.mauve, fg = C.base, gui = "bold" }, b = { bg = C.surface0, fg = C.mauve }, }, replace = { a = { bg = C.red, fg = C.base, gui = "bold" }, b = { bg = C.surface0, fg = C.red }, }, inactive = { a = { bg = transparent_bg, fg = C.blue }, b = { bg = transparent_bg, fg = C.surface1, gui = "bold" }, c = { bg = transparent_bg, fg = C.overlay0 }, }, }, SpecialTo implement color overrides in the -- In your catppuccin config (integrations): lualine = { -- lualine color overrides in the following hierarchy: Catppuccin Flavor -> Mode -> Lualine Section -- The Catppuccin flavor entry can be any Catpuccin flavor or "all" to apply to all flavors -- The flavor entry can be either a table or a function which consumes the current Catppuccin palette, just like custom_highlights and color_overrides all = function(colors) ---@type CtpIntegrationLualineOverride return { -- Specifying a normal-mode status line override for section a's background and b's foreground to use lavender like the main Catppuccin theme normal = { a = { bg = colors.lavender, gui = "italic" }, b = { fg = colors.lavender }, } } end, -- A macchiato-specific override, which takes priority over 'all'. Also using the direct table syntax instead of function in case you do not rely on dynamic palette colors macchiato = { normal = { a = { bg = "#abcdef" }, } }, }, -- And in your lualine config: require('lualine').setup { options = { -- lualine will integrate with catppuccin by name or automatically via `vim.g.colors_name` by setting this to "auto" theme = "catppuccin" -- ... the rest of your lualine config } } |
| markview.nvim |
markview = false |
| mason.nvim |
mason = false |
| mini.nvim |
mini = { enabled = true, indentscope_color = "", -- catppuccin color (eg. `lavender`) Default: text }, |
| neo-tree.nvim |
neotree = true |
| neogit |
neogit = true |
| neotest |
neotest = false |
| noice.nvim |
noice = false |
| notifier.nvim |
notifier = false |
| nvim-cmp |
cmp = true |
| copilot.vim |
copilot_vim = false, |
| nvim-dap |
dap = true Speciallocal sign = vim.fn.sign_define sign("DapBreakpoint", { text = "โ", texthl = "DapBreakpoint", linehl = "", numhl = ""}) sign("DapBreakpointCondition", { text = "โ", texthl = "DapBreakpointCondition", linehl = "", numhl = ""}) sign("DapLogPoint", { text = "โ", texthl = "DapLogPoint", linehl = "", numhl = ""}) |
| nvim-dap-ui |
dap_ui = true |
| navic |
navic = { enabled = false, custom_bg = "NONE", -- "lualine" will set background to mantle }, Special-- You NEED to enable highlight in nvim-navic setting or it won't work require("nvim-navic").setup { highlight = true } |
| nvim-notify |
notify = false |
| nvim-surround |
nvim_surround = false |
| nvim-tree.lua |
nvimtree = true |
| nvim-treesitter-context |
treesitter_context = true |
| nvim-ts-rainbow2 |
ts_rainbow2 = false |
| nvim-ts-rainbow |
ts_rainbow = false |
| nvim-ufo |
ufo = true |
| nvim-window-picker |
window_picker = false |
| octo.nvim |
octo = false |
| overseer.nvim |
overseer = false |
| pounce.nvim |
pounce = false |
| rainbow-delimiters.nvim |
rainbow_delimiters = true |
| reactive.nvim |
SpecialThere're 2 available presets ( Here is how you can use them. require('reactive').setup { load = { 'catppuccin-mocha-cursor', 'catppuccin-mocha-cursorline' } } To use another flavour just replace |
| render-markdown.nvim |
render_markdown = true |
| snacks.nvim |
snacks = { enabled = false, indent_scope_color = "", -- catppuccin color (eg. `lavender`) Default: text } |
| symbols-outline.nvim |
Note This plugin has been archived by the author, consider using outline.nvim symbols_outline = false |
| telekasten.nvim |
telekasten = false |
| telescope.nvim |
telescope = { enabled = true, } |
| trouble.nvim |
lsp_trouble = false |
| vim-airline |
Speciallet g:airline_theme = 'catppuccin' |
| vim-clap |
SpecialUse this to set it up: let g:clap_theme = 'catppuccin' |
| vim-dadbod-ui |
dadbod_ui = false |
| vim-gitgutter |
gitgutter = false |
| vim-illuminate |
illuminate = { enabled = true, lsp = false } |
| vim-sandwich |
sandwich = false |
| vim-signify |
signify = false |
| vim-sneak |
vim_sneak = false |
| vimwiki |
vimwiki = false |
| which-key.nvim |
which_key = false |
Compile
Catppuccin is a highly customizable and configurable colorscheme. This does however come at the cost of complexity and execution time. Catppuccin can pre compute the results of your configuration and store the results in a compiled Lua file. We use these pre-cached values to set it's highlights.
By default, Catppuccin writes the compiled results into the system's cache directory. See below if you'd like to change the cache directory:
require("catppuccin").setup({ -- Note: On windows we replace `/` with `\` by default compile_path = vim.fn.stdpath "cache" .. "/catppuccin" })
๐ FAQ
Why do my Treesitter highlights look incorrect?
Please disable additional_vim_regex_highlighting:
require("nvim-treesitter.configs").setup { highlight = { enable = true, additional_vim_regex_highlighting = false }, }
Why aren't my colors the same as the previews?
Catppuccin requires that your terminal supports true color, meaning that your terminal can display the full range of 16 million colors.
- Supported: iterm2 (macOS), kitty, wezterm, alacritty, see full list...
- Unsupported: Terminal.app (macOS), Terminus, Terminology, see full list...
If you use tmux, make sure to enable true color support and italic font support. This will prevent issues raised in #415 and #428.
๐ Thanks to
Current Maintainer(s)
Previous Maintainer(s)
Copyright ยฉ 2021-present Catppuccin Org




