refactor: switch to catppuccin mocha across tmux and neovim

- tmux: hand-rolled catppuccin theme, three-way status bar toggle, plugin cleanup
- nvim: switch colorscheme to catppuccin-mocha, update lualine colors
- nvim: add tmuxline.vim for tmux statusline generation
- kitty: fix MesloLGS NF font typo, remove deprecated config keys

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Thomas Naderer
2026-03-01 15:44:29 +01:00
parent 2229f7741b
commit 82fc23530d
26 changed files with 1236 additions and 2404 deletions

View File

@@ -1,233 +1,250 @@
-- ~/.config/nvim/lua/plugins/init.lua
return {
-- Colorschemes
{ "gruvbox-community/gruvbox", priority = 1000 },
{ "folke/tokyonight.nvim", priority = 1000 },
{ "catppuccin/nvim", name = "catppuccin", priority = 1000 },
{ "EdenEast/nightfox.nvim", priority = 1000 },
{ "rose-pine/neovim", name = "rose-pine", priority = 1000 },
{ "rebelot/kanagawa.nvim", priority = 1000 },
{ "sainnhe/everforest", priority = 1000 },
-- Auto-save
{
"okuuva/auto-save.nvim",
version = "v1.*",
event = { "InsertLeave", "TextChanged" },
opts = {
enabled = true,
execution_message = {
enabled = false,
},
trigger_events = {
immediate_save = { "BufLeave", "FocusLost" },
defer_save = { "InsertLeave", "TextChanged" },
cancel_defered_save = { "InsertEnter" },
},
},
},
-- File explorer
{ import = "plugins.nvim-tree" },
-- Treesitter
{ import = "plugins.treesitter" },
-- Rainbow delimiters
{ import = "plugins.rainbow_delimiters" },
-- Git integration
{
"lewis6991/gitsigns.nvim",
opts = {
signs = {
add = { text = "" },
change = { text = "" },
delete = { text = "_" },
topdelete = { text = "" },
changedelete = { text = "~" },
untracked = { text = "" },
},
signcolumn = false, -- Disable signs by default
numhl = false, -- Disable number highlights by default
linehl = false, -- Disable line highlights by default
word_diff = false,
current_line_blame = false,
}
},
{ "tpope/vim-fugitive" },
-- Status line
{ import = "plugins.lualine" },
-- FZF
{
"junegunn/fzf",
build = function()
vim.fn["fzf#install"]()
end,
},
{ "junegunn/fzf.vim" },
-- Productivity
{ "numToStr/Comment.nvim", opts = {} },
{ "windwp/nvim-autopairs", opts = {} },
{ "tpope/vim-surround" },
-- Tmux navigation
{ "christoomey/vim-tmux-navigator" },
-- LaTeX
{ import = "plugins.vimtex" },
-- Org-mode
{
"nvim-orgmode/orgmode",
dependencies = { "nvim-treesitter/nvim-treesitter" },
opts = {},
},
-- Telescope
{
"nvim-telescope/telescope.nvim",
dependencies = { "nvim-lua/plenary.nvim" },
keys = {
{ "<leader>ff", ":Telescope find_files<CR>", desc = "Find files" },
{ "<leader>fg", ":Telescope live_grep<CR>", desc = "Live grep" },
{ "<leader>fb", ":Telescope buffers<CR>", desc = "Buffers" },
{ "<leader>fh", ":Telescope help_tags<CR>", desc = "Help tags" },
},
},
-- Yazi file manager
{
"mikavilpas/yazi.nvim",
keys = {
{ "<leader>y", ":Yazi<CR>", desc = "Open Yazi" },
},
opts = {
open_for_directories = false,
keymaps = {
show_help = "<F1>",
},
},
},
-- Leap (motion)
{
"ggandor/leap.nvim",
event = "VeryLazy",
config = function()
require('leap').add_default_mappings()
-- Override default s/S with f/F to avoid conflict with surround
vim.keymap.del({'n', 'x', 'o'}, 's')
vim.keymap.del({'n', 'x', 'o'}, 'S')
vim.keymap.set({'n', 'x', 'o'}, 'f', '<Plug>(leap-forward)')
vim.keymap.set({'n', 'x', 'o'}, 'F', '<Plug>(leap-backward)')
end,
},
-- Markdown
{ "SidOfc/mkdx" },
{
"MeanderingProgrammer/render-markdown.nvim",
dependencies = { "nvim-treesitter/nvim-treesitter", "echasnovski/mini.icons" },
ft = { "markdown", "norg", "rmd", "org" },
config = function()
require('render-markdown').setup({
heading = {
enabled = true,
sign = true,
position = 'overlay',
icons = { '󰲡 ', '󰲣 ', '󰲥 ', '󰲧 ', '󰲩 ', '󰲫 ' },
backgrounds = {
'RenderMarkdownH1Bg',
'RenderMarkdownH2Bg',
'RenderMarkdownH3Bg',
'RenderMarkdownH4Bg',
'RenderMarkdownH5Bg',
'RenderMarkdownH6Bg',
},
foregrounds = {
'RenderMarkdownH1',
'RenderMarkdownH2',
'RenderMarkdownH3',
'RenderMarkdownH4',
'RenderMarkdownH5',
'RenderMarkdownH6',
},
-- Colorschemes
{ "gruvbox-community/gruvbox", priority = 1000 },
{ "folke/tokyonight.nvim", priority = 1000 },
{ "catppuccin/nvim", name = "catppuccin", priority = 1000 },
{ "EdenEast/nightfox.nvim", priority = 1000 },
{ "rose-pine/neovim", name = "rose-pine", priority = 1000 },
{ "rebelot/kanagawa.nvim", priority = 1000 },
{ "sainnhe/everforest", priority = 1000 },
-- Auto-save
{
"okuuva/auto-save.nvim",
version = "v1.*",
event = { "InsertLeave", "TextChanged" },
init = function()
local group = vim.api.nvim_create_augroup("autosave_message", { clear = true })
vim.api.nvim_create_autocmd("User", {
pattern = "AutoSaveWritePost",
group = group,
callback = function(opts)
local saved_buffer = opts.data and opts.data.saved_buffer
if not saved_buffer then
return
end
local filename = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(saved_buffer), ":t")
if filename == "" then
filename = "[No Name]"
end
vim.notify("AutoSave: " .. filename, vim.log.levels.INFO, { title = "auto-save.nvim" })
end,
})
end,
opts = {
enabled = true,
trigger_events = {
immediate_save = { "BufLeave", "FocusLost" },
defer_save = { "InsertLeave", "TextChanged" },
cancel_deferred_save = { "InsertEnter" },
},
},
})
-- Set highlights after ColorScheme event to ensure they persist
vim.api.nvim_create_autocmd("ColorScheme", {
callback = function()
-- Translucent heading backgrounds with alpha blending
vim.api.nvim_set_hl(0, 'RenderMarkdownH1Bg', { bg = '#2d5a7b', fg = 'NONE' })
vim.api.nvim_set_hl(0, 'RenderMarkdownH2Bg', { bg = '#3d5f4e', fg = 'NONE' })
vim.api.nvim_set_hl(0, 'RenderMarkdownH3Bg', { bg = '#5f5e3a', fg = 'NONE' })
vim.api.nvim_set_hl(0, 'RenderMarkdownH4Bg', { bg = '#5f4a3e', fg = 'NONE' })
vim.api.nvim_set_hl(0, 'RenderMarkdownH5Bg', { bg = '#4e4a5f', fg = 'NONE' })
vim.api.nvim_set_hl(0, 'RenderMarkdownH6Bg', { bg = '#4a5e5f', fg = 'NONE' })
-- Bold, colored heading text
vim.api.nvim_set_hl(0, 'RenderMarkdownH1', { fg = '#88c0d0', bold = true })
vim.api.nvim_set_hl(0, 'RenderMarkdownH2', { fg = '#a3be8c', bold = true })
vim.api.nvim_set_hl(0, 'RenderMarkdownH3', { fg = '#ebcb8b', bold = true })
vim.api.nvim_set_hl(0, 'RenderMarkdownH4', { fg = '#d08770', bold = true })
vim.api.nvim_set_hl(0, 'RenderMarkdownH5', { fg = '#b48ead', bold = true })
vim.api.nvim_set_hl(0, 'RenderMarkdownH6', { fg = '#8fbcbb', bold = true })
end,
})
-- Apply highlights immediately
vim.schedule(function()
vim.cmd('doautocmd ColorScheme')
end)
end,
},
-- Code formatting
{ import = "plugins.prettier" },
-- Copilot
{
"zbirenbaum/copilot.lua",
event = "InsertEnter",
opts = {
suggestion = { enabled = true },
panel = { enabled = true },
},
},
-- Indent guides
{
"lukas-reineke/indent-blankline.nvim",
main = "ibl",
opts = {},
},
-- UFO (folding)
{
"kevinhwang91/nvim-ufo",
dependencies = { "kevinhwang91/promise-async" },
event = "BufReadPost",
config = function()
vim.o.foldcolumn = "0"
vim.o.foldlevel = 99
vim.o.foldlevelstart = 99
vim.o.foldenable = true
-- File explorer
{ import = "plugins.nvim-tree" },
require("ufo").setup({
provider_selector = function(bufnr, filetype, buftype)
-- Disable for latex and markdown files
if filetype == "tex" or filetype == "latex" or filetype == "markdown" then
return ""
end
return { "treesitter", "indent" }
-- Treesitter
{ import = "plugins.treesitter" },
-- Rainbow delimiters
{ import = "plugins.rainbow_delimiters" },
-- Git integration
{
"lewis6991/gitsigns.nvim",
event = { "BufReadPre", "BufNewFile" },
opts = {
signs = {
add = { text = "" },
change = { text = "" },
delete = { text = "_" },
topdelete = { text = "" },
changedelete = { text = "~" },
untracked = { text = "" },
},
signcolumn = false, -- Disable signs by default
numhl = false, -- Disable number highlights by default
linehl = false, -- Disable line highlights by default
word_diff = false,
current_line_blame = false,
}
},
{
"tpope/vim-fugitive",
cmd = { "Git", "Gvdiffsplit" },
},
{
"kdheepak/lazygit.nvim",
dependencies = { "nvim-lua/plenary.nvim" },
cmd = {
"LazyGit",
"LazyGitConfig",
"LazyGitCurrentFile",
"LazyGitFilter",
"LazyGitFilterCurrentFile",
},
keys = {
{ "<leader>gg", "<cmd>LazyGit<cr>", desc = "LazyGit" },
},
},
-- Status line
{ import = "plugins.lualine" },
-- Tmux statusline generator (run :TmuxlineSnapshot ~/.config/tmux/themes/tmuxline.tmux)
{
"edkolev/tmuxline.vim",
cmd = { "Tmuxline", "TmuxlineSnapshot" },
config = function()
vim.g.tmuxline_separators = {
left = "",
left_alt = "",
right = "",
right_alt = "",
space = " ",
}
vim.g.tmuxline_preset = {
a = "#S",
win = "#I #W",
cwin = "#I #W",
y = "%H:%M",
z = "%d %b",
}
end,
})
end,
},
},
-- FZF
{
"junegunn/fzf",
build = function()
vim.fn["fzf#install"]()
end,
},
{ "junegunn/fzf.vim" },
-- Productivity
{ "numToStr/Comment.nvim", event = "VeryLazy", opts = {} },
{ "windwp/nvim-autopairs", event = "InsertEnter", opts = {} },
{ "tpope/vim-surround", event = "VeryLazy" },
-- -- Tmux navigation
-- { "christoomey/vim-tmux-navigator" },
-- LaTeX
{ import = "plugins.vimtex" },
-- Org-mode
{
"nvim-orgmode/orgmode",
dependencies = { "nvim-treesitter/nvim-treesitter" },
opts = {},
},
-- Telescope
{
"nvim-telescope/telescope.nvim",
dependencies = { "nvim-lua/plenary.nvim" },
keys = {
{ "<leader>ff", ":Telescope find_files<CR>", desc = "Find files" },
{ "<leader>fg", ":Telescope live_grep<CR>", desc = "Live grep" },
{ "<leader>fb", ":Telescope buffers<CR>", desc = "Buffers" },
{ "<leader>fh", ":Telescope help_tags<CR>", desc = "Help tags" },
},
},
-- Yazi file manager
{
"mikavilpas/yazi.nvim",
keys = {
{ "<leader>y", ":Yazi<CR>", desc = "Open Yazi" },
},
opts = {
open_for_directories = false,
keymaps = {
show_help = "<F1>",
},
},
},
-- Markdown
{ "SidOfc/mkdx", ft = "markdown" },
{
"MeanderingProgrammer/render-markdown.nvim",
dependencies = { "nvim-treesitter/nvim-treesitter", "echasnovski/mini.icons" },
ft = { "markdown", "norg", "rmd", "org" },
config = function()
require('render-markdown').setup({
heading = {
enabled = true,
sign = true,
position = 'overlay',
icons = { '󰲡 ', '󰲣 ', '󰲥 ', '󰲧 ', '󰲩 ', '󰲫 ' },
backgrounds = {
'RenderMarkdownH1Bg',
'RenderMarkdownH2Bg',
'RenderMarkdownH3Bg',
'RenderMarkdownH4Bg',
'RenderMarkdownH5Bg',
'RenderMarkdownH6Bg',
},
foregrounds = {
'RenderMarkdownH1',
'RenderMarkdownH2',
'RenderMarkdownH3',
'RenderMarkdownH4',
'RenderMarkdownH5',
'RenderMarkdownH6',
},
},
})
end,
},
-- Code formatting
{ import = "plugins.prettier" },
-- Copilot
{
"zbirenbaum/copilot.lua",
event = "InsertEnter",
opts = {
suggestion = { enabled = true },
panel = { enabled = true },
},
},
-- Indent guides
{
"lukas-reineke/indent-blankline.nvim",
main = "ibl",
event = { "BufReadPost", "BufNewFile" },
opts = {},
},
-- UFO (folding)
{
"kevinhwang91/nvim-ufo",
dependencies = { "kevinhwang91/promise-async" },
event = "BufReadPost",
config = function()
vim.o.foldcolumn = "0"
vim.o.foldlevel = 99
vim.o.foldlevelstart = 99
vim.o.foldenable = true
require("ufo").setup({
provider_selector = function(bufnr, filetype, buftype)
-- Disable for latex and markdown files
if filetype == "tex" or filetype == "latex" or filetype == "markdown" then
return ""
end
return { "treesitter", "indent" }
end,
})
end,
},
}

View File

@@ -1,67 +1,66 @@
local colors = {
bg = "none",
fg = "#ebdbb2",
yellow = "#fabd2f",
cyan = "#8ec07c",
darkblue = "#458588",
green = "#b8bb26",
orange = "#fe8019",
violet = "#d3869b",
magenta = "#d3869b",
blue = "#83a598",
red = "#fb4934",
grey = "#504945",
black = "#282828",
white = "#fbf1c7",
darkgrey = "#3c3836",
lightgrey = "#665c54",
base = "#1e1e2e",
surface0 = "#313244",
surface1 = "#45475a",
overlay0 = "#6c7086",
text = "#cdd6f4",
subtext = "#a6adc8",
crust = "#11111b",
mauve = "#cba6f7",
blue = "#89b4fa",
green = "#a6e3a1",
red = "#f38ba8",
yellow = "#f9e2af",
peach = "#fab387",
lavender = "#b4befe",
cyan = "#94e2d5",
}
local theme = {
normal = {
a = { fg = colors.black, bg = colors.blue, gui = "bold" },
b = { fg = colors.blue, bg = colors.grey },
c = { fg = colors.white, bg = colors.darkgrey },
x = { fg = colors.white, bg = colors.darkgrey },
y = { fg = colors.blue, bg = colors.grey },
z = { fg = colors.black, bg = colors.blue, gui = "bold" },
a = { fg = colors.crust, bg = colors.mauve, gui = "bold" },
b = { fg = colors.mauve, bg = colors.surface1 },
c = { fg = colors.text, bg = colors.base },
x = { fg = colors.text, bg = colors.base },
y = { fg = colors.mauve, bg = colors.surface1 },
z = { fg = colors.crust, bg = colors.mauve, gui = "bold" },
},
insert = {
a = { fg = colors.black, bg = colors.green, gui = "bold" },
b = { fg = colors.green, bg = colors.grey },
c = { fg = colors.white, bg = colors.darkgrey },
x = { fg = colors.white, bg = colors.darkgrey },
y = { fg = colors.green, bg = colors.grey },
z = { fg = colors.black, bg = colors.green, gui = "bold" },
a = { fg = colors.crust, bg = colors.green, gui = "bold" },
b = { fg = colors.green, bg = colors.surface1 },
c = { fg = colors.text, bg = colors.base },
x = { fg = colors.text, bg = colors.base },
y = { fg = colors.green, bg = colors.surface1 },
z = { fg = colors.crust, bg = colors.green, gui = "bold" },
},
visual = {
a = { fg = colors.black, bg = colors.magenta, gui = "bold" },
b = { fg = colors.magenta, bg = colors.grey },
c = { fg = colors.white, bg = colors.darkgrey },
x = { fg = colors.white, bg = colors.darkgrey },
y = { fg = colors.magenta, bg = colors.grey },
z = { fg = colors.black, bg = colors.magenta, gui = "bold" },
a = { fg = colors.crust, bg = colors.lavender, gui = "bold" },
b = { fg = colors.lavender, bg = colors.surface1 },
c = { fg = colors.text, bg = colors.base },
x = { fg = colors.text, bg = colors.base },
y = { fg = colors.lavender, bg = colors.surface1 },
z = { fg = colors.crust, bg = colors.lavender, gui = "bold" },
},
replace = {
a = { fg = colors.black, bg = colors.red, gui = "bold" },
b = { fg = colors.red, bg = colors.grey },
c = { fg = colors.white, bg = colors.darkgrey },
x = { fg = colors.white, bg = colors.darkgrey },
y = { fg = colors.red, bg = colors.grey },
z = { fg = colors.black, bg = colors.red, gui = "bold" },
a = { fg = colors.crust, bg = colors.red, gui = "bold" },
b = { fg = colors.red, bg = colors.surface1 },
c = { fg = colors.text, bg = colors.base },
x = { fg = colors.text, bg = colors.base },
y = { fg = colors.red, bg = colors.surface1 },
z = { fg = colors.crust, bg = colors.red, gui = "bold" },
},
command = {
a = { fg = colors.black, bg = colors.yellow, gui = "bold" },
b = { fg = colors.yellow, bg = colors.grey },
c = { fg = colors.white, bg = colors.darkgrey },
x = { fg = colors.white, bg = colors.darkgrey },
y = { fg = colors.yellow, bg = colors.grey },
z = { fg = colors.black, bg = colors.yellow, gui = "bold" },
a = { fg = colors.crust, bg = colors.yellow, gui = "bold" },
b = { fg = colors.yellow, bg = colors.surface1 },
c = { fg = colors.text, bg = colors.base },
x = { fg = colors.text, bg = colors.base },
y = { fg = colors.yellow, bg = colors.surface1 },
z = { fg = colors.crust, bg = colors.yellow, gui = "bold" },
},
inactive = {
a = { fg = colors.white, bg = colors.darkgrey },
b = { fg = colors.white, bg = colors.darkgrey },
c = { fg = colors.white, bg = colors.darkgrey },
a = { fg = colors.subtext, bg = colors.base },
b = { fg = colors.subtext, bg = colors.base },
c = { fg = colors.subtext, bg = colors.base },
},
}
@@ -146,7 +145,7 @@ return {
end
return "󰅠 " .. table.concat(client_names, ", ")
end,
color = { fg = colors.cyan },
color = { fg = colors.cyan },
separator = { left = "" }
},
{