catppuccin/nvim

github github
colorscheme
stars 7,275
issues 12
subscribers 21
forks 332
CREATED

UPDATED


Previews

Features

Installation

lazy.nvim

{ "catppuccin/nvim", name = "catppuccin", priority = 1000 }

mini.deps

add({ source = "catppuccin/nvim", name = "catppuccin" })

packer.nvim

use { "catppuccin/nvim", as = "catppuccin" }

with Neovim 0.12's vim.pack

vim.pack.add({ src = "https://github.com/catppuccin/nvim", name = "catppuccin" })

Vim support

Support for Vim is provided through the vim branch.

vim-plug

Plug 'catppuccin/nvim', { 'branch': 'vim', 'as': 'catppuccin' }

[!NOTE] Keep in mind that Vim support has been dropped (#949) and this branch won't receive further updates unless necessary. For full Vim support, see catppuccin/vim. Starting from Vim v9.2.0219 and Neovim 0.12, catppuccin is shipped with the editors. Note that it is not maintained by the Catppuccin organization and follows Vim colorscheme rules instead of the official Catppuccin style guide.

Usage

colorscheme catppuccin-nvim " catppuccin-latte, catppuccin-frappe, catppuccin-macchiato, catppuccin-mocha
vim.cmd.colorscheme "catppuccin-nvim"

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|
    },
    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-nvim"

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 https://github.com/catppuccin/nvim/discussions/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.

[!Important] If you'd like to see the full list of highlight groups modified by Catppuccin, see the lua/catppuccin/groups/integrations/ directory.

aerial.nvim

aerial = false

alpha-nvim

alpha = true
artio = 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,
},

Use this to set it up:

require("barbecue").setup {
  theme = "catppuccin-nvim", -- 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

Use this to set it up:

require("blink.pairs").setup {
    highlights = {
        groups = {
            "BlinkPairsRed",
            "BlinkPairsYellow",
            "BlinkPairsBlue",
            "BlinkPairsOrange",
            "BlinkPairsGreen",
            "BlinkPairsPurple",
            "BlinkPairsCyan",
        },
    },
}

bufferline.nvim

Update your bufferline config to use the Catppuccin components:

[!NOTE] bufferline needs to be loaded after setting up Catppuccin or it will highlight incorrectly

use "akinsho/bufferline.nvim" {
  after = "catppuccin",
  config = function()
    require("bufferline").setup {
      highlights = require("catppuccin.special.bufferline").get_theme()
    }
  end
}

Configurations are self-explanatory, see :h bufferline-highlights for detailed explanations:

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

Setting enabled to true enables this integration.

coc_nvim = true,

[!Note] coc.nvim by default link to native lsp highlight groups so lsp_styles options will also apply to coc

In the nested tables you can set the style for the diagnostics, both virtual_text (what you see on the side) and underlines (what points directly at the thing (e.g. an error)).

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

Update 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 setup() is optional. You may pass a lua table in order to change assets, settings and the colors per vim mode.

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
        },
    }
})

[!Warning] Currently feline doesn't officially support custom themes. In order for :colorscheme catppuccin-<flavour> to work you could add this autocmd as a workaround:

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
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
gitsigns = {
  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,
},

colored_indent_levels enables char highlights per indent level. Follow the instructions here to set the latter up.

leap.nvim

leap = false

lightline.vim

let g:lightline = {'colorscheme': 'catppuccin'}

lightspeed.nvim

lightspeed = false

lir.nvim

lir = {
    enabled = false,
    git_status = false
}

lspsaga.nvim

lsp_saga = false

For 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 },
    },
},

To implement color overrides in the integrations.lualine spec:

-- 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-nvim"
        -- ... 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
local 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
},
-- 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

There're 2 available presets (cursor and cursorline) for every flavour.

Here is how you can use them.

require('reactive').setup {
  load = { 'catppuccin-mocha-cursor', 'catppuccin-mocha-cursorline' }
}

To use another flavour just replace mocha with the one you want to use.

render-markdown.nvim

render_markdown = true

snacks.nvim

snacks = {
    enabled = false,
    indent_scope_color = "", -- catppuccin color (eg. `lavender`) Default: overlay2
}

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

let g:airline_theme = 'catppuccin'

vim-clap

Use 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.

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)