-- Config shortcuts local o = vim.o local keymap = vim.keymap -- Autocommand group for this file to allow config reloading local augroup = vim.api.nvim_create_augroup('init', { clear = true }) ------------------ -- GENERAL OPTIONS ------------------ -- Line numbers o.number = true o.relativenumber = true -- Highlight the cursor line o.cursorline = true -- Amount of screen lines that should be visible above/below the cursor o.scrolloff = 8 -- Show tabs and trailing spaces o.list = true -- Wrap lines at word boundaries o.linebreak = true -- Case insensitive search (except when explicitly using uppercase letters) o.ignorecase = true o.smartcase = true -- Indentation settings o.smartindent = true o.expandtab = true o.shiftwidth = 4 o.softtabstop = -1 -- Don't auto-insert comment leader when entering insert mode with o/O vim.api.nvim_create_autocmd('FileType', { group = augroup, command = 'set formatoptions-=o', }) -- Open new split windows at the bottom / right side o.splitbelow = true o.splitright = true -- Pseudo-transparency for floating windows o.winblend = 10 -- Show inline diagnostics (LSP) vim.diagnostic.config { virtual_text = true } ------------- -- FILE TYPES ------------- vim.filetype.add { extension = { gitconfig = 'gitconfig', }, } -- HTML formatting vim.g.html_indent_autotags = 'html,body' vim.g.html_indent_inctags = 'p' -- In filetypes that use tab indentation, render tabs as 4 spaces vim.api.nvim_create_autocmd('FileType', { group = augroup, pattern = 'go', command = 'setlocal tabstop=4', }) ----------- -- MAPPINGS ----------- -- For keys that are safe to be mapped, see: https://vim.fandom.com/wiki/Unused_keys -- Exit insert/command mode with jk keymap.set('i', 'jk', '') keymap.set('c', 'jk', '') -- Quick exit (:qall) with Ctrl-q keymap.set('n', '', 'qall') -- Close current buffer (:q) with Alt-q keymap.set('n', '', 'q') -- Quick save all open buffers with Ctrl-s keymap.set('n', '', 'wall') keymap.set('i', '', 'wall') -- Simple copy and paste to/from system clipboard with Ctrl-c in visual mode -- and Ctrl-v in insert mode keymap.set('v', '', '"+y') keymap.set('i', '', '"+P') -- Navigate between windows in normal mode with Alt and hjkl keymap.set('n', '', 'h') keymap.set('n', '', 'j') keymap.set('n', '', 'k') keymap.set('n', '', 'l') -- Resize windows with Alt and arrow keys keymap.set('n', '', '2-') keymap.set('n', '', '2+') keymap.set('n', '', '4<') keymap.set('n', '', '4>') -- Shortcuts for jumping to start of line (H) or end of line (L) keymap.set({'n', 'x'}, 'H', '^') keymap.set({'n', 'x'}, 'L', '$') -- Move cursor in insert mode with Alt and hjkl keymap.set('i', '', '') keymap.set('i', '', '') keymap.set('i', '', '') keymap.set('i', '', '') -- Visual mode: Extend selection to parent node with "." -- ("an" will be remapped to "around next" by mini.ai) local _an_keymap = vim.fn.maparg('an', 'x', false, true) keymap.set('x', '.', _an_keymap.callback, { desc = 'Extend selection to parent node' }) -- Visual mode: Move selected lines upwards/downwards with Alt-j/k keymap.set('x', '', ":m '>+1gv=gv") keymap.set('x', '', ":m '<-2gv=gv") -- Visual mode: Stay in visual mode when indenting keymap.set('v', '<', '', '>gv') -- Use space as a "modifier prefix" for alternative functions of regular commands -- (e.g. yank to system clipboard) or for random shortcuts. keymap.set({'n', 'x'}, ' ', '') -- Prefix yank/delete/change/paste commands to use system clipboard keymap.set({'n', 'x'}, ' y', '"+y', { desc = 'Yank (clipboard)' }) keymap.set({'n', 'x'}, ' Y', '"+y$', { desc = 'Yank rest of line (clipboard)' }) keymap.set({'n', 'x'}, ' d', '"+d', { desc = 'Delete (clipboard)' }) keymap.set({'n', 'x'}, ' D', '"+D', { desc = 'Delete rest of line (clipboard)' }) keymap.set({'n', 'x'}, ' c', '"+c', { desc = 'Change (clipboard)' }) keymap.set({'n', 'x'}, ' C', '"+C', { desc = 'Change rest of line (clipboard)' }) keymap.set({'n', 'x'}, ' p', '"+p', { desc = 'Paste after cursor (clipboard)' }) keymap.set({'n', 'x'}, ' P', '"+P', { desc = 'Paste before cursor (clipboard)' }) -- Paste from system clipboard on a new line (before/after the current line) keymap.set('n', ' lp', ':put +', { desc = 'Paste on new line below cursor (clipboard)' }) keymap.set('n', ' lP', ':put! +', { desc = 'Paste on new line above cursor (clipboard)' }) -- Select previously changed or yanked text (e.g. pasted text) in visual mode keymap.set('n', ' v', '`[v`]', { desc = 'Select previously changed/yanked text' }) -- Insert empty line(s) below or above current line without moving the cursor keymap.set('n', ' o', function() local line = vim.api.nvim_win_get_cursor(0)[1] local repeated = vim.fn['repeat']({''}, vim.v.count1) vim.api.nvim_buf_set_lines(0, line, line, true, repeated) end, { desc = 'Insert empty line below cursor' }) keymap.set('n', ' O', function() local line = vim.api.nvim_win_get_cursor(0)[1] - 1 local repeated = vim.fn['repeat']({''}, vim.v.count1) vim.api.nvim_buf_set_lines(0, line, line, true, repeated) end, { desc = 'Insert empty line above cursor' }) -- LSP mappings (more in plugins.lua) keymap.set('n', 'K', vim.lsp.buf.hover) keymap.set('n', 'gq', vim.lsp.buf.format, { desc = 'Auto-format file (LSP)' }) ---------- -- PLUGINS ---------- require('init.theme') require('init.plugins')