local utils = require('config.utils') local builtin = require('telescope.builtin') ------------------------------------------------------------------------------- -- Leader / mode escapes ------------------------------------------------------------------------------- vim.keymap.set({ 'n', 'v' }, '', '', { silent = true }) vim.keymap.set('n', '', 'nohlsearch', { silent = true }) vim.keymap.set('n', '', '', { silent = true }) -- Disable gp (avoid accidental paste-over in visual) vim.keymap.set('n', 'gp', '', { silent = true }) ------------------------------------------------------------------------------- -- Motion / view ------------------------------------------------------------------------------- -- Respect wrapped lines for j/k vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) -- Keep cursor centred when scrolling / searching vim.keymap.set('n', '', 'zz', { desc = 'Half page down (centred)' }) vim.keymap.set('n', '', 'zz', { desc = 'Half page up (centred)' }) vim.keymap.set('n', 'n', 'nzzzv', { desc = 'Next match (centred)' }) vim.keymap.set('n', 'N', 'Nzzzv', { desc = 'Prev match (centred)' }) ------------------------------------------------------------------------------- -- Window / split navigation ------------------------------------------------------------------------------- vim.keymap.set('n', '', 'h', { desc = 'Focus left split' }) vim.keymap.set('n', '', 'j', { desc = 'Focus split below' }) vim.keymap.set('n', '', 'k', { desc = 'Focus split above' }) vim.keymap.set('n', '', 'l', { desc = 'Focus right split' }) ------------------------------------------------------------------------------- -- Quickfix list (project-wide: LSP refs, grep, diagnostics) ------------------------------------------------------------------------------- vim.keymap.set('n', ']q', 'cnextzz', { desc = 'Quickfix next' }) vim.keymap.set('n', '[q', 'cprevzz', { desc = 'Quickfix prev' }) vim.keymap.set('n', ']Q', 'clastzz', { desc = 'Quickfix last' }) vim.keymap.set('n', '[Q', 'cfirstzz', { desc = 'Quickfix first' }) -- Location list (buffer-local: spell, some linters) vim.keymap.set('n', ']l', 'lnextzz', { desc = 'Loclist next' }) vim.keymap.set('n', '[l', 'lprevzz', { desc = 'Loclist prev' }) ------------------------------------------------------------------------------- -- Buffer navigation ------------------------------------------------------------------------------- vim.keymap.set('n', '', 'e #', { desc = 'Alternate buffer (toggle last two)' }) vim.keymap.set('n', 'bn', 'bnext', { desc = 'Buffer next' }) vim.keymap.set('n', 'bp', 'bprev', { desc = 'Buffer prev' }) vim.keymap.set('n', 'bd', 'bdelete', { desc = 'Buffer delete' }) vim.keymap.set('n', 'bs', 'split', { desc = 'Buffer horizontal split' }) vim.keymap.set('n', 'bv', 'vsplit', { desc = 'Buffer vertical split' }) ------------------------------------------------------------------------------- -- Editing ------------------------------------------------------------------------------- -- Move selected lines up/down and reindent vim.keymap.set('v', 'J', ":m '>+1gv=gv", { silent = true, desc = 'Move selection down' }) vim.keymap.set('v', 'K', ":m '<-2gv=gv", { silent = true, desc = 'Move selection up' }) -- Indent and keep visual selection vim.keymap.set('v', '>', '>gv', { desc = 'Indent and reselect' }) vim.keymap.set('v', '<', 'p', '"_dP', { desc = 'Paste without overwriting register' }) vim.keymap.set({ 'n', 'v' }, 'D', '"_d', { desc = 'Delete without register' }) vim.keymap.set({ 'n', 'v' }, 'y', '"+y', { desc = 'Yank to system clipboard' }) vim.keymap.set('n', 'Y', '"+Y', { desc = 'Yank line to system clipboard' }) -- Project-wide word rename vim.keymap.set( 'n', 'rw', ':%s/\\<\\>//gI', { desc = 'Rename word under cursor (file scope)' } ) ------------------------------------------------------------------------------- -- File / system ------------------------------------------------------------------------------- vim.keymap.set( 'n', '', 'silent !wezterm cli spawn --cwd %:p:h', { desc = 'Open WezTerm tab in current dir' } ) vim.keymap.set('n', 'fx', '!chmod +x %', { silent = true, desc = 'Make current file executable' }) ------------------------------------------------------------------------------- -- Telescope ------------------------------------------------------------------------------- vim.keymap.set('n', '?', builtin.oldfiles, { desc = 'Recent files' }) vim.keymap.set('n', '', builtin.buffers, { desc = 'Open buffers' }) vim.keymap.set('n', 'sr', builtin.resume, { desc = 'Search: resume last' }) vim.keymap.set('n', 'sd', builtin.diagnostics, { desc = 'Search: diagnostics' }) vim.keymap.set('n', 'sG', builtin.live_grep, { desc = 'Search: live grep' }) vim.keymap.set('n', 'sg', 'LiveGrepGitRoot', { desc = 'Search: live grep (git root)' }) vim.keymap.set('n', '/', function() builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown({ winblend = 10, previewer = false })) end, { desc = 'Search: fuzzy current buffer' }) vim.keymap.set('n', 'sf', builtin.find_files, { desc = 'Search: files' }) vim.keymap.set('n', 'gf', builtin.git_files, { desc = 'Search: git files' }) vim.keymap.set('n', 'gb', builtin.git_branches, { desc = 'Search: git branches' }) vim.keymap.set('n', 'gc', builtin.git_commits, { desc = 'Search: git commits' }) vim.keymap.set({ 'n', 'v' }, 'sh', function() local q = utils.get_search_query() builtin.help_tags({ default_text = q, initial_mode = 'insert' }) end, { desc = 'Search: help tags' }) vim.keymap.set({ 'n', 'v' }, 'sw', function() local q = utils.get_search_query() builtin.grep_string({ default_text = q, initial_mode = 'insert' }) end, { desc = 'Search: word under cursor' }) vim.keymap.set('n', 'sp', function() builtin.grep_string({ search = vim.fn.input('Grep > ') }) end, { desc = 'Search: grep prompt' }) -- Config / plugin file pickers vim.keymap.set('n', 'fc', function() builtin.find_files({ cwd = vim.fn.stdpath('config'), find_command = { 'fd', '--type', 'f', '--exclude', 'README.md', '--exclude', 'LICENSE.md', '--exclude', 'init.lua', }, }) end, { desc = 'Find: config files' }) vim.keymap.set('n', 'fp', function() builtin.find_files({ cwd = vim.fs.joinpath(vim.fn.stdpath('data'), 'lazy') }) end, { desc = 'Find: plugin files' })