Files
dotfiles/nvim/lua/plugins/init.lua
Thomas Naderer d8a20d620a chore: clean up dotfiles and add gitignore whitelist
Switch to whitelist-based .gitignore to only track essential configs:
nvim, yazi, kitty, zsh, ideavim, karabiner, tmux, scripts, starship.
Remove history, compiled files, and plugin dirs from tracking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 12:57:14 +01:00

303 lines
9.5 KiB
Lua

-- ~/.config/nvim/lua/plugins/init.lua
return {
-- Colorschemes
{ "gruvbox-community/gruvbox", priority = 1000 },
{ "folke/tokyonight.nvim", priority = 1000 },
{ "catppuccin/nvim", name = "catppuccin", priority = 1000 },
-- Auto-save
{
"okuuva/auto-save.nvim",
version = "v1.*",
event = { "InsertLeave", "TextChanged" },
opts = {
enabled = true,
trigger_events = {
immediate_save = { "BufLeave", "FocusLost" },
defer_save = { "InsertLeave", "TextChanged" },
cancel_deferred_save = { "InsertEnter" },
},
},
},
-- File explorer
{ import = "plugins.nvim-tree" },
-- 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,
}
},
{
"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 = " ",
}
-- Tokyo Night Moon colors, transparent background
vim.g.tmuxline_theme = {
a = { "#1e2030", "#82aaff" },
b = { "#82aaff", "default" },
c = { "#636da6", "default" },
x = { "#636da6", "default" },
y = { "#82aaff", "default" },
z = { "#1e2030", "#82aaff" },
win = { "#636da6", "default" },
cwin = { "#1e2030", "#c099ff" },
bg = { "#636da6", "default" },
}
vim.g.tmuxline_preset = {
a = "#S",
win = "#I #W",
cwin = "#I #W",
y = "%H:%M",
z = "%d %b",
}
end,
},
-- Productivity
{ "windwp/nvim-autopairs", event = "InsertEnter", opts = {} },
{ "tpope/vim-surround", event = "VeryLazy" },
-- Flash: jump anywhere with 2 chars (replaces f/t for long range)
{
"folke/flash.nvim",
event = "VeryLazy",
opts = {
modes = {
char = {
enabled = false,
},
},
},
keys = {
{ "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash jump" },
{ "S", mode = { "n", "x", "o" }, function() require("flash").treesitter() end, desc = "Flash treesitter" },
},
},
-- Which-key: show available keybindings after leader
{
"folke/which-key.nvim",
event = "VeryLazy",
opts = {
spec = {
{ "<leader>f", group = "find" },
{ "<leader>g", group = "git" },
{ "<leader>s", group = "split/spell" },
{ "<leader>w", group = "write" },
{ "<leader>d", group = "date" },
{ "<leader>l", group = "lsp" },
},
},
},
-- Snacks: notifications + quality-of-life utilities
{
"folke/snacks.nvim",
priority = 1000,
lazy = false,
opts = {
notifier = { enabled = true },
words = { enabled = true },
},
},
-- -- 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" },
{
"epwalsh/obsidian.nvim",
version = "*",
lazy = true,
ft = "markdown",
dependencies = { "nvim-lua/plenary.nvim" },
keys = {
{ "<leader>on", "<cmd>ObsidianNew<cr>", desc = "New note" },
{ "<leader>oo", "<cmd>ObsidianQuickSwitch<cr>", desc = "Quick switch" },
{ "<leader>os", "<cmd>ObsidianSearch<cr>", desc = "Search notes" },
{ "<leader>ob", "<cmd>ObsidianBacklinks<cr>", desc = "Backlinks" },
{ "<leader>ot", "<cmd>ObsidianTags<cr>", desc = "Tags" },
{ "<leader>od", "<cmd>ObsidianToday<cr>", desc = "Today's note" },
},
opts = {
workspaces = {
{ name = "private", path = "~/Library/Mobile Documents/iCloud~md~obsidian/Documents/Private" },
{ name = "work", path = "~/Library/Mobile Documents/iCloud~md~obsidian/Documents/Work" },
},
completion = { nvim_cmp = false, min_chars = 2 },
ui = { enable = false }, -- render-markdown.nvim übernimmt das
disable_frontmatter = true,
},
},
{
"iamcco/markdown-preview.nvim",
cmd = { "MarkdownPreview", "MarkdownPreviewStop", "MarkdownPreviewToggle" },
ft = { "markdown" },
build = function() vim.fn["mkdp#util#install"]() end,
keys = {
{ "<leader>mp", "<cmd>MarkdownPreviewToggle<cr>", desc = "Markdown Preview" },
},
},
{
"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,
},
}