local keymap = vim.keymap -- b for buffer keymap.set("n", "bq", "q", { desc = "quit" }) keymap.set("n", "bs", "w", { desc = "save" }) keymap.set("n", "br", "e!", { desc = "reload" }) keymap.set("n", "bd", "BufferClose", { desc = "close buffer" }) -- c keymap.set("n", "cs", "SymbolsOutline", { desc = "Symbols Outline" }) -- D for Trouble (v3 syntax) keymap.set("n", "Dt", "Trouble diagnostics toggle", { desc = "trouble diagnostics" }) keymap.set("n", "Dd", "Trouble diagnostics toggle filter.buf=0", { desc = "document diagnostics" }) keymap.set("n", "Dq", "Trouble qflist toggle", { desc = "quickfix" }) keymap.set("n", "Dl", "Trouble loclist toggle", { desc = "loclist" }) keymap.set("n", "Dr", "Trouble lsp_references toggle", { desc = "references" }) -- d for debug keymap.set("n", "dd", "lua vim.diagnostic.open_float()", { desc = "show diagnostics" }) keymap.set("n", "dc", 'lua require("dap").continue()', { desc = "continue" }) keymap.set("n", "db", 'lua require("dap").toggle_breakpoint()', { desc = "Toggle Breakpoint" }) keymap.set("n", "dj", 'lua require("dap").step_over()', { desc = "step over" }) keymap.set("n", "dk", 'lua require("dap").step_out()', { desc = "step out" }) keymap.set("n", "dl", 'lua require("dap").step_into()', { desc = "step into" }) keymap.set("n", "du", 'lua require("dap").up()', { desc = "up" }) keymap.set("n", "d_", 'lua require("dap").disconnect();require("dap").stop();require("dap").run_last()', { desc = "disconnect" }) keymap.set("n", "di", 'lua require("dap.ui.variables").visual_hover()', { desc = "visual hover" }) keymap.set("n", "ds", 'lua local w=require("dap.ui.widgets");w.centered_float(w.scopes)', { desc = "scopes" }) -- f keymap.set("n", "fm", "lua require('utils').open_md()", { desc = "open markdown in external app" }) keymap.set("n", "fs", "w", { desc = "save file" }) keymap.set("n", "ft", "NvimTreeToggle", { desc = "toggle nvim tree" }) keymap.set("n", "fy", "lua require('utils').yank_filepath()", { desc = "copy file path" }) keymap.set("n", "fd", "lua require('utils').yank_file_dir()", { desc = "copy dir path" }) keymap.set("n", "fl", "NvimTreeFindFile", { desc = "find file in tree" }) -- g keymap.set("n", "gj", "lua require('gitsigns').next_hunk()", { desc = "Next Hunk" }) keymap.set("n", "gk", "lua require('gitsigns').prev_hunk()", { desc = "Prev Hunk" }) keymap.set("n", "gl", "lua require('gitsigns').blame_line()", { desc = "Blame" }) keymap.set("n", "gp", "lua require('gitsigns').preview_hunk()", { desc = "Preview Hunk" }) keymap.set("n", "gr", "lua require('gitsigns').reset_hunk()", { desc = "Reset Hunk" }) keymap.set("n", "gR", "lua require('gitsigns').reset_buffer()", { desc = "Reset Buffer" }) keymap.set("n", "gs", "lua require('gitsigns').stage_hunk()", { desc = "Stage Hunk" }) keymap.set("n", "gS", "lua require('gitsigns').stage_buffer()", { desc = "Stage Buffer" }) keymap.set("n", "gu", "lua require('gitsigns').undo_stage_hunk()", { desc = "Undo Stage Hunk" }) keymap.set("n", "go", "Telescope git_status", { desc = "Open changed file" }) keymap.set("n", "gb", "Telescope git_branches", { desc = "Checkout branch" }) keymap.set("n", "gc", "Telescope git_commits", { desc = "Checkout commit" }) keymap.set("n", "gC", "Telescope git_bcommits", { desc = "Checkout commit(for current file)" }) keymap.set("n", "gd", "Gitsigns diffthis HEAD", { desc = "Git Diff" }) -- h keymap.set("n", "h", ":set hlsearch!", { noremap = true, silent = true, desc = "toggle hlsearch" }) -- q keymap.set("n", "qq", "qall", { desc = "quit all" }) -- s for search keymap.set("n", "sb", "Telescope git_branches", { desc = "Checkout branch" }) keymap.set("n", "sc", "nohl", { desc = "no highlight" }) keymap.set("n", "sd", "Telescope diagnostics bufnr=0", { desc = "Document Diagnostics" }) keymap.set("n", "sD", "Telescope diagnostics", { desc = "Workspace Diagnostics" }) keymap.set("n", "sf", "Telescope find_files", { desc = "Find File" }) keymap.set("n", "sr", function() require("telescope.builtin").oldfiles({ cwd = vim.uv.cwd() }) end, { desc = "Old File" }) keymap.set("n", "sm", "Telescope marks", { desc = "Marks" }) keymap.set("n", "sM", "Telescope man_pages", { desc = "Man Pages" }) keymap.set("n", "sR", "Telescope registers", { desc = "Registers" }) keymap.set("n", "st", "Telescope live_grep", { desc = "Text" }) keymap.set("n", "s,", function() local ok, fzf_lua = pcall(require, "fzf-lua") if ok then fzf_lua.grep_cword() else require("telescope.builtin").grep_string({ word_match = "-w" }) end end, { desc = "Search word under cursor" }) -- t for test keymap.set("n", "tt", 'lua require("neotest").run.run()', { desc = "TestNearest" }) keymap.set("n", "tf", 'lua require("neotest").run.run(vim.fn.expand("%"))', { desc = "TestFile" }) keymap.set("n", "tc", "GoCover", { desc = "go coverage" }) keymap.set("n", "tC", "GoCoverClear", { desc = "go coverage clear" }) keymap.set("n", "tb", 'lua require("dap").toggle_breakpoint()', { desc = "set break point" }) keymap.set("n", "tr", 'lua require("dap").continue()', { desc = "continue" }) -- ; keymap.set("n", ";", "Dashboard", { noremap = true, silent = true, desc = "Dashboard" }) -- Ctrl-p: find files with recent-first boost keymap.set("n", "", function() local builtin = require("telescope.builtin") local recent_paths = {} for _, file in ipairs(vim.v.oldfiles) do if vim.fn.filereadable(file) == 1 then local abs_path = vim.fn.fnamemodify(file, ":p") local rel_path = vim.fn.fnamemodify(file, ":.") recent_paths[abs_path] = true recent_paths[rel_path] = true recent_paths[vim.fn.fnamemodify(file, ":t")] = true end end local ok, _ = pcall(require, "telescope._extensions.fzf") if ok then builtin.find_files({ hidden = true, no_ignore = false }) else local sorters = require("telescope.sorters") builtin.find_files({ hidden = true, no_ignore = false, sorter = sorters.Sorter:new({ discard = true, scoring_function = function(_, prompt, line, entry) local score = 0 local path = entry.path or entry.value or line local abs_path = vim.fn.fnamemodify(path, ":p") local rel_path = vim.fn.fnamemodify(path, ":.") local filename = vim.fn.fnamemodify(path, ":t") if recent_paths[abs_path] or recent_paths[rel_path] or recent_paths[filename] then score = 1000 end if prompt and prompt ~= "" then if path:lower():find(prompt:lower(), 1, true) then score = score + 100 end end return score end, }), }) end end, { noremap = true, silent = true, desc = "Find Files (Recent First)" }) -- Window movement keymap.set("n", "", "h", { silent = true }) keymap.set("n", "", "j", { silent = true }) keymap.set("n", "", "k", { silent = true }) keymap.set("n", "", "l", { silent = true }) -- Resize with arrows keymap.set("n", "", ":resize -2", { silent = true }) keymap.set("n", "", ":resize +2", { silent = true }) keymap.set("n", "", ":vertical resize -2", { silent = true }) keymap.set("n", "", ":vertical resize +2", { silent = true }) -- Quickfix toggle keymap.set("n", "", function() for _, win in pairs(vim.fn.getwininfo()) do if win.quickfix == 1 then vim.cmd("cclose") return end end vim.cmd("copen") end, { noremap = true, silent = true, desc = "Toggle Quickfix" }) -- Two spaces → live_grep keymap.set("n", " ", function() require("telescope.builtin").live_grep() end, { noremap = true, silent = true, desc = "Search in Files" }) -- Misc keymap.set("n", "Y", "y$", {}) keymap.set("v", "<", "", ">gv", { noremap = true, silent = true }) keymap.set("i", "jk", "", { noremap = true, silent = true }) keymap.set("i", "kj", "", { noremap = true, silent = true }) keymap.set("i", "jj", "", { noremap = true, silent = true }) -- Tab switch buffer (barbar) keymap.set("n", "", "BufferNext", { noremap = true, silent = true }) keymap.set("n", "", "BufferPrevious", { noremap = true, silent = true }) -- Move selected line / block in visual mode keymap.set("x", "K", ":move '<-2gv-gv", { noremap = true, silent = true }) keymap.set("x", "J", ":move '>+1gv-gv", { noremap = true, silent = true })