137 lines
10 KiB
Lua
137 lines
10 KiB
Lua
-- Custom keymaps
|
|
local map = vim.keymap.set
|
|
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Terminal
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- LazyVim uses <leader>t* for the Test group (neotest). Putting terminal
|
|
-- splits under capital <leader>T avoids that collision while staying mnemonic.
|
|
map("n", "<leader>Th", function()
|
|
vim.cmd("split | terminal")
|
|
vim.cmd("startinsert")
|
|
end, { desc = "Terminal (horizontal split)" })
|
|
|
|
map("n", "<leader>Tv", function()
|
|
vim.cmd("vsplit | terminal")
|
|
vim.cmd("startinsert")
|
|
end, { desc = "Terminal (vertical split)" })
|
|
|
|
map("t", "<Esc><Esc>", "<C-\\><C-n>", { desc = "Exit terminal mode" })
|
|
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Explorer (Snacks)
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
map({ "n", "i" }, "<leader>e", function()
|
|
Snacks.explorer()
|
|
end, { desc = "Toggle Explorer" })
|
|
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Window navigation
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
map("n", "<C-h>", "<C-w>h", { desc = "Go left window" })
|
|
map("n", "<C-j>", "<C-w>j", { desc = "Go to lower window" })
|
|
map("n", "<C-k>", "<C-w>k", { desc = "Go to upper window" })
|
|
map("n", "<C-l>", "<C-w>l", { desc = "Go to right window" })
|
|
|
|
-- Resize windows with arrows
|
|
map("n", "<C-Up>", "<cmd>resize +2<cr>", { desc = "Increase window height" })
|
|
map("n", "<C-Down>", "<cmd>resize -2<cr>", { desc = "Decrease window height" })
|
|
map("n", "<C-Left>", "<cmd>vertical resize -2<cr>", { desc = "Decrease window width" })
|
|
map("n", "<C-Right>", "<cmd>vertical resize +2<cr>", { desc = "Increase window width" })
|
|
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Buffers / editing
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
map("n", "<S-h>", "<cmd>bprevious<cr>", { desc = "Prev Buffer" })
|
|
map("n", "<S-l>", "<cmd>bnext<cr>", { desc = "Next Buffer" })
|
|
|
|
map("n", "<Esc>", "<cmd>nohlsearch<cr>", { desc = "Clear search highlight" })
|
|
map({ "n", "i", "v", "s" }, "<C-s>", "<cmd>w<cr><esc>", { desc = "Save file" })
|
|
|
|
map("v", "<", "<gv", { desc = "Indent left, keep selection" })
|
|
map("v", ">", ">gv", { desc = "Indent right, keep selection" })
|
|
|
|
map("n", "<A-j>", "<cmd>m .+1<cr>==", { desc = "Move line down" })
|
|
map("n", "<A-k>", "<cmd>m .-2<cr>==", { desc = "Move line up" })
|
|
map("n", "<A-j>", ":m '>+1<cr>gv=gv", { desc = "Move selection down" })
|
|
map("n", "<A-k>", ":m '<-2<cr>gv=gv", { desc = "Move selection up" })
|
|
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- AI (Avante)
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
map("n", "<leader>aa", "<cmd>AvanteAsk<cr>", { desc = "AI Ask" })
|
|
map("v", "<leader>aa", "<cmd>AvanteAsk<cr>", { desc = "AI Ask (selection)" })
|
|
map("n", "<leader>ac", "<cmd>AvanteChat<cr>", { desc = "AI Chat" })
|
|
map("n", "<leader>at", "<cmd>AvanteToggle<cr>", { desc = "AI Toggle" })
|
|
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Database (vim-dadbod)
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Moved off <leader>db to free that for the DAP breakpoint default.
|
|
map("n", "<leader>Du", "<cmd>DBUIToggle<cr>", { desc = "Toggle DB UI" })
|
|
map("n", "<leader>Da", "<cmd>DBUIAddConnection<cr>", { desc = "Add DB Connection" })
|
|
map("n", "<leader>Df", "<cmd>DBUIFindBuffer<cr>", { desc = "Find DB Buffer" })
|
|
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Tests (neotest)
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- IMPORTANT: do NOT `require("neotest")` at module top — it eager-loads the
|
|
-- plugin on every startup. Wrap each binding in a function so the require
|
|
-- happens at keypress time, letting Lazy.nvim load on demand.
|
|
map("n", "<leader>tt", function()
|
|
require("neotest").run.run()
|
|
end, { desc = "Run nearest test" })
|
|
map("n", "<leader>tf", function()
|
|
require("neotest").run.run(vim.fn.expand("%"))
|
|
end, { desc = "Run test file" })
|
|
map("n", "<leader>ts", function()
|
|
require("neotest").summary.toggle()
|
|
end, { desc = "Toggle test summary" })
|
|
map("n", "<leader>to", function()
|
|
require("neotest").output.open()
|
|
end, { desc = "Open test output" })
|
|
map("n", "<leader>tc", "<cmd>Coverage<cr>", { desc = "Show coverage" })
|
|
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Go: benchmarks & profiling
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Using <leader>cg* (Code > Go) to avoid colliding with Git's <leader>g group.
|
|
map("n", "<leader>cgb", function()
|
|
vim.cmd("!go test -bench=. -benchmem ./...")
|
|
end, { desc = "Go benchmarks" })
|
|
map("n", "<leader>cgpc", function()
|
|
vim.cmd("!go test -run=^$ -bench=. -cpuprofile cpu.out ./...")
|
|
end, { desc = "Go CPU profile" })
|
|
map("n", "<leader>cgpm", function()
|
|
vim.cmd("!go test -run=^$ -bench=. -memprofile mem.out ./...")
|
|
end, { desc = "Go memory profile" })
|
|
map("n", "<leader>cgpt", function()
|
|
vim.cmd("!go test -run=^$ -bench=. -trace trace.out ./...")
|
|
end, { desc = "Go trace profile" })
|
|
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Overseer
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
map("n", "<leader>or", "<cmd>OverseerRun<cr>", { desc = "Run task" })
|
|
map("n", "<leader>ot", "<cmd>OverseerToggle<cr>", { desc = "Task list" })
|
|
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Symbols / outline
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
map("n", "<leader>so", "<cmd>AerialToggle<cr>", { desc = "Symbols outline" })
|
|
map("n", "<leader>sh", vim.lsp.buf.incoming_calls, { desc = "Incoming calls" })
|
|
map("n", "<leader>sc", vim.lsp.buf.outgoing_calls, { desc = "Outgoing calls" })
|
|
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Diagnostics (Trouble)
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
map("n", "<leader>xx", "<cmd>Trouble diagnostics toggle<cr>", { desc = "Diagnostics (Trouble)" })
|
|
map("n", "<leader>xw", "<cmd>Trouble workspace_diagnostics<cr>", { desc = "Workspace diagnostics" })
|
|
map("n", "<leader>xt", "<cmd>Trouble todo<cr>", { desc = "TODOs (Trouble)" })
|
|
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- Git
|
|
-- ─────────────────────────────────────────────────────────────────────────────
|
|
-- LazyVim's <leader>gg is lazygit by default; mapping Neogit to <leader>gn.
|
|
map("n", "<leader>gn", "<cmd>Neogit<cr>", { desc = "Neogit" })
|