-- 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.autocomplete = true -- Turn on builtin autocomplete vim.o.complete = "o,.,w,b,u" -- Indicates what kind of items to show in the autocomplete vim.o.completeopt = "fuzzy,menuone,noselect,popup" -- Options for autocomplete vim.o.pumheight = 7 -- Max items to show in autocomplete vim.o.pummaxwidth = 80 -- Max width of autocomplete vim.o.updatetime = 250 vim.o.timeoutlen = 300 -- 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', ":Pick files", { desc = "Search files" }) vim.keymap.set('n', 'sg', ":Pick grep_live", { desc = "Search files" }) -- Get help with keybinds vim.keymap.set('n', '?', ":WhichKey", { desc = "Show keybinds" }) -- 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/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/folke/todo-comments.nvim', -- Helper lua functions, dep of todo-comments. 'https://github.com/nvim-treesitter/nvim-treesitter', }) -- 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' } }, }) require('todo-comments').setup({ keywords = { SECTION = { icon = "󰚟 ", color = "hint", } } }) -- Mini require('mini.pick').setup() require('mini.pairs').setup() require('mini.notify').setup() require('nvim-treesitter').setup({ auto_install = true }) -- LSP Language Server require("mason").setup() require("mason-lspconfig").setup({ -- Install lsp deps here ensure_installed = { 'lua_ls' }, automatic_enable = true }) require("mason-tool-installer").setup({ -- Install deps of lsp deps here ensure_installed = { 'tree-sitter-cli', 'markdownlint' } }) -- 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) -- INFO: 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 local client = assert(vim.lsp.get_client_by_id(ev.data.client_id)) -- Enable auto-completion if client:supports_method('textDocument/completion') then vim.lsp.completion.enable(true, client.id, ev.buf, { autotrigger = true }) end -- 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 -- Highlight the word you are standing on after a little while if client and client_supports_method(client, vim.lsp.protocol.Methods.textDocument_documentHighlight, ev.buf) then local highlight_augroup = vim.api.nvim_create_augroup('kickstart-lsp-highlight', { clear = false }) vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { buffer = ev.buf, group = highlight_augroup, callback = vim.lsp.buf.document_highlight, }) vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, { buffer = ev.buf, group = highlight_augroup, callback = vim.lsp.buf.clear_references, }) vim.api.nvim_create_autocmd('LspDetach', { group = vim.api.nvim_create_augroup('kickstart-lsp-detach', { clear = true }), callback = function(event2) vim.lsp.buf.clear_references() vim.api.nvim_clear_autocmds { group = 'kickstart-lsp-highlight', buffer = event2.buf } 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, })