add nvim config (fix double-nested lua structure)

This commit is contained in:
Jonas H
2026-02-28 00:08:15 +01:00
parent 1c0a1b5d7a
commit 45c334ad92
15 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,50 @@
-- Standalone autocmds (migrated from NvChad)
local autocmd = vim.api.nvim_create_autocmd
autocmd({ "BufRead", "BufNewFile" }, { pattern = "*.wesl", command = "setfiletype wesl" })
-- Register wgsl as the treesitter language for wesl files
vim.treesitter.language.register("wgsl", "wesl")
-- Terminal group
local terminal_group = vim.api.nvim_create_augroup("terminal", { clear = true })
-- Auto-close terminal buffers on exit
autocmd("TermClose", {
group = terminal_group,
command = "bdelete!"
})
-- Start terminal in insert mode for autoscroll
autocmd("TermOpen", {
group = terminal_group,
command = "startinsert"
})
-- User event that loads after UIEnter + only if file buf is there
-- This is used by plugins for lazy loading via "User FilePost" event
autocmd({ "UIEnter", "BufReadPost", "BufNewFile" }, {
group = vim.api.nvim_create_augroup("FilePost", { clear = true }),
callback = function(args)
local file = vim.api.nvim_buf_get_name(args.buf)
local buftype = vim.api.nvim_get_option_value("buftype", { buf = args.buf })
if not vim.g.ui_entered and args.event == "UIEnter" then
vim.g.ui_entered = true
end
if file ~= "" and buftype ~= "nofile" and vim.g.ui_entered then
vim.api.nvim_exec_autocmds("User", { pattern = "FilePost", modeline = false })
vim.api.nvim_del_augroup_by_name "FilePost"
vim.schedule(function()
vim.api.nvim_exec_autocmds("FileType", {})
if vim.g.editorconfig then
require("editorconfig").config(args.buf)
end
end)
end
end,
})

View File

@@ -0,0 +1,103 @@
-- Barbar configuration with bearded-arc colors
local colors = {
bg = "#1c2433", -- black (main bg)
bg_inactive = "#232b3a", -- black2 (inactive tabs)
fg = "#c3cfd9", -- base05
fg_inactive = "#626a79", -- light_grey
white = "#ABB7C1", -- white (active text)
selected_bg = "#303847", -- one_bg2 (selected tab bg)
modified = "#3CEC85", -- green
error = "#FF738A", -- red
warn = "#EACD61", -- yellow
info = "#69C3FF", -- blue
hint = "#bd93ff", -- purple
nord_blue = "#6da4cd", -- accent color
}
require("barbar").setup({
animation = false,
auto_hide = false,
tabpages = true,
clickable = true,
focus_on_close = "left",
highlight_alternate = false,
highlight_inactive_file_icons = false,
highlight_visible = false,
icons = {
buffer_index = false,
buffer_number = false,
button = "",
diagnostics = {
[vim.diagnostic.severity.ERROR] = { enabled = true, icon = " " },
[vim.diagnostic.severity.WARN] = { enabled = false },
[vim.diagnostic.severity.INFO] = { enabled = false },
[vim.diagnostic.severity.HINT] = { enabled = false },
},
gitsigns = {
added = { enabled = false },
changed = { enabled = false },
deleted = { enabled = false },
},
filetype = {
custom_colors = false,
enabled = false,
},
separator = { left = "", right = "" },
separator_at_end = true,
modified = { button = "" },
pinned = { button = "󰐃 ", filename = true },
preset = "default",
alternate = { filetype = { enabled = false } },
current = { buffer_index = false },
inactive = { button = "" },
visible = { modified = { buffer_number = false } },
},
insert_at_end = false,
insert_at_start = false,
maximum_padding = 1,
minimum_padding = 1,
maximum_length = 15,
minimum_length = 15, -- Set to same as maximum for uniform width
semantic_letters = true,
sidebar_filetypes = {
undotree = { text = "undotree" },
},
no_name_title = nil,
})
-- Set custom highlight groups to match bearded-arc theme
vim.api.nvim_set_hl(0, "BufferCurrent", { fg = colors.white, bg = colors.bg, bold = true })
vim.api.nvim_set_hl(0, "BufferCurrentIndex", { fg = colors.white, bg = colors.bg })
vim.api.nvim_set_hl(0, "BufferCurrentMod", { fg = colors.modified, bg = colors.bg, bold = true })
vim.api.nvim_set_hl(0, "BufferCurrentSign", { fg = colors.nord_blue, bg = colors.bg })
vim.api.nvim_set_hl(0, "BufferCurrentTarget", { fg = colors.error, bg = colors.bg, bold = true })
vim.api.nvim_set_hl(0, "BufferVisible", { fg = colors.fg, bg = colors.bg_inactive })
vim.api.nvim_set_hl(0, "BufferVisibleIndex", { fg = colors.fg, bg = colors.bg_inactive })
vim.api.nvim_set_hl(0, "BufferVisibleMod", { fg = colors.modified, bg = colors.bg_inactive })
vim.api.nvim_set_hl(0, "BufferVisibleSign", { fg = colors.fg_inactive, bg = colors.bg_inactive })
vim.api.nvim_set_hl(0, "BufferVisibleTarget", { fg = colors.error, bg = colors.bg_inactive, bold = true })
vim.api.nvim_set_hl(0, "BufferInactive", { fg = colors.fg_inactive, bg = colors.bg_inactive })
vim.api.nvim_set_hl(0, "BufferInactiveIndex", { fg = colors.fg_inactive, bg = colors.bg_inactive })
vim.api.nvim_set_hl(0, "BufferInactiveMod", { fg = colors.modified, bg = colors.bg_inactive })
vim.api.nvim_set_hl(0, "BufferInactiveSign", { fg = colors.fg_inactive, bg = colors.bg_inactive })
vim.api.nvim_set_hl(0, "BufferInactiveTarget", { fg = colors.error, bg = colors.bg_inactive })
vim.api.nvim_set_hl(0, "BufferTabpages", { fg = colors.nord_blue, bg = colors.bg_inactive, bold = true })
vim.api.nvim_set_hl(0, "BufferTabpageFill", { fg = colors.fg_inactive, bg = colors.bg_inactive })
vim.api.nvim_set_hl(0, "BufferOffset", { fg = colors.fg_inactive, bg = colors.bg_inactive })
-- Error diagnostics highlight
vim.api.nvim_set_hl(0, "BufferCurrentERROR", { fg = colors.error, bg = colors.bg })
vim.api.nvim_set_hl(0, "BufferVisibleERROR", { fg = colors.error, bg = colors.bg_inactive })
vim.api.nvim_set_hl(0, "BufferInactiveERROR", { fg = colors.error, bg = colors.bg_inactive })

View File

@@ -0,0 +1,20 @@
-- Track which mode we're in (work or normal)
vim.g.claude_mode = "normal"
local function get_claude_command()
if vim.g.claude_mode == "work" then
return {
bin = "sh",
bin_args = {
"-c",
"CLAUDE_CONFIG_DIR=~/.claude-work claude"
},
}
else
return {
bin = "claude",
}
end
end
require("claudecode").setup(get_claude_command())

View File

@@ -0,0 +1,15 @@
local options = {
formatters_by_ft = {
lua = { "stylua" },
-- css = { "prettier" },
-- html = { "prettier" },
},
-- format_on_save = {
-- -- These options will be passed to conform.format()
-- timeout_ms = 500,
-- lsp_fallback = true,
-- },
}
return options

View File

@@ -0,0 +1,24 @@
return {
-- Recognized filetypes for C#
filetypes = { "cs", "vb" },
-- Root directory detection: looks for .sln, .csproj, or version control folders
root_dir = function(fname)
local util = require("lspconfig.util")
return util.root_pattern("*.sln")(fname)
or util.root_pattern("*.csproj")(fname)
or util.root_pattern(".git", ".hg")(fname)
or util.path.dirname(fname)
end,
-- Additional settings for csharp_ls (expand as needed)
settings = {
csharp = {
formatting = {
enable = true, -- Enable formatting if supported
},
-- Add further csharp_ls settings here
},
},
}

View File

@@ -0,0 +1,123 @@
-- fzf-lua configuration with bearded-arc colors
require("fzf-lua").setup({
"default-title",
winopts = {
height = 0.85,
width = 0.80,
row = 0.35,
col = 0.50,
border = "rounded",
preview = {
border = "rounded",
wrap = "nowrap",
hidden = "nohidden",
vertical = "down:45%",
horizontal = "right:60%",
layout = "flex",
flip_columns = 120,
scrollbar = "float",
},
},
fzf_opts = {
["--no-scrollbar"] = true,
["--info"] = "inline-right",
},
keymap = {
builtin = {
["<C-d>"] = "preview-page-down",
["<C-u>"] = "preview-page-up",
},
fzf = {
["ctrl-q"] = "select-all+accept",
["tab"] = "down",
["shift-tab"] = "up",
},
},
files = {
prompt = "Files ",
file_icons = true,
git_icons = false,
fd_opts = [[--color=never --type f --hidden --follow --exclude .git --exclude node_modules]],
file_ignore_patterns = {"%.git$", "%.xml$" },
},
grep = {
prompt = "Grep ",
input_prompt = "Grep For ",
file_icons = true,
git_icons = false,
rg_opts = "--column --line-number --no-heading --color=always --smart-case --max-columns=4096 -e",
},
oldfiles = {
prompt = "History ",
cwd_only = false,
stat_file = true,
include_current_session = true,
},
buffers = {
prompt = "Buffers ",
file_icons = true,
color_icons = true,
sort_lastused = true,
},
lsp = {
prompt_postfix = " ",
file_icons = true,
git_icons = false,
lsp_icons = true,
symbols = {
prompt = "Symbols ",
async = true,
symbol_icons = {
File = " ",
Module = " ",
Namespace = " ",
Package = " ",
Class = " ",
Method = " ",
Property = " ",
Field = " ",
Constructor = " ",
Enum = " ",
Interface = " ",
Function = " ",
Variable = " ",
Constant = " ",
String = " ",
Number = " ",
Boolean = " ",
Array = " ",
Object = " ",
Key = " ",
Null = " ",
EnumMember = " ",
Struct = " ",
Event = " ",
Operator = " ",
TypeParameter = " ",
},
},
},
diagnostics = {
prompt = "Diagnostics ",
file_icons = true,
git_icons = false,
diag_icons = true,
icon_padding = " ",
severity_sort = true,
severity_limit = nil,
severity_bound = nil,
fzf_opts = {
["--tiebreak"] = "index",
},
signs = {
["Error"] = { text = " ", texthl = "DiagnosticError" },
["Warn"] = { text = " ", texthl = "DiagnosticWarn" },
["Info"] = { text = " ", texthl = "DiagnosticInfo" },
["Hint"] = { text = " ", texthl = "DiagnosticHint" },
},
},
})
-- Setup fzf-lua as vim.ui.select provider
require("fzf-lua").register_ui_select()

View File

@@ -0,0 +1,47 @@
return {
defaults = { lazy = true },
install = { colorscheme = { "nvchad" } },
ui = {
icons = {
ft = "",
lazy = "󰂠 ",
loaded = "",
not_loaded = "",
},
},
performance = {
rtp = {
disabled_plugins = {
"2html_plugin",
"tohtml",
"getscript",
"getscriptPlugin",
"gzip",
"logipat",
"netrw",
"netrwPlugin",
"netrwSettings",
"netrwFileHandlers",
"matchit",
"tar",
"tarPlugin",
"rrhelper",
"spellfile_plugin",
"vimball",
"vimballPlugin",
"zip",
"zipPlugin",
"tutor",
"rplugin",
"syntax",
"synmenu",
"optwin",
"compiler",
"bugreport",
"ftplugin",
},
},
},
}

View File

@@ -0,0 +1,138 @@
-- LSP capabilities (with blink.cmp completion support)
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities.textDocument.completion.completionItem = {
documentationFormat = { "markdown", "plaintext" },
snippetSupport = true,
preselectSupport = true,
insertReplaceSupport = true,
labelDetailsSupport = true,
deprecatedSupport = true,
commitCharactersSupport = true,
tagSupport = { valueSet = { 1 } },
resolveSupport = {
properties = {
"documentation",
"detail",
"additionalTextEdits",
},
},
}
-- on_attach function with LSP keybindings
local on_attach = function(client, bufnr)
local function opts(desc)
return { buffer = bufnr, desc = "LSP " .. desc }
end
local map = vim.keymap.set
-- Navigation
map("n", "gD", vim.lsp.buf.declaration, opts "Go to declaration")
map("n", "gd", vim.lsp.buf.definition, opts "Go to definition")
map("n", "gi", vim.lsp.buf.implementation, opts "Go to implementation")
map("n", "gr", vim.lsp.buf.references, opts "Show references")
map("n", "<leader>sh", vim.lsp.buf.signature_help, opts "Show signature help")
map("n", "<leader>D", vim.lsp.buf.type_definition, opts "Go to type definition")
-- Workspace
map("n", "<leader>wa", vim.lsp.buf.add_workspace_folder, opts "Add workspace folder")
map("n", "<leader>wr", vim.lsp.buf.remove_workspace_folder, opts "Remove workspace folder")
map("n", "<leader>wl", function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, opts "List workspace folders")
-- Actions
map("n", "<leader>ra", vim.lsp.buf.rename, opts "Rename symbol")
map({ "n", "v" }, "<leader>ca", vim.lsp.buf.code_action, opts "Code action")
-- Diagnostics (already mapped in mappings.lua, but keeping for consistency)
map("n", "[d", vim.diagnostic.goto_prev, opts "Go to previous diagnostic")
map("n", "]d", vim.diagnostic.goto_next, opts "Go to next diagnostic")
map("n", "<leader>q", vim.diagnostic.setloclist, opts "Set loclist")
end
-- Disable semantic tokens (performance optimization)
local on_init = function(client, _)
if client.supports_method "textDocument/semanticTokens" then
client.server_capabilities.semanticTokensProvider = nil
end
end
local servers = {
rust_analyzer = {
filetypes = { "rust" },
on_attach = on_attach,
on_init = on_init,
capabilities = capabilities,
settings = {
["rust-analyzer"] = {
completion = {
addCallParenthesis = true,
addCallArgumentSnippets = false,
postfix = {
enabled = false,
},
},
callInfo = {
full = false,
},
}
}
},
csharp_ls = {
filetypes = { "cs" },
on_attach = on_attach,
on_init = on_init,
capabilities = capabilities,
},
clangd = {
filetypes = { "c", "cpp", "objc", "objcpp" },
on_attach = on_attach,
on_init = on_init,
capabilities = capabilities,
},
glsl_analyzer = {
filetypes = { "glsl" },
on_attach = on_attach,
on_init = on_init,
capabilities = capabilities,
},
wgsl_analyzer = {
filetypes = { "wgsl", "wesl" },
on_attach = on_attach,
on_init = on_init,
capabilities = capabilities,
},
pylsp = {
filetypes = { "python" },
on_attach = on_attach,
on_init = on_init,
capabilities = capabilities,
},
ron_lsp = {
cmd = { "ron-lsp" },
filetypes = { "ron" },
root_dir = function(fname)
local util = require("lspconfig.util")
return util.root_pattern("Cargo.toml", ".git")(fname) or vim.loop.cwd()
end,
on_attach = on_attach,
on_init = on_init,
capabilities = capabilities,
},
}
for server, opts in pairs(servers) do
vim.lsp.config(server, opts)
if opts.filetypes then
vim.api.nvim_create_autocmd("FileType", {
pattern = opts.filetypes,
callback = function()
vim.lsp.enable(server)
end,
})
else
vim.lsp.enable(server)
end
end

View File

@@ -0,0 +1,211 @@
-- Lualine configuration with bearded-arc theme colors
local colors = {
bg = "#232b3a", -- statusline_bg
fg = "#c3cfd9", -- base05
white = "#ABB7C1", -- white
black = "#1c2433", -- black
grey = "#444c5b", -- grey
light_grey = "#626a79", -- light_grey
-- Mode colors
nord_blue = "#6da4cd", -- normal mode
cyan = "#22ECDB", -- visual mode
dark_purple = "#B78AFF", -- insert mode
green = "#3CEC85", -- success/terminal
red = "#FF738A", -- errors/replace
yellow = "#EACD61", -- warnings
orange = "#FF955C", -- command
blue = "#69C3FF", -- info
-- Section backgrounds
lightbg = "#303847", -- file section bg
}
-- Custom theme based on bearded-arc
local bearded_arc_theme = {
normal = {
a = { bg = colors.nord_blue, fg = colors.black, gui = "bold" },
b = { bg = colors.lightbg, fg = colors.white },
c = { bg = colors.bg, fg = colors.fg },
},
insert = {
a = { bg = colors.dark_purple, fg = colors.black, gui = "bold" },
b = { bg = colors.lightbg, fg = colors.white },
},
visual = {
a = { bg = colors.cyan, fg = colors.black, gui = "bold" },
b = { bg = colors.lightbg, fg = colors.white },
},
replace = {
a = { bg = colors.red, fg = colors.black, gui = "bold" },
b = { bg = colors.lightbg, fg = colors.white },
},
command = {
a = { bg = colors.orange, fg = colors.black, gui = "bold" },
b = { bg = colors.lightbg, fg = colors.white },
},
terminal = {
a = { bg = colors.green, fg = colors.black, gui = "bold" },
b = { bg = colors.lightbg, fg = colors.white },
},
inactive = {
a = { bg = colors.bg, fg = colors.grey },
b = { bg = colors.bg, fg = colors.grey },
c = { bg = colors.bg, fg = colors.grey },
},
}
-- Custom component for LSP status
local function lsp_status()
local clients = vim.lsp.get_clients({ bufnr = 0 })
if #clients == 0 then
return ""
end
local client_names = {}
for _, client in ipairs(clients) do
table.insert(client_names, client.name)
end
return " " .. table.concat(client_names, ", ")
end
-- Custom component for LSP diagnostics count
local function lsp_diagnostics()
local error_count = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.ERROR })
local warn_count = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.WARN })
local info_count = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.INFO })
local hint_count = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.HINT })
local parts = {}
if error_count > 0 then
table.insert(parts, string.format("%%#DiagnosticError# %d", error_count))
end
if warn_count > 0 then
table.insert(parts, string.format("%%#DiagnosticWarn# %d", warn_count))
end
if info_count > 0 then
table.insert(parts, string.format("%%#DiagnosticInfo# %d", info_count))
end
if hint_count > 0 then
table.insert(parts, string.format("%%#DiagnosticHint# %d", hint_count))
end
return table.concat(parts, " ")
end
-- Custom component for git status
local function git_status()
local gitsigns = vim.b.gitsigns_status_dict
if not gitsigns then
return ""
end
local parts = {}
if gitsigns.added and gitsigns.added > 0 then
table.insert(parts, string.format("%%#GitSignsAdd#+%d", gitsigns.added))
end
if gitsigns.changed and gitsigns.changed > 0 then
table.insert(parts, string.format("%%#GitSignsChange#~%d", gitsigns.changed))
end
if gitsigns.removed and gitsigns.removed > 0 then
table.insert(parts, string.format("%%#GitSignsDelete#-%d", gitsigns.removed))
end
return table.concat(parts, " ")
end
require("lualine").setup({
options = {
theme = bearded_arc_theme,
component_separators = { left = "", right = "" },
section_separators = { left = "", right = "" },
disabled_filetypes = {
statusline = { "alpha", "dashboard", "NvimTree", "neo-tree" },
winbar = {},
},
ignore_focus = {},
always_divide_middle = true,
globalstatus = true,
refresh = {
statusline = 1000,
tabline = 1000,
winbar = 1000,
},
},
sections = {
lualine_a = {
{
"mode",
fmt = function(str)
return str:sub(1, 1) -- Show only first letter (N, I, V, etc.)
end,
},
},
lualine_b = {
{
"branch",
icon = "",
color = { fg = colors.light_grey },
},
{
git_status,
color = { bg = colors.lightbg },
},
},
lualine_c = {
{
"filename",
path = 1, -- Relative path
symbols = {
modified = " ",
readonly = " ",
unnamed = "[No Name]",
newfile = " ",
},
color = { bg = colors.lightbg, fg = colors.white },
},
{
lsp_diagnostics,
color = { bg = colors.bg },
},
},
lualine_x = {
{
lsp_status,
color = { fg = colors.nord_blue, bg = colors.bg },
},
{
"filetype",
colored = true,
icon_only = false,
icon = { align = "right" },
},
},
lualine_y = {
{
"progress",
color = { bg = colors.lightbg, fg = colors.white },
},
},
lualine_z = {
{
"location",
icon = "",
color = { bg = colors.green, fg = colors.black },
},
},
},
inactive_sections = {
lualine_a = {},
lualine_b = {},
lualine_c = { "filename" },
lualine_x = { "location" },
lualine_y = {},
lualine_z = {},
},
tabline = {},
winbar = {},
inactive_winbar = {},
extensions = { "lazy", "mason" },
})

View File

@@ -0,0 +1,174 @@
-- Standalone mappings (migrated from NvChad + custom)
local map = vim.keymap.set
-- === Basic Mappings ===
-- Command mode
map("n", ";", ":", { desc = "CMD enter command mode" })
map("i", "jk", "<ESC>", { desc = "Escape insert mode" })
-- Insert mode navigation
map("i", "<C-b>", "<ESC>^i", { desc = "Move beginning of line" })
map("i", "<C-e>", "<End>", { desc = "Move end of line" })
map("i", "<C-h>", "<Left>", { desc = "Move left" })
map("i", "<C-l>", "<Right>", { desc = "Move right" })
-- Window navigation
map("n", "<C-h>", "<C-w>h", { desc = "Switch window left" })
map("n", "<C-l>", "<C-w>l", { desc = "Switch window right" })
-- General
map("n", "<Esc>", "<cmd>noh<CR>", { desc = "Clear highlights" })
map("n", "<C-s>", "<cmd>w<CR>", { desc = "Save file" })
map("n", "<C-c>", "<cmd>%y+<CR>", { desc = "Copy whole file" })
-- Toggle options
map("n", "<leader>n", "<cmd>set nu!<CR>", { desc = "Toggle line number" })
map("n", "<leader>rn", "<cmd>set rnu!<CR>", { desc = "Toggle relative number" })
-- Format
map({ "n", "x" }, "<leader>fm", function()
require("conform").format { lsp_fallback = true }
end, { desc = "Format file" })
-- Comment
map("n", "<leader>/", "gcc", { desc = "Toggle comment", remap = true })
map("v", "<leader>/", "gc", { desc = "Toggle comment", remap = true })
-- === LSP Mappings ===
map("n", "<leader>ds", vim.diagnostic.setloclist, { desc = "LSP diagnostic loclist" })
-- === Barbar buffer navigation ===
map("n", "<Tab>", "<cmd>BufferNext<cr>", { desc = "Next buffer" })
map("n", "<S-Tab>", "<cmd>BufferPrevious<cr>", { desc = "Previous buffer" })
map("n", "<leader>x", "<cmd>BufferClose<cr>", { desc = "Close buffer" })
map("n", "<leader>X", "<cmd>BufferClose!<cr>", { desc = "Force close buffer" })
map("n", "<leader>bn", "<cmd>enew<cr>", { desc = "New buffer" })
map("n", "<leader>bj", "<cmd>BufferPick<cr>", { desc = "Jump to buffer" })
map("n", "<leader>bp", "<cmd>BufferPin<cr>", { desc = "Pin/unpin buffer" })
map("n", "<A-,>", "<cmd>BufferPrevious<cr>", { desc = "Previous buffer" })
map("n", "<A-.>", "<cmd>BufferNext<cr>", { desc = "Next buffer" })
map("n", "<A-<>", "<cmd>BufferMovePrevious<cr>", { desc = "Move buffer left" })
map("n", "<A->>", "<cmd>BufferMoveNext<cr>", { desc = "Move buffer right" })
map("n", "<leader>bc", "<cmd>BufferCloseAllButCurrent<cr>", { desc = "Close all but current" })
map("n", "<leader>bC", "<cmd>BufferCloseAllButPinned<cr>", { desc = "Close all but pinned" })
map("n", "<A-1>", "<cmd>BufferGoto 1<cr>", { desc = "Go to buffer 1" })
map("n", "<A-2>", "<cmd>BufferGoto 2<cr>", { desc = "Go to buffer 2" })
map("n", "<A-3>", "<cmd>BufferGoto 3<cr>", { desc = "Go to buffer 3" })
map("n", "<A-4>", "<cmd>BufferGoto 4<cr>", { desc = "Go to buffer 4" })
map("n", "<A-5>", "<cmd>BufferGoto 5<cr>", { desc = "Go to buffer 5" })
map("n", "<A-6>", "<cmd>BufferGoto 6<cr>", { desc = "Go to buffer 6" })
map("n", "<A-7>", "<cmd>BufferGoto 7<cr>", { desc = "Go to buffer 7" })
map("n", "<A-8>", "<cmd>BufferGoto 8<cr>", { desc = "Go to buffer 8" })
map("n", "<A-9>", "<cmd>BufferGoto 9<cr>", { desc = "Go to buffer 9" })
map("n", "<A-0>", "<cmd>BufferLast<cr>", { desc = "Go to last buffer" })
-- === fzf-lua ===
local fzf = require('fzf-lua')
-- File finding
map("n", "<leader>ff", function() fzf.files() end, { desc = "Find files" })
map("n", "<leader>fa", function() fzf.files({ cmd = "fd --type f --hidden --follow --exclude .git" }) end, { desc = "Find all files" })
map("n", "<leader>fo", function() fzf.oldfiles() end, { desc = "Recent files" })
map("n", "<leader>fb", function() fzf.buffers() end, { desc = "Find buffers" })
-- Grep
map("n", "<leader>fw", function() fzf.live_grep() end, { desc = "Live grep" })
map("n", "<leader>fz", function() fzf.lgrep_curbuf() end, { desc = "Find in current buffer" })
-- Git
map("n", "<leader>cm", function() fzf.git_commits() end, { desc = "Git commits" })
map("n", "<leader>gt", function() fzf.git_status() end, { desc = "Git status" })
-- Other
map("n", "<leader>fh", function() fzf.help_tags() end, { desc = "Help tags" })
map("n", "<leader>ma", function() fzf.marks() end, { desc = "Marks" })
-- LSP
map('n', '<leader>fs', function() fzf.lsp_document_symbols() end, { desc = 'Document symbols' })
map('n', '<leader>fd', function() fzf.diagnostics_document({ severity_limit = vim.diagnostic.severity.ERROR }) end, { desc = "Buffer diagnostics" })
map('n', '<leader>fD', function() fzf.diagnostics_workspace({ severity_limit = vim.diagnostic.severity.ERROR }) end, { desc = "Workspace diagnostics" })
map('n', '<leader>fr', function() fzf.lsp_references() end, { desc = 'References' })
map('n', '<leader>fW', function() vim.diagnostic.open_float() end, { desc = "Open diagnostics window" })
map("n", "<leader>ca", function() vim.lsp.buf.code_action() end, { desc = 'Code action'})
-- === Themery ===
map("n", "<leader>th", "<cmd>Themery<CR>", { desc = "Theme switcher" })
-- === WhichKey ===
map("n", "<leader>wK", "<cmd>WhichKey <CR>", { desc = "Show all keymaps" })
map("n", "<leader>wk", function()
vim.cmd("WhichKey " .. vim.fn.input "WhichKey: ")
end, { desc = "Query lookup" })
-- === NvimTree ===
map("n", "<C-n>", "<cmd>NvimTreeToggle<CR>", { desc = "Toggle nvimtree" })
map("n", "<leader>e", "<cmd>NvimTreeFocus<CR>", { desc = "Focus nvimtree" })
-- === VGit ===
map('n', '<C-k>', function() require('vgit').hunk_up() end, { desc = 'Previous hunk' })
map('n', '<C-j>', function() require('vgit').hunk_down() end, { desc = 'Next hunk' })
map('n', '<leader>gs', function() require('vgit').buffer_hunk_stage() end, { desc = 'Stage hunk' })
map('n', '<leader>gr', function() require('vgit').buffer_hunk_reset() end, { desc = 'Reset hunk' })
map('n', '<leader>gp', function() require('vgit').buffer_hunk_preview() end, { desc = 'Preview hunk' })
map('n', '<leader>gb', function() require('vgit').buffer_blame_preview() end, { desc = 'Blame buffer' })
map('n', '<leader>gf', function() require('vgit').buffer_diff_preview() end, { desc = 'Show buffer diff' })
map('n', '<leader>gh', function() require('vgit').buffer_history_preview() end, { desc = 'Show buffer history' })
map('n', '<leader>gu', function() require('vgit').buffer_reset() end, { desc = 'Reset buffer' })
map('n', '<leader>gx', function() require('vgit').toggle_diff_preference() end, { desc = 'Toggle diff view' })
map('n', '<leader>gd', function() require('vgit').project_diff_preview() end, { desc = 'Show project diff' })
-- === Custom scrolling ===
map("n", "<C-Up>", "10k", { remap = true })
map("n", "<C-Down>", "10j", { remap = true })
-- === Move lines ===
map("n", "ø", ":m -2<CR>==", { desc = "Move line up" })
map("v", "ø", ":'<,'>m '<-2<CR>gv=gv", { desc = "Move selection up" })
map("n", "æ", ":m +1<CR>==", { desc = "Move line down" })
map("v", "æ", ":'<,'>m '>+1<CR>gv=gv", { desc = "Move selection down" })
-- === Cargo ===
map("n", "<leader>cr", function()
vim.cmd("vsplit")
vim.cmd("terminal cargo run")
end, { desc = "Cargo run in terminal" })
map("n", "<leader>cb", function()
vim.cmd("vsplit")
vim.cmd("terminal cargo build")
end, { desc = "Cargo build in terminal" })
-- === Claude Code ===
map("n", "<leader>cc", "<cmd>ClaudeCodeAdd %<cr>", { desc = "Add current file to Claude" })
map("v", "<leader>cc", "<cmd>ClaudeCodeSend<cr>", { desc = "Send to Claude Code" })
-- Create command for Claude context with range support
vim.api.nvim_create_user_command("ClaudeContext", function(opts)
local filepath = vim.fn.fnamemodify(vim.fn.expand("%"), ":.")
local context = string.format("@%s#L%d-%d", filepath, opts.line1, opts.line2)
vim.fn.setreg("+", context)
vim.notify("Copied: " .. context, vim.log.levels.INFO)
end, { range = true })
map("v", "<leader>cy", ":ClaudeContext<CR>", { desc = "Copy selection as Claude Code context" })
map("n", "<leader>ct", function()
vim.g.claude_mode = vim.g.claude_mode == "work" and "normal" or "work"
vim.notify("Claude mode: " .. vim.g.claude_mode, vim.log.levels.INFO)
end, { desc = "Toggle Claude mode (work/normal)" })

View File

@@ -0,0 +1,69 @@
-- Standalone options (migrated from NvChad)
local opt = vim.opt
local o = vim.o
local g = vim.g
-- UI
o.laststatus = 3 -- Global statusline
o.showmode = false -- Don't show mode (statusline handles it)
o.cursorline = true -- Highlight current line
o.cursorlineopt = "number" -- Only highlight line number
-- Clipboard
o.clipboard = "unnamedplus" -- Use system clipboard
-- Indenting
o.expandtab = true -- Use spaces instead of tabs
o.shiftwidth = 2 -- Indent width
o.smartindent = true -- Smart autoindenting
o.tabstop = 2 -- Tab width
o.softtabstop = 2 -- Backspace removes 2 spaces
-- UI elements
opt.fillchars = { eob = " " } -- Hide ~ on empty lines
o.ignorecase = true -- Ignore case in search
o.smartcase = true -- Case-sensitive if uppercase in search
o.mouse = "a" -- Enable mouse
-- Numbers
o.number = true -- Show line numbers
o.numberwidth = 2 -- Line number column width
o.ruler = false -- Don't show cursor position (statusline handles it)
-- Disable nvim intro
opt.shortmess:append "sI"
-- Sign column
o.signcolumn = "yes" -- Always show sign column
-- Splits
o.splitbelow = true -- Horizontal splits go below
o.splitright = true -- Vertical splits go right
-- Timeouts
o.timeoutlen = 400 -- Time to wait for mapped sequence
-- Files
o.undofile = true -- Persistent undo
-- Update time (used by gitsigns and swap file)
o.updatetime = 250
-- Navigation
opt.whichwrap:append "<>[]hl" -- Move to next/prev line with these keys
-- Disable unused providers (performance)
g.loaded_node_provider = 0
g.loaded_python3_provider = 0
g.loaded_perl_provider = 0
g.loaded_ruby_provider = 0
-- Add Mason binaries to PATH
local is_windows = vim.fn.has "win32" ~= 0
local sep = is_windows and "\\" or "/"
local delim = is_windows and ";" or ":"
vim.env.PATH = table.concat({ vim.fn.stdpath "data", "mason", "bin" }, sep) .. delim .. vim.env.PATH
-- User overrides
o.scrolloff = 10 -- Keep 10 lines visible above/below cursor

View File

@@ -0,0 +1,138 @@
-- LSP, completion, treesitter, and code formatting
return {
-- LSP server manager
{
"williamboman/mason.nvim",
cmd = { "Mason", "MasonInstall", "MasonUninstall", "MasonUpdate" },
opts = {
PATH = "skip",
ui = {
icons = {
package_pending = " ",
package_installed = " ",
package_uninstalled = " ",
},
},
max_concurrent_installers = 10,
},
},
-- Bridge between mason and lspconfig
{
"williamboman/mason-lspconfig.nvim",
dependencies = { "williamboman/mason.nvim" },
},
-- LSP configuration
{
"neovim/nvim-lspconfig",
event = "User FilePost",
config = function()
require "configs.lspconfig"
end,
},
-- Syntax highlighting
{
"nvim-treesitter/nvim-treesitter",
event = { "BufReadPost", "BufNewFile" },
cmd = { "TSInstall", "TSBufEnable", "TSBufDisable", "TSModuleInfo" },
build = ":TSUpdate",
opts = {
ensure_installed = {
"lua", "vim", "vimdoc",
"rust", "c", "cpp", "glsl", "wgsl", "python",
},
highlight = {
enable = true,
use_languagetree = true,
},
indent = { enable = false },
},
config = function(_, opts)
require("nvim-treesitter.configs").setup(opts)
end,
},
-- Completion engine (load on insert or command mode for faster startup)
{
"saghen/blink.cmp",
version = "1.*",
event = { "InsertEnter", "CmdlineEnter" },
dependencies = {
"saghen/blink.compat",
optional = true,
opts = {},
},
opts = {
keymap = {
preset = 'none',
['<Tab>'] = { 'select_next', 'fallback' },
['<S-Tab>'] = { 'select_prev', 'fallback' },
['<Esc>'] = { 'hide', 'fallback' },
['<CR>'] = { 'accept', 'fallback' },
['<C-space>'] = { 'show', 'show_documentation', 'hide_documentation' },
},
appearance = {
use_nvim_cmp_as_default = true,
nerd_font_variant = 'mono'
},
signature = {
enabled = true,
},
completion = {
menu = { border = "rounded" },
list = { selection = { auto_insert = false } },
},
sources = {
transform_items = function(_, items)
return vim.tbl_filter(function(item)
return item.kind ~= require('blink.cmp.types').CompletionItemKind.Snippet
end, items)
end,
},
},
},
-- Inline diagnostic messages
{
"rachartier/tiny-inline-diagnostic.nvim",
event = "VeryLazy",
priority = 1000,
config = function()
require('tiny-inline-diagnostic').setup({
preset = "powerline",
})
vim.diagnostic.config({
virtual_text = false,
severity_sort = true,
})
end
},
-- Code formatter
{
'stevearc/conform.nvim',
opts = {
formatters_by_ft = {
wgsl = { 'wgslfmt' },
wesl = { 'wgslfmt' },
},
formatters = {
wgslfmt = {
command = 'wgslfmt',
args = { '-' },
stdin = true,
},
},
},
},
-- Filetype-specific plugins
{
"elkowar/yuck.vim",
ft = "yuck",
},
-- Disabled plugins
{ "hrsh7th/nvim-cmp", enabled = false },
}

View File

@@ -0,0 +1,30 @@
-- Core editor plugins
return {
-- Keybinding helper (lazy load on first key after leader)
{
"folke/which-key.nvim",
event = "VeryLazy",
},
-- Motion plugin (s/S for jumping) - load on key press
{
url = "https://codeberg.org/andyg/leap.nvim",
keys = {
{ "s", mode = { "n", "x", "o" }, desc = "Leap forward" },
{ "S", mode = { "n", "x", "o" }, desc = "Leap backward" },
},
config = function()
vim.keymap.set({'n', 'x', 'o'}, 's', '<Plug>(leap-forward)')
vim.keymap.set({'n', 'x', 'o'}, 'S', '<Plug>(leap-backward)')
end,
},
-- Session management (defer loading)
{
"rmagatti/auto-session",
event = "VimEnter",
opts = {
suppressed_dirs = { "~/", "~/Projects", "~/Downloads", "/" },
},
},
}

View File

@@ -0,0 +1,83 @@
-- Git, fuzzy finding, and file navigation
return {
-- Git signs in gutter
{
"lewis6991/gitsigns.nvim",
event = "User FilePost",
opts = {
signs = {
add = { text = "" },
change = { text = "" },
delete = { text = "󰍵" },
topdelete = { text = "" },
changedelete = { text = "󱕖" },
untracked = { text = "" },
},
},
},
-- Advanced git integration (defer until file is loaded)
{
'tanvirtin/vgit.nvim',
dependencies = { 'nvim-lua/plenary.nvim', 'nvim-tree/nvim-web-devicons' },
event = 'User FilePost',
config = function()
require("vgit").setup({
settings = {
live_blame = {
enabled = false,
},
},
})
end,
},
-- Fuzzy finder
{
"ibhagwan/fzf-lua",
dependencies = { "nvim-tree/nvim-web-devicons" },
event = "VeryLazy",
config = function()
require("configs.fzf")
end,
},
-- File manager
{
"mikavilpas/yazi.nvim",
version = "*",
event = "VeryLazy",
dependencies = {
{ "nvim-lua/plenary.nvim", lazy = true },
},
keys = {
{
"<leader>-",
mode = { "n", "v" },
"<cmd>Yazi<cr>",
desc = "Open yazi at current file",
},
{
"<C-y>",
"<cmd>Yazi<cr>",
desc = "Open yazi at current file",
},
},
opts = {
open_for_directories = false,
keymaps = {
show_help = "<f1>",
},
},
init = function()
vim.g.loaded_netrwPlugin = 1
end,
},
{ "coder/claudecode.nvim",
event = "VeryLazy",
dependencies = { "folke/snacks.nvim" },
config = function()
require("configs.claudecode")
end
},
}

View File

@@ -0,0 +1,53 @@
-- UI and visual plugins
return {
-- Statusline
{
"nvim-lualine/lualine.nvim",
dependencies = { "nvim-tree/nvim-web-devicons" },
event = "VeryLazy",
config = function()
require("configs.lualine")
end,
},
-- Buffer tabs
{
"romgrk/barbar.nvim",
dependencies = { "nvim-tree/nvim-web-devicons" },
event = "VeryLazy",
config = function()
require("configs.barbar")
end,
},
-- Improved UI for vim.ui.input and vim.ui.select (LSP rename, code actions, etc.)
{
"folke/snacks.nvim",
priority = 1000,
lazy = false,
opts = {
input = {
enabled = true,
win = {
relative = "cursor",
row = 1,
col = 0,
},
},
select = {
enabled = false,
},
indent = {
enabled = true,
char = "",
},
notifier = {
enabled = true,
timeout = 6000,
},
quickfile = { enabled = false },
statuscolumn = { enabled = false },
words = { enabled = false },
},
},
}