--[[ init.lua - Main Neovim configuration entry point HOW THIS WORKS: 1. Bootstrap lazy.nvim (plugin manager) 2. Load basic settings 3. Load all plugins from plugins/ directory 4. Set global keymaps and LSP keymaps ]] -- ============================================================================ -- STEP 0: SETUP NODE PATH (for fnm) -- ============================================================================ local fnm_current = vim.fn.trim(vim.fn.system("fnm current 2>/dev/null")) if fnm_current ~= "" then local fnm_dir = vim.fn.expand("~/.local/share/fnm") local fnm_bin_path = fnm_dir .. "/node-versions/" .. fnm_current .. "/installation/bin" vim.env.PATH = fnm_bin_path .. ":" .. vim.env.PATH end -- ============================================================================ -- STEP 1: BOOTSTRAP LAZY.NVIM -- ============================================================================ local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath, }) end vim.opt.rtp:prepend(lazypath) -- ============================================================================ -- STEP 2: LOAD SETTINGS -- ============================================================================ require("basic-settings") -- ============================================================================ -- STEP 3: LOAD PLUGINS -- ============================================================================ require("lazy").setup("plugins") -- ============================================================================ -- STEP 4: LSP KEYMAPS -- ============================================================================ vim.keymap.set("n", "gd", vim.lsp.buf.definition, { desc = "Go to definition" }) vim.keymap.set("n", "gD", vim.lsp.buf.declaration, { desc = "Go to declaration" }) vim.keymap.set("n", "gi", vim.lsp.buf.implementation, { desc = "Go to implementation" }) vim.keymap.set("n", "gr", vim.lsp.buf.references, { desc = "Show references" }) vim.keymap.set("n", "K", vim.lsp.buf.hover, { desc = "Show hover docs" }) vim.keymap.set("n", "rn", vim.lsp.buf.rename, { desc = "Rename symbol" }) vim.keymap.set("n", "ca", vim.lsp.buf.code_action, { desc = "Code actions" }) vim.keymap.set("n", "e", vim.diagnostic.open_float, { desc = "Show diagnostic" }) vim.diagnostic.config({ virtual_text = { prefix = "●" }, signs = true, float = { border = "rounded" }, }) -- ============================================================================ -- STEP 5: GLOBAL KEYMAPS -- ============================================================================ vim.keymap.set("n", "w", ":w", { desc = "Save file" }) vim.keymap.set("n", "q", ":q", { desc = "Quit" }) vim.keymap.set("n", "", ":Neotree filesystem reveal left", { desc = "Toggle explorer" }) vim.keymap.set("n", "nt", ":Neotree focus", { desc = "Focus neo-tree" }) vim.keymap.set("n", "", ":Telescope find_files", { desc = "Find files" }) -- Better window navigation vim.keymap.set("n", "", "h", { desc = "Navigate left" }) vim.keymap.set("n", "", "j", { desc = "Navigate down" }) vim.keymap.set("n", "", "k", { desc = "Navigate up" }) vim.keymap.set("n", "", "l", { desc = "Navigate right" }) -- Split windows vim.keymap.set("n", "sh", ":split", { desc = "Split window horizontally" }) vim.keymap.set("n", "sv", ":vsplit", { desc = "Split window vertically" }) vim.keymap.set("n", "\"", ":split", { desc = "Split window horizontally" }) vim.keymap.set("n", "%", ":vsplit", { desc = "Split window vertically" }) -- Resize windows vim.keymap.set("n", "", ":resize -2", { desc = "Resize window up" }) vim.keymap.set("n", "", ":resize +2", { desc = "Resize window down" }) vim.keymap.set("n", "", ":vertical resize -2", { desc = "Resize window left" }) vim.keymap.set("n", "", ":vertical resize +2", { desc = "Resize window right" }) -- Move text up/down vim.keymap.set("n", "", ":m .+1==", { desc = "Move line down" }) vim.keymap.set("n", "", ":m .-2==", { desc = "Move line up" }) vim.keymap.set("v", "", ":m '>+1gv=gv", { desc = "Move selection down" }) vim.keymap.set("v", "", ":m '<-2gv=gv", { desc = "Move selection up" }) -- Folding keymaps vim.keymap.set("n", "za", "za", { desc = "Toggle fold under cursor" }) vim.keymap.set("n", "zA", "zA", { desc = "Toggle fold recursively" }) vim.keymap.set("n", "zR", "zR", { desc = "Open all folds" }) vim.keymap.set("n", "zM", "zM", { desc = "Close all folds" }) vim.keymap.set("n", "zo", "zo", { desc = "Open fold under cursor" }) vim.keymap.set("n", "zc", "zc", { desc = "Close fold under cursor" }) vim.keymap.set("n", "zO", "zO", { desc = "Open all folds under cursor" }) vim.keymap.set("n", "zC", "zC", { desc = "Close all folds under cursor" }) -- Path of current file to clipboard vim.keymap.set("n", "yp", ":let @+=expand('%:p')", { desc = "Absolute path of current file to clipboard" }) vim.keymap.set("n", "yr", ":let @+=expand('%:.')", { desc = "Relative path of current file to clipboard" }) vim.keymap.set("n", "cf", ":let @+=expand('%:t')", { desc = "Current filename to clipboard" }) vim.keymap.set({'n','v'}, 'ya', function() local fname = vim.fn.expand('%:.') local lines = (vim.fn.mode() == 'v' or vim.fn.mode() == 'V') and (tostring(math.min(vim.fn.line("'<"), vim.fn.line("'>")))..'..'..tostring(math.max(vim.fn.line("'<"), vim.fn.line("'>")))) or tostring(vim.fn.line('.')) local result = fname..':'..lines vim.fn.setreg('+', result) print('Copied: '..result) end, {desc = 'Copy file path and line(s) to clipboard'}) -- clear search highlighting vim.keymap.set("n", "ch", ":noh", { desc = "clear search highlighting" }) -- toggle word wrap vim.keymap.set("n", "tw", ":set wrap!", { desc = "toggle word wrap" })