github catppuccin/nvim v2.0.0

latest release: stable
7 hours ago

2.0.0 (2026-04-02)

This is a big release!

We've made some updates to syntax highlighting & added some lovely
integrations for newer plugins. Again, thanks to the community for all the lovely
contributions <3

Important

If you need any help or wish to submit feedback about this release, please
don't hesitate to leave a comment in our release discussion!

Breaking changes

There are a few breaking changes included in this major release that we'd like
to notify you about. So following is a breakdown of some changes you might need
to make to your config to take full advantage of the release and prevent any
easily avoidable issues.

🛑 Vim Support Removed (#949)

This is one of the biggest changes included with this release: vim support has
officially been dropped. This means any code related to special vim features
or special handling of differences between the editors has been removed. This
cleans up the source code for maintainers and eases development. You can read
more
in the readme if you were relying on this support. For those
on neovim, nothing changes for you!

🏷️ Colorscheme Renamed (#977)

Important

This only affects the call to vim.cmd.colorscheme in your config. The plugin
name and import paths remain the same.

The catppuccin vim port has been added to the vim builtin colorschemes. This
means that a simpler variant of this port is now easily available to those that
want it: just :colorscheme catppuccin, no plugin needed.

Unfortunately, this vim port has much smaller featureset than our neovim
port. The integration of the vim port also means that the colorscheme name of
this port and the built-in port are now conflicting - both use the catppuccin
name. To adapt to this, we changed the name of the colorscheme to
catppuccin-nvim
to show the difference with the new builtin colorscheme.

To continue using the neovim plugin instead of the new builtin colorscheme, don't forget to use this in your config:

vim.cmd.colorscheme("catppuccin-nvim")

🎨 Treesitter Syntax Changes (#804)

The treesitter syntax colors have been changed a lot with the aim to align the
syntax highlighting of the neovim port with other ports & code editors in the
organisation.

It's a hard balance to strike when trying to improve the highlights in
different grammars, but also make it feel familiar across lots of different
code editors. The VSCode, Intellij, etc ports might receive some updates after
this v2.0.0 release. You can more about the discussion on these changes here.

If you'd like to revert these changes you can use the following snippet with our overrides api:

require('catppuccin').setup({
    custom_highlights = function(C)
        local O = require("catppuccin").options
        return {
            ["@variable.member"] = { fg = C.lavender }, -- For fields.
            ["@module"] = { fg = C.lavender, style = O.styles.miscs or { "italic" } }, -- For identifiers referring to modules and namespaces.
            ["@string.special.url"] = { fg = C.rosewater, style = { "italic", "underline" } }, -- urls, links and emails
            ["@type.builtin"] = { fg = C.yellow, style = O.styles.properties or { "italic" } }, -- For builtin types.
            ["@property"] = { fg = C.lavender, style = O.styles.properties or {} }, -- Same as TSField.
            ["@constructor"] = { fg = C.sapphire }, -- For constructor calls and definitions: = { } in Lua, and Java constructors.
            ["@keyword.operator"] = { link = "Operator" }, -- For new keyword operator
            ["@keyword.export"] = { fg = C.sky, style = O.styles.keywords },
            ["@markup.strong"] = { fg = C.maroon, style = { "bold" } }, -- bold
            ["@markup.italic"] = { fg = C.maroon, style = { "italic" } }, -- italic
            ["@markup.heading"] = { fg = C.blue, style = { "bold" } }, -- titles like: # Example
            ["@markup.quote"] = { fg = C.maroon, style = { "bold" } }, -- block quotes
            ["@markup.link"] = { link = "Tag" }, -- text references, footnotes, citations, etc.
            ["@markup.link.label"] = { link = "Label" }, -- link, reference descriptions
            ["@markup.link.url"] = { fg = C.rosewater, style = { "italic", "underline" } }, -- urls, links and emails
            ["@markup.raw"] = { fg = C.teal }, -- used for inline code in markdown and for doc in python (""")
            ["@markup.list"] = { link = "Special" },
            ["@tag"] = { fg = C.mauve }, -- Tags like html tag names.
            ["@tag.attribute"] = { fg = C.teal, style = O.styles.miscs or { "italic" } }, -- Tags like html tag names.
            ["@tag.delimiter"] = { fg = C.sky }, -- Tag delimiter like < > /
            ["@property.css"] = { fg = C.lavender },
            ["@property.id.css"] = { fg = C.blue },
            ["@type.tag.css"] = { fg = C.mauve },
            ["@string.plain.css"] = { fg = C.peach },
            ["@constructor.lua"] = { fg = C.flamingo }, -- For constructor calls and definitions: = { } in Lua.
            -- typescript
            ["@property.typescript"] = { fg = C.lavender, style = O.styles.properties or {} },
            ["@constructor.typescript"] = { fg = C.lavender },
            -- TSX (Typescript React)
            ["@constructor.tsx"] = { fg = C.lavender },
            ["@tag.attribute.tsx"] = { fg = C.teal, style = O.styles.miscs or { "italic" } },
            ["@type.builtin.c"] = { fg = C.yellow, style = {} },
            ["@type.builtin.cpp"] = { fg = C.yellow, style = {} },
        }
    end,
})

🪟 New Global Floating Window Options (#892)

All the options for floating windows or solid-window styling have been moved to
a global option set. This is to make sure all integrations follow these
guidelines and adapt to your preferences properly.

What this means for you is that you no longer need to set a .transparent
toggle on integrations. Instead you can simply set:

require('catppuccin').setup({
    transparent_background = true, -- for global brackground transparency
    float = {
        transparent = true, -- if you would like floating windows to *also* be transparent
        solid = true, -- to enable solid-window styling
    },
})

All of these options default to false if unset.

You can look at the related pr for previews of what these options look
like.

⚒️ Special Integrations Changes (#931)

Editor Integrations

To adapt to the everchanging landscape of neovim features & plugins, some
integrations have been moved or changed.

The markdown, native_lsp, semantic_tokens and treesitter integrations
are now integrated into the default nvim highlights and these do no longer have
to be enabled manually.

This means you can remove the following options from your config:

require('catppuccin').setup({
    integrations = {
        markdown = true,
        native_lsp = true,
        semantic_tokens = true,
        treesitter = true,
    },
})

LSP Integration

The settings that were previously in integrations.native_lsp were moved to
lsp_styles since this integration is now always enabled.

require('catppuccin').setup({
    lsp_styles = { -- Handles the style of specific lsp hl groups (see `:h lsp-highlight`).
        virtual_text = {
            hints = { "italic" },
            information = { "italic" },
            ok = { "italic" },
        },
        underlines = {
            errors = { "underline" },
            warnings = { "underline" },
        },
        inlay_hints = {
            background = false,
        },
    },
})

Special Integrations

The bufferline and feline special integrations have been moved to
catppuccin.special.<integration>. These were previously under the
catppuccin.groups.integrations.<integration> namespace, which was sometimes
confusing since these features couldn't be enabled with the normal
integrations.<integration> = true options.

Simply use the following new module imports and everything else is the same:

  • require('catppuccin.groups.integrations.bufferline').get() => require('catppuccin.special.bufferline').get_theme()
  • require('catppuccin.groups.integrations.feline').get() => require('catppuccin.special.feline').get_statusline()

Note

The imports now use .get_theme() and .get_statusline() respectively for
the imports - instead of .get() for both. This change was made to indicate
more clearly what is being imported.

⚙️ Smaller Changes

The .show_end_of_buffer option has been removed (#982)

This feature previously tried to hide the ~ end of file characters you can
see at the bottom of your editor. It tried to do so by linking the foreground
color of these characters to the editor background. Unfortunately, this
solution was quite hacky and had adverse affects when transparency was enabled.

If you'd still like to use this feature, set the following editor option in your config:

vim.opt.fillchars:append({ eob = " " })

Lualine Overrides (#843)

The lualine integration can now be overriden, thanks to @nabellows. You can
now override the colors used for different modes, flavors and sections of the
statusline. You can read more about this in the readme.


Afterword

As always, thanks to our lovely contributors and community <3

~ robin (comfysage)

Full Changelog: v1.11.0...v2.0.0

Don't miss a new nvim release

NewReleases is sending notifications on new releases.