local set = vim.keymap.set ---@param mode string|table ---@param keymap string local function unbind(mode, keymap) set(mode, keymap, function() end) end local function yank_filepath_to_clipboard(absolute) return function() local filepath = vim.fn.expand('%:p') if not absolute then local home_dir = vim.fn.expand('~') filepath = filepath:gsub(home_dir, '~') end vim.fn.setreg('+', filepath) end end local function paste() local value = vim.fn.getreg('+') if vim.fn.mode() == 'c' then -- value = vim.split(value, '\n')[1] -- only use first line (default with normal pasting) value = value:gsub('\n', ' ') -- replace newlines with spaces vim.api.nvim_feedkeys(value, 'c', false) else vim.api.nvim_put(vim.split(value, '\n'), 'c', false, true) end end -- "Greatest Keymap ever" - ThePrimeagen -- https://www.youtube.com/watch?v=qZO9A5F6BZs&list=PLm323Lc7iSW_wuxqmKx_xxNtJC_hJbQ7R&index=4 set('x', 'p', '"_dP') set('n', '!', ':!') -- Move lines around set('n', '', ':m .+1', { noremap = true }) set('n', '', ':m .-2', { noremap = true }) set('v', '', ":m '>+1gv", { noremap = true }) set('v', '', ":m '<-2gv", { noremap = true }) -- Misc set({ 'n', 'i' }, '', 'ggVG', { desc = 'Visually Highlight [A]ll' }) set('i', '', '', { desc = 'Ctrl + Backspace to delete word' }) set('n', '', 'nohlsearch', { silent = true }) set({ 'i', 'c' }, '', paste) set('n', '', 'e #', { desc = 'Switch to Other Buffer' }) unbind({ 'i', 'n', 'v' }, '') set('n', 'U', 'redo') set('i', '', 'undo') set({ 'i', 'n', 'v' }, '', 'wqa') set('n', 'yp', yank_filepath_to_clipboard(true), { desc = '[Y]oink File [P]ath (linux)' }) set('n', 'yP', yank_filepath_to_clipboard(false), { desc = '[Y]oink File [P]ath (windows)' }) -- Terminal set('t', '', 'close', { desc = 'Hide Terminal' }) -- Window resizing local resize = 2 set({ 'n', 't' }, '', string.format('vertical resize -%d', resize), { desc = 'Resize Left' }) set({ 'n', 't' }, '', string.format('resize -%d', resize), { desc = 'Resize Up' }) set({ 'n', 't' }, '', string.format('resize +%d', resize), { desc = 'Resize Down' }) set({ 'n', 't' }, '', string.format('vertical resize +%d', resize), { desc = 'Resize Right' }) -- highlights under cursor set('n', 'ui', vim.show_pos, { desc = 'Inspect Pos' }) set('n', 'uI', function() vim.treesitter.inspect_tree() vim.api.nvim_input('I') end, { desc = 'Inspect Tree' }) -- Keep selection after < and > in visual mode set('v', '<', '', '>gv') -- Execute lua file or line set('n', 'x', '.lua', { desc = 'Execute the current line' }) set('n', 'x', 'source %', { desc = 'Execute the current file' }) -- Reformats file using lsp set('n', '=', vim.lsp.buf.format, { desc = 'Format File' }) -- LSP keymaps local severity = vim.diagnostic.severity local function next_diagnostic(diagnostic_severity) return function() require('lspsaga.diagnostic'):goto_next({ severity = diagnostic_severity }) end end local function prev_diagnostic(diagnostic_severity) return function() require('lspsaga.diagnostic'):goto_prev({ severity = diagnostic_severity }) end end local function cursor_diagnostics() vim.diagnostic.open_float({ scope = 'cursor', border = 'single', }) end local keymaps = { -- TODO: replace goto def with normal goto def or do I like the red thing? { 'n', 'gd', 'Lspsaga goto_definition', { desc = '[G]oto [D]efinition' } }, -- TODO: replace goto def with normal goto def or do I like the red thing? (maybe picker?) { 'n', 'gu', 'Lspsaga finder', { desc = '[G]oto [U]sages' } }, { { 'n', 'i' }, '', function() vim.lsp.buf.signature_help() end, { desc = 'Show [P]arameters' }, }, { 'n', 'R', 'Lspsaga rename', { desc = '[R]ename' } }, { { 'n', 'i' }, '', 'Lspsaga code_action', { desc = 'Code Actions' } }, -- { 'n', 'e', next_diagnostic(severity.ERROR), { desc = 'Goto [E]rror' } }, -- { 'n', 'E', prev_diagnostic(severity.ERROR), { desc = 'Goto [E]rror (prev)' } }, -- { 'n', 'w', next_diagnostic(severity.WARN), { desc = 'Goto [W]arning' } }, -- { 'n', 'W', prev_diagnostic(severity.WARN), { desc = 'Goto [W]arning (prev)' } }, { 'n', 'D', cursor_diagnostics, { desc = '[D]iagnostics under cursor' } }, -- MARK lsphover: { 'n', 'K', function() vim.lsp.buf.hover({ border = 'rounded', focusable = true, relative = 'cursor', wrap = true, wrap_at = 120, width = 120, max_height = 20, }) end, { desc = '[D]iagnostics under cursor' }, }, } local function set_keymaps(tbl, bufnr) for _, keymap in ipairs(tbl) do local mode = keymap[1] local lhs = keymap[2] local rhs = keymap[3] local opts = keymap[4] or {} opts.buffer = bufnr vim.keymap.set(mode, lhs, rhs, opts) end end vim.api.nvim_create_autocmd('LspAttach', { desc = 'Register LSP keymaps', group = vim.api.nvim_create_augroup('lsp-keymaps', { clear = true }), callback = function(args) local bufnr = args.buf local filetype = vim.bo[bufnr].filetype set_keymaps(keymaps, bufnr) for ft, tbl in pairs(keymaps) do if type(ft) == 'number' or ft ~= filetype then goto continue end set_keymaps(tbl, bufnr) ::continue:: end end, }) local compile = function() if vim.g.project_compile_cmd then Compile_project(vim.g.project_compile_cmd) -- vim.notify(vim.g.project_compile_cmd) else vim.notify('vim.g.project_compile_cmd is not set', 'warn') end end local run = function() if vim.g.project_run_cmd then Compile_project(vim.g.project_run_cmd) -- vim.notify(vim.g.project_run_cmd) else vim.notify('vim.g.project_run_cmd is not set', 'warn') end end local test = function() if vim.g.project_test_cmd then Compile_project(vim.g.project_test_cmd) -- vim.notify(vim.g.project_test_cmd) else vim.notify('vim.g.project_test_cmd is not set', 'warn') end end vim.keymap.set('n', '', compile, { desc = 'Idk? lol' }) vim.keymap.set('n', '', compile, { desc = '[C]ompile Project' }) vim.keymap.set('n', '', compile, { desc = '[B]uild Project' }) vim.keymap.set('n', '', run, { desc = '[R]un Project' }) vim.keymap.set('n', '', test, { desc = '[T]est Project' }) vim.keymap.set('n', '', function() Run_nvim_lua() vim.notify('Reloaded .nvim.lua') end, { desc = '[S]ource .nvim.lua' }) vim.keymap.set('n', 'cm', 'KMemory', { desc = '[C]reate [M]emory' })