neovim-ide/dotfiles/.config/nvim/lua/keymaps.lua

104 lines
6.8 KiB
Lua
Raw Permalink Normal View History

-- ── keymaps.lua ───────────────────────────────────────────────────────────────
local map = vim.keymap.set
local opts = { silent = true }
-- ── Escape (tearless mobile ref: jj) ─────────────────────────────────────────
map("i", "jj", "<Esc>", { desc = "Escape insert mode" })
map("i", "jk", "<Esc>", { desc = "Escape insert mode" })
-- ── File ops (tearless mobile ref) ───────────────────────────────────────────
map("n", "<leader>w", "<cmd>w<cr>", { desc = "Save" })
map("n", "<leader>q", "<cmd>q<cr>", { desc = "Quit" })
map("n", "<leader>x", "<cmd>wq<cr>", { desc = "Save + quit" })
map("n", "<leader>Q", "<cmd>qa!<cr>",{ desc = "Force quit all" })
-- ── Clear search highlight ────────────────────────────────────────────────────
map("n", "<Esc>", "<cmd>noh<cr>", opts)
-- ── Better movement ───────────────────────────────────────────────────────────
map("n", "j", "gj", opts) -- visual line movement
map("n", "k", "gk", opts)
map("n", "H", "^", opts) -- start/end of line
map("n", "L", "$", opts)
map("n", "<C-d>", "<C-d>zz", opts) -- keep cursor centred on scroll
map("n", "<C-u>", "<C-u>zz", opts)
map("n", "n", "nzzzv", opts) -- keep cursor centred on search
map("n", "N", "Nzzzv", opts)
-- ── Window navigation (matches tmux bindings) ─────────────────────────────────
map("n", "<C-h>", "<C-w>h", opts)
map("n", "<C-j>", "<C-w>j", opts)
map("n", "<C-k>", "<C-w>k", opts)
map("n", "<C-l>", "<C-w>l", opts)
-- ── Window resize ─────────────────────────────────────────────────────────────
map("n", "<C-Up>", "<cmd>resize +2<cr>", opts)
map("n", "<C-Down>", "<cmd>resize -2<cr>", opts)
map("n", "<C-Left>", "<cmd>vertical resize -2<cr>", opts)
map("n", "<C-Right>", "<cmd>vertical resize +2<cr>", opts)
-- ── Buffer navigation ─────────────────────────────────────────────────────────
map("n", "<S-h>", "<cmd>bprev<cr>", opts)
map("n", "<S-l>", "<cmd>bnext<cr>", opts)
map("n", "<leader>bd", "<cmd>bdelete<cr>", { desc = "Delete buffer" })
-- ── Indenting keeps selection (tearless mobile ref) ──────────────────────────
map("v", "<", "<gv", opts)
map("v", ">", ">gv", opts)
-- ── Move lines ────────────────────────────────────────────────────────────────
map("v", "J", ":m '>+1<cr>gv=gv", opts)
map("v", "K", ":m '<-2<cr>gv=gv", opts)
-- ── Paste without losing register ─────────────────────────────────────────────
map("v", "p", '"_dP', opts)
-- ── File explorer (tearless mobile ref: Ctrl+n) ───────────────────────────────
map("n", "<C-n>", "<cmd>Oil<cr>", { desc = "File explorer (oil)" })
map("n", "<leader>e", "<cmd>Oil<cr>", { desc = "File explorer (oil)" })
-- ── Telescope (tearless mobile ref) ──────────────────────────────────────────
map("n", "<leader>ff", "<cmd>Telescope find_files<cr>", { desc = "Find files" })
map("n", "<leader>fg", "<cmd>Telescope live_grep<cr>", { desc = "Live grep" })
map("n", "<leader>fb", "<cmd>Telescope buffers<cr>", { desc = "Buffers" })
map("n", "<leader>fh", "<cmd>Telescope help_tags<cr>", { desc = "Help tags" })
map("n", "<leader>fd", "<cmd>Telescope diagnostics<cr>", { desc = "Diagnostics" })
map("n", "<leader>fr", "<cmd>Telescope oldfiles<cr>", { desc = "Recent files" })
map("n", "<leader>fs", "<cmd>Telescope lsp_document_symbols<cr>",{ desc = "Symbols" })
-- ── LSP (set globally; lsp.lua on_attach adds buffer-local too) ───────────────
map("n", "gd", vim.lsp.buf.definition, { desc = "Go to definition" })
map("n", "gD", vim.lsp.buf.declaration, { desc = "Go to declaration" })
map("n", "gr", "<cmd>Telescope lsp_references<cr>",{ desc = "References" })
map("n", "gi", vim.lsp.buf.implementation, { desc = "Implementation" })
map("n", "K", vim.lsp.buf.hover, { desc = "Hover docs" })
map("n", "<C-k>", vim.lsp.buf.signature_help, { desc = "Signature help" })
map("n", "<leader>rn", vim.lsp.buf.rename, { desc = "Rename symbol" })
map("n", "<leader>ca", vim.lsp.buf.code_action, { desc = "Code action" })
map("n", "<leader>f", function()
vim.lsp.buf.format({ async = true })
end, { desc = "Format buffer" })
-- ── Diagnostics ───────────────────────────────────────────────────────────────
map("n", "[d", vim.diagnostic.goto_prev, { desc = "Prev diagnostic" })
map("n", "]d", vim.diagnostic.goto_next, { desc = "Next diagnostic" })
map("n", "<leader>dl", vim.diagnostic.open_float, { desc = "Line diagnostics" })
-- ── Leap (info only — sets its own mappings) ─────────────────────────────────
-- s → leap (n/x/o)
-- S → leap-from-window (n)
-- Surround defaults (v4): ys{motion}{char}, ds{char}, cs{old}{new}
-- ── LazyGit ───────────────────────────────────────────────────────────────────
map("n", "<leader>g", "<cmd>LazyGit<cr>", { desc = "LazyGit" })
-- ── Which-key group labels ────────────────────────────────────────────────────
local ok, wk = pcall(require, "which-key")
if ok then
wk.add({
{ "<leader>f", group = "find / telescope" },
{ "<leader>d", group = "diagnostics" },
{ "<leader>b", group = "buffer" },
})
end