-- Install lazy.nvim (plugin manager) 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", -- latest stable release lazypath, }) end vim.opt.rtp:prepend(lazypath) -- Install plugins require("lazy").setup({ -- Color scheme { "catppuccin/nvim", name = "catppuccin", priority = 1000, config = function(plugin) vim.cmd.colorscheme("catppuccin-macchiato") end, }, -- Treesitter config { "nvim-treesitter/nvim-treesitter", branch = "master", lazy = false, build = ":TSUpdate", config = function() require("nvim-treesitter.configs").setup({ auto_install = true, highlight = { enable = true, additional_vim_regex_highlighting = false, }, }) end, }, -- LSP config { "neovim/nvim-lspconfig", dependencies = { -- Mason for easy LSP installation { "mason-org/mason.nvim", opts = {} }, { "mason-org/mason-lspconfig.nvim", opts = { handlers = { -- Make it play with nvim-cmp function(server_name) require("lspconfig")[server_name].setup({ capabilities = require("cmp_nvim_lsp").default_capabilities(), }) end, }, }, }, -- Autocompletion (nvim-cmp) "hrsh7th/nvim-cmp", "hrsh7th/cmp-nvim-lsp", -- LSP source for nvim-cmp "L3MON4D3/LuaSnip", -- Snippet engine }, config = function() -- Setup nvim-cmp local cmp = require("cmp") cmp.setup({ sources = { { name = "nvim_lsp" }, }, completion = { -- Highlight first item in completion menu automatically completeopt = "menu,menuone,noinsert", }, mapping = cmp.mapping.preset.insert({ -- Enter key confirms completion item [""] = cmp.mapping.confirm({ select = false }), -- Ctrl + space triggers completion menu [""] = cmp.mapping.complete(), }), snippet = { expand = function(args) require("luasnip").lsp_expand(args.body) end, }, }) -- Keymaps vim.api.nvim_create_autocmd("LspAttach", { callback = function(event) local opts = { buffer = event.buf } vim.keymap.set("n", "gd", "lua vim.lsp.buf.definition()", opts) vim.keymap.set("n", "gh", "lua vim.diagnostic.open_float()", opts) end, }) end, }, -- Formatting with null-ls { "nvimtools/none-ls.nvim", dependencies = { "nvim-lua/plenary.nvim" }, config = function() local null_ls = require("null-ls") local augroup = vim.api.nvim_create_augroup("LspFormatting", {}) null_ls.setup({ sources = { null_ls.builtins.formatting.prettierd.with({ extra_filetypes = { "astro", "svelte" }, }), null_ls.builtins.formatting.black, null_ls.builtins.formatting.stylua, }, on_attach = function(client, bufnr) if client.supports_method("textDocument/formatting") then vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr }) vim.api.nvim_create_autocmd("BufWritePre", { group = augroup, buffer = bufnr, callback = function() vim.lsp.buf.format({ async = false, filter = function(client) return client.name == "null-ls" end, }) end, }) end end, }) end, }, -- Easy commenting/uncommenting { "numToStr/Comment.nvim", config = true, }, -- Easy handling of surroundings { "tpope/vim-surround", dependencies = { "tpope/vim-repeat", }, }, -- Auto-match brackets, quotes etc. { "windwp/nvim-autopairs", event = "InsertEnter", opts = {}, }, -- AI autocompletion { "Exafunction/windsurf.vim", event = "BufEnter", config = function() vim.api.nvim_create_user_command("CPE", "CodeiumEnable", {}) vim.api.nvim_create_user_command("CPD", "CodeiumDisable", {}) -- Disable on startup vim.cmd("CodeiumDisable") end, }, -- Claude Code integration { "coder/claudecode.nvim", dependencies = { "folke/snacks.nvim", }, opts = { terminal = { split_side = "right", split_width_percentage = 0.4, }, }, config = true, keys = { { "", "ClaudeCode", mode = { "n", "v", "i", "t" }, desc = "Toggle Claude" }, -- Temporarily disabled because it's buggy -- { "", "ClaudeCodeSend", mode = "v", desc = "Send to Claude" }, }, }, -- Auto-restore session when opening Neovim { "rmagatti/auto-session", opts = { log_level = "error", }, }, -- File explorer sidebar { "kyazdani42/nvim-tree.lua", commit = "e14989c", -- newer versions break auto-session dependencies = { "kyazdani42/nvim-web-devicons", }, opts = { actions = { open_file = { quit_on_open = true, }, }, update_focused_file = { enable = true, }, view = { signcolumn = "auto", adaptive_size = true, mappings = { list = { { key = "+", action = "cd" }, }, }, }, }, init = function() vim.g.loaded_netrw = 1 vim.g.loaded_netrwPlugin = 1 vim.keymap.set("n", "n", ":NvimTreeToggle", { noremap = true, silent = true }) end, }, -- Fuzzy finder for files, buffers, etc. { "nvim-telescope/telescope.nvim", tag = "0.1.4", dependencies = { "nvim-lua/plenary.nvim", { "nvim-telescope/telescope-fzf-native.nvim", build = "make" }, }, keys = { { "p", "Telescope find_files", noremap = true, silent = true }, { "f", "Telescope live_grep", noremap = true, silent = true }, { "b", "Telescope buffers", noremap = true, silent = true }, { "o", "Telescope oldfiles", noremap = true, silent = true }, { "t", "Telescope lsp_workspace_symbols", noremap = true, silent = true }, { "c", "Telescope commands", noremap = true, silent = true }, { ":", "Telescope commands", noremap = true, silent = true }, { "d", "Telescope git_status", noremap = true, silent = true }, { "", "Telescope resume", noremap = true, silent = true }, }, config = function() require("telescope").setup({ defaults = { mappings = { i = { [""] = require("telescope.actions").close, -- Disable normal mode }, }, vimgrep_arguments = { "rg", "--color=never", "--no-heading", "--with-filename", "--line-number", "--column", "--smart-case", "--fixed-strings", }, }, }) require("telescope").load_extension("fzf") end, }, -- Persistent terminal that can be toggled with a keybinding { "akinsho/nvim-toggleterm.lua", tag = "2.4.0", keys = "", config = function() require("toggleterm").setup({ hide_numbers = true, direction = "float", open_mapping = [[]], shell = "fish", }) end, }, -- Run code with a keybinding { "CRAG666/code_runner.nvim", cmd = "RunCode", dependencies = { "akinsho/nvim-toggleterm.lua", }, opts = { mode = "toggleterm", filetype = { python = "python3", javascript = "node", typescript = "ts-node --esm", c = "gcc -o main % && ./main", go = "go run", }, }, init = function() vim.keymap.set("n", "", ":RunCode", { noremap = true }) end, }, -- Git integration - show modified lines next to line numbers { "lewis6991/gitsigns.nvim", config = function() require("gitsigns").setup() require("scrollbar.handlers.gitsigns").setup() end, }, -- VSCode-like scrollbar with Git and diagnostic markers { "petertriho/nvim-scrollbar", config = true, }, -- Smooth scrolling { "karb94/neoscroll.nvim", opts = { easing_function = "sine", }, }, })