-- 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" }) -- 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/stevearc/oil.nvim', -- File explorer }) -- 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 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('nvim-treesitter').setup({ auto_install = true }) -- LSP Language Server require("mason").setup() require("mason-lspconfig").setup({ -- Install lsp deps here ensure_installed = { 'lua_ls', 'ts_ls', 'ansiblels', 'eslint' }, automatic_enable = true }) require("mason-tool-installer").setup({ -- Install deps of lsp deps here ensure_installed = { 'tree-sitter-cli', 'markdownlint' } }) -- 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, })