-- nvim/.config/nvim/lua/config/keymaps.lua
-- Global keymaps only. Plugin-specific maps live inside their plugin spec.
local map = function(mode, lhs, rhs, desc)
vim.keymap.set(mode, lhs, rhs, { silent = true, desc = desc })
end
-- Saner j/k on wrapped lines
map({ "n", "x" }, "j", "v:count == 0 ? 'gj' : 'j'", "down")
map({ "n", "x" }, "k", "v:count == 0 ? 'gk' : 'k'", "up")
vim.keymap.set({ "n", "x" }, "j", "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true })
vim.keymap.set({ "n", "x" }, "k", "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true })
-- Clear search on <Esc>
map("n", "<Esc>", "<cmd>nohlsearch<cr>", "clear highlight")
-- Window movement
map("n", "<C-h>", "<C-w>h", "win left")
map("n", "<C-j>", "<C-w>j", "win down")
map("n", "<C-k>", "<C-w>k", "win up")
map("n", "<C-l>", "<C-w>l", "win right")
-- Resize windows with arrows
map("n", "<C-Up>", "<cmd>resize +2<cr>", "resize up")
map("n", "<C-Down>", "<cmd>resize -2<cr>", "resize down")
map("n", "<C-Left>", "<cmd>vertical resize -2<cr>", "resize left")
map("n", "<C-Right>", "<cmd>vertical resize +2<cr>", "resize right")
-- Buffer navigation
map("n", "<S-h>", "<cmd>bprevious<cr>", "prev buffer")
map("n", "<S-l>", "<cmd>bnext<cr>", "next buffer")
map("n", "<leader>bd", "<cmd>bdelete<cr>", "delete buffer")
-- Stay centered on search and jumps
map("n", "n", "nzzzv", "next match centered")
map("n", "N", "Nzzzv", "prev match centered")
map("n", "<C-d>", "<C-d>zz", "half-page down")
map("n", "<C-u>", "<C-u>zz", "half-page up")
-- Paste over selection without clobbering the register
map("x", "p", [["_dP]], "paste keep reg")
-- Move selected lines in visual mode
map("x", "J", ":m '>+1<CR>gv=gv", "move down")
map("x", "K", ":m '<-2<CR>gv=gv", "move up")
-- Indent and stay
map("x", "<", "<gv", "indent left stay")
map("x", ">", ">gv", "indent right stay")
-- Quickfix
map("n", "<leader>xo", "<cmd>copen<cr>", "qf open")
map("n", "<leader>xc", "<cmd>cclose<cr>", "qf close")
map("n", "]q", "<cmd>cnext<cr>", "qf next")
map("n", "[q", "<cmd>cprev<cr>", "qf prev")
-- File ops
map("n", "<leader>w", "<cmd>write<cr>", "save file")
map("n", "<leader>q", "<cmd>quit<cr>", "close window")
map("n", "<leader>Q", "<cmd>qall!<cr>", "quit all")
-- Diagnostic navigation
map("n", "]d", vim.diagnostic.goto_next, "next diag")
map("n", "[d", vim.diagnostic.goto_prev, "prev diag")
map("n", "<leader>cd", vim.diagnostic.open_float, "line diag")
-- Terminal: Esc to normal mode
map("t", "<Esc><Esc>", [[<C-\><C-n>]], "term normal")
-- Tab navigation
map("n", "<leader><tab>n", "<cmd>tabnew<cr>", "new tab")
map("n", "<leader><tab>c", "<cmd>tabclose<cr>", "close tab")
map("n", "]t", "<cmd>tabnext<cr>", "next tab")
map("n", "[t", "<cmd>tabprevious<cr>", "prev tab")