The original Material theme now available for NeoVim
A port of Material colorscheme for NeoVim written in Lua
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
5 styles to choose from
Oceanic
Deep ocean
Palenight
Lighter
Darker
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
Default:
Stealth
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'
})
Enable the colorscheme:
--Lua:
vim.cmd 'colorscheme material'
For a complete guide on usage and configuration of the theme, see :help material.nvim
.
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:
-- "coc",
-- "colorful-winsep",
-- "dap",
-- "dashboard",
-- "eyeliner",
-- "fidget",
-- "flash",
-- "gitsigns",
-- "harpoon",
-- "hop",
-- "illuminate",
-- "indent-blankline",
-- "lspsaga",
-- "mini",
-- "neogit",
-- "neotest",
-- "neo-tree",
-- "neorg",
-- "noice",
-- "nvim-cmp",
-- "nvim-navic",
-- "nvim-tree",
-- "nvim-web-devicons",
-- "rainbow-delimiters",
-- "sneak",
-- "telescope",
-- "trouble",
-- "which-key",
-- "nvim-notify",
},
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
}
}
:lua require("material.functions").find_style()
:lua require('material.functions').toggle_style()
:lua require('material.functions').toggle_eob()
:lua require('material.functions').change_style("palenight")