DEV Community

Cover image for Nvim: Persistent colorscheme choice
Sérgio Araújo
Sérgio Araújo

Posted on

Nvim: Persistent colorscheme choice

In general we arecused to set our colorscheme in a options file where we write our choice, but nativelly there is not a dinamic system to allow us change our colirscheme.

Just some steps

First create a theme.json in your nvim folder

~/.config/nvim/theme.json where we will save the color. In my case the file looks like:

{"colorscheme":"onedark"} 
Enter fullscreen mode Exit fullscreen mode

in your init.lua require a file require('core.theme') with this content:

-- ~/.config/nvim/lua/core/theme.lua local theme_file = vim.fn.stdpath('config') .. '/theme.json' local colorscheme = 'habamax' -- fallback -- Tenta ler o arquivo theme.json local function load_colorscheme() local ok, json = pcall(vim.fn.readfile, theme_file) if ok and json and #json > 0 then local decoded = vim.fn.json_decode(table.concat(json, '\n')) if decoded and decoded.colorscheme then return decoded.colorscheme end end return colorscheme end vim.defer_fn(function() local cs = load_colorscheme() local ok = pcall(vim.cmd.colorscheme, cs) if not ok then vim.notify('Colorscheme ' .. cs .. ' not found! Using fallback.', vim.log.levels.WARN) pcall(vim.cmd.colorscheme, colorscheme) end end, 10) 
Enter fullscreen mode Exit fullscreen mode

Now an autocommand to detect when you choose a new theme:

vim.api.nvim_create_autocmd('ColorScheme', { group = vim.api.nvim_create_augroup('SaveColorscheme', { clear = true }), callback = function(args) local theme = args.match if theme == 'habamax' then return end -- evita salvar fallback local path = vim.fn.stdpath('config') .. '/theme.json' local ok, f = pcall(io.open, path, 'w') if ok and f then f:write(vim.json.encode({ colorscheme = theme })) f:close() end end, }) 
Enter fullscreen mode Exit fullscreen mode

You can setup your telescope pickers.colorscheme with:

Note: Once we have an outcommand you can ignore the code below but if you want to learn how do it via telescope...

colorscheme = { enable_preview = true, previewer = false, layout_config = { height = 0.4, width = 0.5, }, attach_mappings = function(_, map) local actions = require('telescope.actions') local action_state = require('telescope.actions.state') map('i', '<CR>', function(prompt_bufnr) local selection = action_state.get_selected_entry() local theme = selection.value actions.close(prompt_bufnr) vim.cmd.colorscheme(theme) -- salva o tema no theme.json local path = vim.fn.stdpath('config') .. '/theme.json' local ok, file = pcall(io.open, path, 'w') if ok and file then file:write(vim.fn.json_encode({ colorscheme = theme })) file:close() vim.notify('Tema salvo: ' .. theme, vim.log.levels.INFO) else vim.notify('Erro ao salvar o tema!', vim.log.levels.ERROR) end end) return true end, }, 
Enter fullscreen mode Exit fullscreen mode

and let your choice be saved automatically

Top comments (0)