------------------------------------------------------------ -- Filip's config for the Zoomer Editor ------------------------------------------------------------ ------------------------------------------------------------ -- General / UI settings ------------------------------------------------------------ vim.opt.number = true vim.opt.relativenumber = true vim.opt.title = true vim.opt.background = "dark" vim.opt.laststatus = 2 vim.opt.showmode = true vim.opt.showcmd = false vim.opt.ruler = true vim.opt.cursorline = true -- Modern / visual quality vim.opt.signcolumn = "yes" vim.opt.pumblend = 10 vim.opt.winblend = 10 ------------------------------------------------------------ -- Window / split behavior ------------------------------------------------------------ vim.opt.splitbelow = true vim.opt.splitright = true -- Preferred width and height for automatic window resizing vim.opt.winwidth = 10 vim.opt.winheight = 10 -- Minimum width and height a window can shrink to vim.opt.winminwidth = 10 vim.opt.winminheight = 10 -- Automatically balance windows when opening/closing vim.opt.equalalways = true ------------------------------------------------------------ -- Timing & performance related ------------------------------------------------------------ vim.opt.updatetime = 50 vim.opt.timeoutlen = 400 vim.opt.ttimeoutlen = 10 ------------------------------------------------------------ -- Backup, swap, undo ------------------------------------------------------------ vim.opt.undofile = true vim.opt.swapfile = false vim.opt.backup = false vim.opt.writebackup = false ------------------------------------------------------------ -- Search and highlighting ------------------------------------------------------------ vim.opt.hlsearch = false vim.opt.ignorecase = true vim.opt.smartcase = true vim.opt.incsearch = true vim.opt.wildignore = { "*.o", "*.obj", "*.bak", "*.exe" } ------------------------------------------------------------ -- Indentation and formatting ------------------------------------------------------------ vim.opt.autoindent = true vim.opt.cindent = true vim.opt.smartindent = true vim.opt.wrap = false vim.opt.scrolloff = 5 vim.opt.completeopt = { "menuone", "noinsert" } ------------------------------------------------------------ -- Clipboard and mouse ------------------------------------------------------------ vim.opt.mouse = "a" ------------------------------------------------------------ -- Session and history (shada = viminfo replacement) ------------------------------------------------------------ vim.opt.shada = "'100,<50,s10,h" vim.opt.shadafile = vim.fn.expand("~/.local/state/nvim/shada/main.shada") ------------------------------------------------------------ -- Miscellaneous ------------------------------------------------------------ vim.opt.spelllang = { "en", "pl" } vim.cmd("syntax on") vim.opt.termguicolors = true vim.cmd.colorscheme("pablo") -- Transparency local function transparent_hl(group) vim.api.nvim_set_hl(0, group, { bg = "none", ctermbg = "none" }) end for _, group in ipairs({ "Normal", "NormalFloat", "SignColumn", "FoldColumn" }) do transparent_hl(group) end ------------------------------------------------------------ -- Autocommands ------------------------------------------------------------ local augroup = vim.api.nvim_create_augroup("UserAutocmds", { clear = true }) -- Reload any .lua file on save vim.api.nvim_create_autocmd("BufWritePost", { group = augroup, pattern = vim.fn.stdpath("config") .. "/**/*.lua", callback = function() vim.cmd("source %") vim.notify("Lua config reloaded", vim.log.levels.INFO) end, }) -- Remove trailing whitespace & final newlines, keep cursor vim.api.nvim_create_autocmd("BufWritePre", { group = augroup, pattern = "*", callback = function() local pos = vim.fn.getpos(".") vim.cmd([[%s/\s\+$//e]]) vim.cmd([[%s/\n\+\%$//e]]) vim.fn.setpos(".", pos) end, }) vim.api.nvim_create_autocmd("BufUnload", { pattern = "*.tex", callback = function() -- Get the full path of the file being closed local file = vim.fn.expand("%:p") -- Check if the file actually exists (to avoid errors on temporary buffers) if file ~= "" then -- Pass the file path as the first argument to the script vim.fn.jobstart({ "texclear", file }) end end, }) -- Make help windows vertical splits vim.api.nvim_create_autocmd("FileType", { pattern = "help", callback = function() vim.cmd("wincmd L") end, }) ------------------------------------------------------------ -- Key mappings ------------------------------------------------------------ vim.g.mapleader = " " -- Helper function for cleaner keymap definitions -- Defaults: noremap = true, silent = true local function map(mode, lhs, rhs, opts) opts = opts or {} opts.noremap = opts.noremap ~= false -- default true opts.silent = opts.silent ~= false -- default true opts.desc = opts.desc or nil -- optional description vim.keymap.set(mode, lhs, rhs, opts) end -- Delete char before cursor + char under cursor map("n", "", "dBx", { desc = "Delete char before + under cursor" }) -- Start substitute on current line (pre-filled :%s//g) map("n", "S", ":%s//g", { silent = false, desc = "Substitute on current line" }) -- Note: silent = false because it enters command-line mode -- Yank to end of line (consistent with D and C behavior) map("n", "Y", "y$", { desc = "Yank to end of line" }) -- Swap current line with the one below map("n", "-", "ddp", { desc = "Swap line with next" }) -- Swap current line with the one above map("n", "_", "ddkP", { desc = "Swap line with previous" }) -- System clipboard yank & paste (line / WORD) map("n", "", '"+yy', { desc = "Yank line to system clipboard" }) map("n", "", '"+yW', { desc = "Yank WORD to system clipboard" }) map("n", "", '"+p', { desc = "Paste from system clipboard after cursor" }) -- Yank selection to system clipboard map("v", "", '"+y', { desc = "Yank selection to system clipboard" }) -- Toggle buffers map("n", "", "", { desc = "Toggle last / alternate buffer" }) -- Split window vertically map("n", "vv", "v", { desc = "Split the current window vertically" }) -- Insert blank line below current line and center view map("n", "o", "okzz", { desc = "Insert blank line below + center" }) -- Pressing h will prompt for a help topic and open it in vsplit map("n", "h", ":vert help ", { desc = "Open help vertically" }) -- Open messages in vplit map("n", "m", ":vnew | put =execute('messages')", { desc = "Open messages in vsplit" }) -- Explain diagnostics map("n", "de", ":lua vim.diagnostic.open_float()", { desc = "Explain diagnostics" }) -- Go to the next diagnostic map("n", "dn", ":lua vim.diagnostic.goto_next()", { desc = "Go to the next diagnostic" }) -- Go to the previous diagnostic map("n", "dp", ":lua vim.diagnostic.goto_prev()", { desc = "Go to the previous diagnostic" }) -- Open diagnostics locations map("n", "dl", ":lua vim.diagnostic.setqflist()", { desc = "Open diagnostics locations" }) -- Toggle diagnostics map("n", "dt", function() local is_enabled = vim.diagnostic.is_enabled() vim.diagnostic.enable(not is_enabled) -- Print a small message so you know the state if not is_enabled then print("Diagnostics Enabled") else print("Diagnostics Disabled") end end, { desc = "Toggle diagnostics" }) -- Repeat action on visual block map("v", ".", ":normal .", { desc = "Repeat action on visual block" }) -- Force write with sudo vim.cmd([[cabbrev w!! execute 'silent! write !sudo tee % >/dev/null' edit!]]) -- Resize windows map("n", "", ":resize +2", { desc = "Increase window height" }) map("n", "", ":resize -2", { desc = "Decrease window height" }) map("n", "", ":vertical resize +2", { desc = "Increase window width" }) map("n", "", ":vertical resize -2", { desc = "Decrease window width" }) -- Create a custom user command to restart LSP vim.api.nvim_create_user_command("LspRestart", function() local clients = vim.lsp.get_clients() for _, client in ipairs(clients) do vim.lsp.stop_client(client.id) end vim.cmd("edit") -- Re-opens the file to trigger LSP start print("LSP Restarted") end, {}) ------------------------------------------------------------ -- Tabs & indentation ------------------------------------------------------------ vim.opt.tabstop = 4 vim.opt.shiftwidth = 4 vim.opt.expandtab = true ------------------------------------------------------------ -- Filetype-specific mappings ------------------------------------------------------------ vim.api.nvim_create_autocmd("FileType", { group = augroup, pattern = "python", command = "map :w:!python3 %", }) ------------------------------------------------------------ -- lazy.nvim ------------------------------------------------------------ require("config.lazy") ------------------------------------------------------------ -- luasnip ------------------------------------------------------------ require("luasnip").config.set_config({ -- Setting LuaSnip config -- Enable autotriggered snippets enable_autosnippets = true, -- Use Tab (or some other key if you prefer) to trigger visual selection store_selection_keys = "", }) vim.cmd([[ " Use Tab to expand and jump through snippets imap luasnip#expand_or_jumpable() ? 'luasnip-expand-or-jump' : '' smap luasnip#jumpable(1) ? 'luasnip-jump-next' : '' " Use Shift-Tab to jump backwards through snippets imap luasnip#jumpable(-1) ? 'luasnip-jump-prev' : '' smap luasnip#jumpable(-1) ? 'luasnip-jump-prev' : '' ]]) -- Load snippets from fiadra/chadsnips require("luasnip.loaders.from_vscode").lazy_load()