nvim/.config/nvim/lua/config/keymaps.lua

-- 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")