🔱 Info
A colorscheme for NeoVim that takes inspiration from the original Material theme.
Material.nvim is meant to be a fast and modern colorscheme written in Lua that supports a lot of the new features added to NeoVim like built-in LSP and TreeSitter
🌊 Features
-
5 styles to choose from
-
Many supported plugins
-
Ability to change background on sidebar-like windows like Nvim-Tree, Packer, terminal etc.
-
Asynchronous highlight loading which makes the theme blazingly fast
-
Ability to select styles using telescope.nvim
-
Added functions for live theme switching without the need to restart NeoVim
-
Two Lualine themes
⚡️ Requirements
- Neovim >= 0.7.0
⚓ Installation
Install via your favourite package manager:
-- If you are using Lazy require('lazy').setup({ 'marko-cerovac/material.nvim' }, opts) -- If you are using Pckr require('pckr').add({ 'marko-cerovac/material.nvim' })
🐬 Usage
Enable the colorscheme:
--Lua: vim.cmd 'colorscheme material'
For a complete guide on usage and configuration of the theme, see :help material.nvim.
⚙️ Configuration
- There are 5 different styles available:
- darker
- lighter
- oceanic
- palenight
- deep ocean
Set the desired style using:
--Lua: vim.g.material_style = "deep ocean"
The configuration of different options is done trough a setup function
This is an example of the function with the default values
require('material').setup({ contrast = { terminal = false, -- Enable contrast for the built-in terminal sidebars = false, -- Enable contrast for sidebar-like windows ( for example Nvim-Tree ) floating_windows = false, -- Enable contrast for floating windows cursor_line = false, -- Enable darker background for the cursor line lsp_virtual_text = false, -- Enable contrasted background for lsp virtual text non_current_windows = false, -- Enable contrasted background for non-current windows filetypes = {}, -- Specify which filetypes get the contrasted (darker) background }, styles = { -- Give comments style such as bold, italic, underline etc. comments = { --[[ italic = true ]] }, strings = { --[[ bold = true ]] }, keywords = { --[[ underline = true ]] }, functions = { --[[ bold = true, undercurl = true ]] }, variables = {}, operators = {}, types = {}, }, plugins = { -- Uncomment the plugins that you use to highlight them -- Available plugins: -- "blink", -- "coc", -- "colorful-winsep", -- "dap", -- "dashboard", -- "eyeliner", -- "fidget", -- "flash", -- "gitsigns", -- "harpoon", -- "hop", -- "illuminate", -- "indent-blankline", -- "lspsaga", -- "mini", -- "neo-tree", -- "neogit", -- "neorg", -- "neotest", -- "noice", -- "nvim-cmp", -- "nvim-navic", -- "nvim-notify", -- "nvim-tree", -- "nvim-web-devicons", -- "rainbow-delimiters", -- "sneak", -- "telescope", -- "trouble", -- "which-key", }, disable = { colored_cursor = false, -- Disable the colored cursor borders = false, -- Disable borders between vertically split windows background = false, -- Prevent the theme from setting the background (NeoVim then uses your terminal background) term_colors = false, -- Prevent the theme from setting terminal colors eob_lines = false -- Hide the end-of-buffer lines }, high_visibility = { lighter = false, -- Enable higher contrast text for lighter style darker = false -- Enable higher contrast text for darker style }, lualine_style = "default", -- Lualine style ( can be 'stealth' or 'default' ) async_loading = true, -- Load parts of the theme asynchronously for faster startup (turned on by default) custom_colors = nil, -- If you want to override the default colors, set this to a function custom_highlights = {}, -- Overwrite highlights with your own })
After passing the configuration to a setup function, make sure to enable the colorscheme:
vim.cmd 'colorscheme material'
This is an example of overwriting the default highlights and colors (most users will never need to do this)
local material = require 'material' local colors = require 'material.colors' material.setup{ custom_highlights = { LineNr = { bg = '#FF0000' }, CursorLine = { fg = colors.editor.constrast , underline = true }, -- Dynamically override highlight groups with functions to ensure colors are -- updated when changing styles at runtime TabLine = function(colors, _) return { fg = colors.main.gray, italic = true, } end, TabLineSel = function(_, highlights) return vim.tbl_extend( "force", highlights.main_highlights.editor()["TabLineSel"], { bold = true } ) end, -- This is a list of possible values YourHighlightGroup = { fg = "#SOME_COLOR", -- foreground color bg = "#SOME_COLOR", -- background color sp = "#SOME_COLOR", -- special color (for colored underlines, undercurls...) bold = false, -- make group bold italic = false, -- make group italic underline = false, -- make group underlined undercurl = false, -- make group undercurled underdot = false, -- make group underdotted underdash = false, -- make group underslashed striketrough = false, -- make group striked trough reverse = false, -- reverse the fg and bg colors link = "SomeOtherGroup" -- link to some other highlight group } }, -- Custom colors must be a function that takes in the default colors table as -- a parameter, and then modifies them. -- To see the available colors, see lua/material/colors/init.lua custom_colors = function(colors) colors.editor.bg = "#SOME_COLOR" colors.main.purple = "#SOME_COLOR" colors.lsp.error = "#SOME_COLOR" end }
To enable transparency, it is suggested you disable the theme background from the settings above. That way, your terminal's background will be used instead.
require('material').setup({ -- ... other settings disable = { -- ... other settings background = true, }, })
To enable the lualine themes, first set the theme in your lualine settings to auto or material
require('lualine').setup { options = { -- ... your lualine config theme = 'auto' or theme = 'material' -- ... your lualine config } }
Then, choose the style trough a variable called lualine_style in the theme setup function
require('material').setup({ lualine_style = 'default' -- the default style or lualine_style = 'stealth' -- the stealth style })
If the theme, doesn't look right, it's probably because material.nvim is being loaded before lualine, causing the other material theme that comes built-in to lualine to be used. To fix this, either load material.nvim after lualine (preferred way) or set the lualine theme to one of these two values in your lualine settings
require('lualine').setup { options = { -- ... your lualine config theme = 'material-nvim' -- the default style or theme = 'material-stealth' -- the stealth style -- ... your lualine config } }
⛵ Functions
- Use Telescope.nvim to switch styles
:lua require("material.functions").find_style()
- Cycle trough styles
:lua require('material.functions').toggle_style()
- Toggle the end of buffer lines ( ~ )
:lua require('material.functions').toggle_eob()
- Change the style to a desired one using the function change_style("desired style")
:lua require('material.functions').change_style("palenight")





