-- SECTION: Options vim.o.number = true -- Show line numbers vim.o.wrap = true -- Soft-wrap lines vim.o.tabstop = 2 -- 2 space tab width vim.o.shiftwidth = 2 -- 2 space tab width vim.o.swapfile = false -- Disable swap files (annoying) vim.o.undofile = true -- Enable undo between sessions vim.o.mouse = "a" -- Enable mouse support vim.o.showmode = false -- Don't show mode in status bar vim.o.inccommand = "split" -- Preview replace commands inline vim.o.scrolloff = 20 -- Scroll if cursor is X lines to edge vim.o.confirm = true -- Add confirmation on some destructive actions vim.o.ignorecase = true -- Case insensitive search vim.o.smartcase = true -- Case sensitive when caps is used vim.o.cursorline = true -- Highlight current line vim.o.winborder = "single" -- Borders around popups like when you press leader for keybinds vim.opt.signcolumn = "yes" -- TEST: Prohibit layout shifting by always showing the sign column (left of line numbers), you should see an icon there on this row. vim.o.updatetime = 250 -- Speed up the CursorHold autocmd event vim.o.timeoutlen = 300 -- Speed up completion of key event -- SECTION: Globals vim.g.mapleader = " " -- Mapping leader to space. vim.g.maplocalleader = " " -- Mapping leader to space. vim.g.have_nerd_font = true -- Enable nerd font -- SECTION: Lazy settings -- INFO: Lines in this function will be executed after main event loop is free, prohibiting startup lag. vim.schedule(function() vim.opt.clipboard = "unnamedplus" -- Share clipboard with system, comment if you want to keep it separate. end) -- SECTION: Keybinds -- Source current file, helpful when editing this file. vim.keymap.set("n", "o", ":update :source") -- Restart vim completely, you can then press CTRL + o to go back to the last file you had open. vim.keymap.set("n", "r", ":restart") -- Lets you use ESC to stop highlighting text that you have searched with '/' vim.keymap.set("n", "", "nohlsearch") -- Format the current buffer using the active lsp vim.keymap.set("n", "f", vim.lsp.buf.format, { desc = "Format buffer" }) -- Start the file picker in different modes vim.keymap.set("n", "sf", function() require("mini.pick").builtin.files() end, { desc = "Search files" }) vim.keymap.set("n", "sg", ":Pick grep_live", { desc = "Search file contents" }) vim.keymap.set("n", "sh", ":Pick help", { desc = "Search help pages" }) vim.keymap.set("n", "sr", ":Pick resume", { desc = "Resume last search" }) vim.keymap.set("n", "sb", ":Pick buffers", { desc = "Search buffers" }) -- Get help with keybinds vim.keymap.set("n", "?", ":WhichKey", { desc = "Show keybinds" }) -- File explorer vim.keymap.set("n", "\\", ":Oil --float", { desc = "File explorer" }) -- Ai vim.keymap.set("n", "ac", "ClaudeCode", { desc = "Toggle Claude" }) vim.keymap.set("n", "af", "ClaudeCodeFocus", { desc = "Focus Claude" }) vim.keymap.set("n", "ar", "ClaudeCode --resume", { desc = "Resume Claude" }) vim.keymap.set("n", "aC", "ClaudeCode --continue", { desc = "Continue Claude" }) vim.keymap.set("n", "am", "ClaudeCodeSelectModel", { desc = "Select Claude model" }) vim.keymap.set("n", "ab", "ClaudeCodeAdd %", { desc = "Add current buffer" }) vim.keymap.set("v", "as", "ClaudeCodeSend", { desc = "Send to Claude" }) vim.keymap.set("n", "aa", "ClaudeCodeDiffAccept", { desc = "Accept diff" }) vim.keymap.set("n", "ad", "ClaudeCodeDiffDeny", { desc = "Deny diff" }) -- File tree keymap (conditional on filetype) vim.api.nvim_create_autocmd("FileType", { pattern = { "NvimTree", "neo-tree", "oil", "minifiles", "netrw" }, callback = function(ev) vim.keymap.set("n", "as", "ClaudeCodeTreeAdd", { desc = "Add file", buffer = ev.buf }) end, }) -- SECTION: Install packages vim.pack.add({ 'https://github.com/catppuccin/nvim', -- color scheme 'https://github.com/nvim-mini/mini.pick', -- File picker, grep 'https://github.com/nvim-mini/mini.pairs', -- Auto create {}, (), [] - pairs etc. 'https://github.com/nvim-mini/mini.notify', -- Popup notifications 'https://github.com/nvim-mini/mini.completion', -- Autocomplete, needs snippets and icons 'https://github.com/nvim-mini/mini.snippets', -- Snippets 'https://github.com/nvim-mini/mini.icons', -- Icons 'https://github.com/nvim-mini/mini.cursorword', -- Highlight word under cursor 'https://github.com/nvim-mini/mini.hipatterns', -- Highlight todos and rgb colors 'https://github.com/nvim-mini/mini.statusline', -- Statusline at the bottom 'https://github.com/neovim/nvim-lspconfig', -- Language servers 'https://github.com/mason-org/mason.nvim', -- LSP deps installer 'https://github.com/mason-org/mason-lspconfig.nvim', -- Lets you install mason tooling using lsp names 'https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim', -- Automatically install mason tooling 'https://github.com/folke/lazydev.nvim', -- Automatically resolve vim api paths. 'https://github.com/folke/which-key.nvim', -- Shortcut hints (bar at the bottom when pressing space) 'https://github.com/nvim-lua/plenary.nvim', -- Helper lua functions, dep of todo-comments. 'https://github.com/nvim-treesitter/nvim-treesitter', -- Syntax highlighting 'https://github.com/nvim-treesitter/nvim-treesitter-context', -- Show sticky headers when looking at nested structures 'https://github.com/stevearc/oil.nvim', -- File explorer "https://github.com/folke/snacks.nvim", -- Dep for claudecode "https://github.com/coder/claudecode.nvim", -- Claude code }) -- SECTION: Colorscheme vim.cmd("colorscheme catppuccin-mocha") -- SECTION: General plugin setup -- Folke require("lazydev").setup() local wk = require("which-key") wk.setup() wk.add({ { "s", group = "[S]earch" }, { "o", group = "Source current file", mode = { "n" } }, { "a", group = "AI/Claude Code" }, }) -- Mini local MiniPicker = require("mini.pick").setup({ source = { show = require("mini.pick").default_show, }, }) require("mini.pairs").setup() require("mini.notify").setup() require("mini.icons").setup() MiniIcons.tweak_lsp_kind() require("mini.snippets").setup() require("mini.completion").setup() require("mini.cursorword").setup() require("mini.hipatterns").setup({ highlighters = { todo = { pattern = "%f[%w]()TODO()%f[%W]", group = "MiniHipatternsTodo" }, section = { pattern = "%f[%w]()SECTION()%f[%W]", group = "MiniHipatternsNote" }, warning = { pattern = "%f[%w]()WARNING()%f[%W]", group = "MiniHipatternsHack" }, error = { pattern = "%f[%w]()ERROR()%f[%W]", group = "MiniHipatternsTodo" }, }, }) require("mini.statusline").setup() require("oil").setup() require("claudecode").setup() require("nvim-treesitter").setup({ auto_install = true, }) require('treesitter-context').setup({ enable = true }) local vue_language_server_path = vim.fn.stdpath('data') .. "/mason/packages/vue-language-server/node_modules/@vue/language-server" local tsserver_filetypes = { 'typescript', 'javascript', 'javascriptreact', 'typescriptreact', 'vue' } local vue_plugin = { name = "@vue/typescript-plugin", location = vue_language_server_path, languages = { "vue" }, configNamespace = "typescript", } local vtsls_config = { settings = { vtsls = { tsserver = { globalPlugins = { vue_plugin, }, }, }, }, filetypes = tsserver_filetypes, } local ts_ls_config = { init_options = { plugins = { vue_plugin, }, }, filetypes = tsserver_filetypes, } local vue_ls_config = {} -- If you are on most recent `nvim-lspconfig` -- nvim 0.11 or above vim.lsp.config("vtsls", vtsls_config) vim.lsp.config("vue_ls", vue_ls_config) vim.lsp.config("ts_ls", ts_ls_config) -- LSP Language Server require("mason").setup() require("mason-lspconfig").setup({ -- Install lsp deps here ensure_installed = { "lua_ls", "ts_ls", "vue_ls", "ansiblels", "eslint", }, automatic_enable = { exclude = { "ts_ls", "vue_ls" }, }, }) require("mason-tool-installer").setup({ -- Install deps of lsp deps here ensure_installed = { "tree-sitter-cli", "markdownlint", "vue-language-server", }, }) vim.lsp.enable({ "ts_ls", "vue_ls" }) -- SECTION: Helpers local function client_supports_method(client, method, bufnr) if vim.fn.has("nvim-0.11") == 1 then return client:supports_method(method, bufnr) else return client.supports_method(method, { bufnr = bufnr }) end end -- SECTION: Autocommands vim.api.nvim_create_autocmd("TextYankPost", { desc = "Highlight when yanking (copying) text", group = vim.api.nvim_create_augroup("highlight-yank", { clear = true }), callback = function() vim.highlight.on_yank() end, }) -- Actions on LspAttach vim.api.nvim_create_autocmd("LspAttach", { group = vim.api.nvim_create_augroup("my.lsp", {}), callback = function(ev) local client = assert(vim.lsp.get_client_by_id(ev.data.client_id)) -- Auto-format ("lint") on save. -- Usually not needed if server supports "textDocument/willSaveWaitUntil". -- if not client:supports_method('textDocument/willSaveWaitUntil') -- and client:supports_method('textDocument/formatting') then -- vim.api.nvim_create_autocmd('BufWritePre', { -- group = vim.api.nvim_create_augroup('my.lsp', { clear = false }), -- buffer = ev.buf, -- callback = function() -- vim.lsp.buf.format({ bufnr = ev.buf, id = client.id, timeout_ms = 1000 }) -- end, -- }) -- end -- Swap out the icons in the leftmost column and show inlay hints vim.diagnostic.config({ severity_sort = true, float = { border = "rounded", source = "if_many" }, underline = { severity = vim.diagnostic.severity.ERROR }, signs = vim.g.have_nerd_font and { text = { [vim.diagnostic.severity.ERROR] = "󰅚 ", [vim.diagnostic.severity.WARN] = "󰀪 ", [vim.diagnostic.severity.INFO] = "󰋽 ", [vim.diagnostic.severity.HINT] = "󰌶 ", }, } or {}, virtual_text = { source = "if_many", spacing = 2, format = function(diagnostic) local diagnostic_message = { [vim.diagnostic.severity.ERROR] = diagnostic.message, [vim.diagnostic.severity.WARN] = diagnostic.message, [vim.diagnostic.severity.INFO] = diagnostic.message, [vim.diagnostic.severity.HINT] = diagnostic.message, } return diagnostic_message[diagnostic.severity] end, }, }) end, })