---@module "data.keys" --- This module contains the keymaps for the plugins and commands. --- Keymaps use the add_keymap function from data.func for flexible --- keybinding functionality. -- ╭─────────────────────────────────────────────────────────╮ -- │ KEYS DATA │ -- ╰─────────────────────────────────────────────────────────╯ local M = {} -- Load utils local rootiest = require('config.rootiest') M.alternate = { { -- Toggle Alternate 'A', 'Alternate', desc = 'Toggle Alternate', }, } M.autosave = function() local group = vim.api.nvim_create_augroup('autosave', {}) vim.api.nvim_create_autocmd('User', { pattern = 'AutoSaveEnable', group = group, callback = function() vim.g.auto_save_enabled = true end, }) vim.api.nvim_create_autocmd('User', { pattern = 'AutoSaveDisable', group = group, callback = function() vim.g.auto_save_enabled = false end, }) require('snacks.toggle') .new({ id = 'autosave', name = 'Auto-Write', get = function() return vim.g.auto_save_enabled end, set = function() require('auto-save').toggle() end, }) :map('uW') end M.blink = function() require('snacks.toggle') .new({ name = 'Completion', which_key = true, get = function() if vim.g.cmp_auto_show == false then return false end return true end, set = function(state) if state then vim.g.cmp_auto_show = true else vim.g.cmp_auto_show = false end end, }) :map('uB') end M.capsword = { { '', function() require('caps-word').toggle() end, desc = 'Toggle CapsWord', mode = { 'i', 'n' }, }, } M.chatgpt = { func = function() -- Add ChatGPT menu require('data.func').add_keymap(M.group.chatgpt) -- Add ChatGPT keys return M.chatgpt.keys end, keys = { { 'cxc', 'ChatGPT', desc = 'ChatGPT', }, { 'cxe', 'ChatGPTEditWithInstruction', desc = 'Edit with instruction', mode = { 'n', 'v' }, }, { 'cxg', 'ChatGPTRun grammar_correction', desc = 'Grammar Correction', mode = { 'n', 'v' }, }, { 'cxt', 'ChatGPTRun translate', desc = 'Translate', mode = { 'n', 'v' }, }, { 'cxk', 'ChatGPTRun keywords', desc = 'Keywords', mode = { 'n', 'v' }, }, { 'cxd', 'ChatGPTRun docstring', desc = 'Docstring', mode = { 'n', 'v' }, }, { 'cxa', 'ChatGPTRun add_tests', desc = 'Add Tests', mode = { 'n', 'v' }, }, { 'cxo', 'ChatGPTRun optimize_code', desc = 'Optimize Code', mode = { 'n', 'v' }, }, { 'cxs', 'ChatGPTRun summarize', desc = 'Summarize', mode = { 'n', 'v' }, }, { 'cxf', 'ChatGPTRun fix_bugs', desc = 'Fix Bugs', mode = { 'n', 'v' }, }, { 'cxr', 'ChatGPTRun explain_code', desc = 'Explain Code', mode = { 'n', 'v' }, }, { 'cxr', 'ChatGPTRun roxygen_edit', desc = 'Roxygen Edit', mode = { 'n', 'v' }, }, { 'cxl', 'ChatGPTRun code_readability_analysis', desc = 'Code Readability Analysis', mode = { 'n', 'v' }, }, }, } M.codesnap = { { -- Save selected code snapshot into clipboard 'cy', 'CodeSnap', desc = 'Save selected code snapshot into clipboard', mode = 'x', }, { -- Save selected code snapshot in ~/Pictures 'cs', 'CodeSnapSave', desc = 'Save selected code snapshot in ~/Pictures', mode = 'x', }, { -- Highlight and snapshot selected code into clipboard 'ch', 'CodeSnapHighlight', desc = 'Highlight and snapshot selected code into clipboard', mode = 'x', }, { -- Save ASCII code snapshot into clipboard 'ci', 'CodeSnapASCII', desc = 'Save ASCII code snapshot into clipboard', mode = 'x', }, } M.easyalign = { { -- EasyAlign 'g\\', '(EasyAlign)', desc = 'EasyAlign', mode = { 'n', 'x' }, }, } M.cipher = { base64 = { { lhs = 'g?', rhs = function() require('data.func').base64_encode_text() end, desc = 'Base64 Encode', mode = 'n', }, { lhs = 'g?', rhs = function() require('data.func').base64_encode_visual() end, desc = 'Base64 Encode', mode = 'v', }, { lhs = 'g/', rhs = function() require('data.func').base64_decode_text() end, desc = 'Base64 Decode', mode = 'n', }, { lhs = 'g/', rhs = function() require('data.func').base64_decode_visual() end, desc = 'Base64 Decode', mode = 'v', }, }, hex = { { lhs = 'g?', rhs = function() require('data.func').hex_encode_text() end, desc = 'Hex Encode', mode = 'n', }, { lhs = 'g?', rhs = function() require('data.func').hex_encode_visual() end, desc = 'Hex Encode', mode = 'v', }, { lhs = 'g/', rhs = function() require('data.func').hex_decode_text() end, desc = 'Hex Decode', mode = 'n', }, { lhs = 'g/', rhs = function() require('data.func').hex_decode_visual() end, desc = 'Hex Decode', mode = 'v', }, }, rot47 = { { lhs = 'g?', rhs = function() require('data.func').rot47_text() end, desc = 'ROT47 Encode', mode = 'n', }, { lhs = 'g?', rhs = function() require('data.func').rot47_visual() end, desc = 'ROT47 Encode', mode = 'v', }, }, } M.cmd_mode = function() if not require('data.func').is_installed('which_key', { load = true }) then -- Disable the original `q:` mapping vim.keymap.set('n', 'q:', '', { noremap = true, silent = true }) -- Remap `q:` functionality to `q:` vim.keymap.set( 'n', 'q:', 'q:', { noremap = true, silent = false, desc = 'Command Mode' } ) else -- Disable the original `q:` mapping and hide it from which-key require('which-key').add({ lhs = 'q:', rhs = '', mode = 'n', hidden = true, noremap = true, silent = true, }) -- Remap `q:` functionality to `q:` require('which-key').add({ lhs = 'q:', rhs = 'q:', mode = 'n', noremap = true, silent = false, desc = 'Command Mode', }) end end M.cpp_picker = { { -- Cpp Picker 'fC', function() require('data.func').search_cpp_files() end, desc = 'Pick C++ and H files', }, } M.flash = { { -- Flash jump to next '', function() require('flash').jump() end, desc = 'Flash jump', mode = { 'n', 'o', 'v' }, }, } M.minimap = { func = function() -- Add NeoMiniMap menu require('data.func').add_keymap(M.group.minimap) -- Add NeoMiniMap keys return M.minimap.keys end, keys = { { -- Toggle minimap 'nt', 'Neominimap toggle', desc = 'Toggle minimap', }, { -- Enable minimap 'no', 'Neominimap on', desc = 'Enable minimap', }, { -- Disable minimap 'nc', 'Neominimap off', desc = 'Disable minimap', }, { -- Refresh minimap 'nf', 'Neominimap focus', desc = 'Focus on minimap', }, { -- Unfocus minimap 'nu', 'Neominimap unfocus', desc = 'Unfocus minimap', }, { -- Toggle focus 'ns', 'Neominimap toggleFocus', desc = 'Toggle focus on minimap', }, { -- Toggle minimap for current window 'nwt', 'Neominimap winToggle', desc = 'Toggle minimap for current window', }, { -- Refresh minimap for current window 'nwr', 'Neominimap winRefresh', desc = 'Refresh minimap for current window', }, { -- Enable minimap for current window 'nwo', 'Neominimap winOn', desc = 'Enable minimap for current window', }, { -- Disable minimap for current window 'nwc', 'Neominimap winOff', desc = 'Disable minimap for current window', }, { -- Toggle minimap for current buffer 'nbt', 'Neominimap bufToggle', desc = 'Toggle minimap for current buffer', }, { -- Refresh minimap for current buffer 'nbr', 'Neominimap bufRefresh', desc = 'Refresh minimap for current buffer', }, { -- Enable minimap for current buffer 'nbo', 'Neominimap bufOn', desc = 'Enable minimap for current buffer', }, { -- Disable minimap for current buffer 'nbc', 'Neominimap bufOff', desc = 'Disable minimap for current buffer', }, }, } M.neocodeium = { { -- Accept suggestion '', function() require('neocodeium').accept() end, desc = 'Accept suggestion', mode = 'i', }, { -- Accept word '', function() require('neocodeium').accept_word() end, desc = 'Accept word', mode = 'i', }, { -- Accept line '', function() require('neocodeium').accept_line() end, desc = 'Accept line', mode = 'i', }, { -- Cycle or complete (previous) '', function() require('neocodeium').cycle_or_complete(-1) end, desc = 'Cycle or complete (previous)', mode = 'i', }, { -- Cycle or complete (next) '', function() require('neocodeium').cycle_or_complete() end, desc = 'Cycle or complete (next)', mode = 'i', }, { -- NeoCodeium Chat 'ch', function() require('neocodeium').chat() end, desc = 'NeoCodeium Chat', }, } M.foldnav = { { -- Goto Start '', function() require('foldnav').goto_start() end, }, { -- Goto Next '', function() require('foldnav').goto_next() end, }, { -- Goto Prev '', function() require('foldnav').goto_prev_start() end, }, { -- Goto End '', function() require('foldnav').goto_end() end, }, } M.gitlinker = { { -- Yank git link 'gy', 'GitLink', mode = { 'n', 'v' }, desc = 'Yank git link', }, { -- Open git link 'gY', 'GitLink!', mode = { 'n', 'v' }, desc = 'Open git link', }, } M.gitgraph = { { -- gitgraph_toggle 'gm', function() require('utils.git').gitgraph_toggle() end, desc = 'GitGraph - Toggle', }, } M.gist = { func = function() -- Add gists menu require('data.func').add_keymap(M.group.gist) -- Add gists keys return M.gist.keys end, keys = { { -- Create Gist 'gnc', 'GistCreate', desc = 'Create Gist', mode = { 'n', 'x' }, }, { -- Find Gists 'gnf', 'GistList', desc = 'Find Gists', }, }, } M.undotree = function() require('data.func').add_keymap( 'uu', 'UndotreeToggle', 'Toggle UndoTree' ) end M.gp = { func = function() -- Use which-key directly if pcall(require, 'which-key') then require('which-key').add(M.gp.keys) end end, keys = { -- VISUAL mode mappings -- s, x, v modes are handled the same way by which_key { mode = { 'v' }, nowait = true, remap = false, { '', ":'<,'>GpChatNew tabnew", desc = 'ChatNew tabnew', }, { '', ":'<,'>GpChatNew vsplit", desc = 'ChatNew vsplit', }, { '', ":'<,'>GpChatNew split", desc = 'ChatNew split', }, { 'a', ":'<,'>GpAppend", desc = 'Visual Append (after)' }, { 'b', ":'<,'>GpPrepend", desc = 'Visual Prepend (before)', }, { 'c', ":'<,'>GpChatNew", desc = 'Visual Chat New' }, { 'g', group = 'generate into new ..' }, { 'ge', ":'<,'>GpEnew", desc = 'Visual GpEnew' }, { 'gn', ":'<,'>GpNew", desc = 'Visual GpNew' }, { 'gp', ":'<,'>GpPopup", desc = 'Visual Popup' }, { 'gt', ":'<,'>GpTabnew", desc = 'Visual GpTabnew' }, { 'gv', ":'<,'>GpVnew", desc = 'Visual GpVnew' }, { 'i', ":'<,'>GpImplement", desc = 'Implement selection' }, { 'n', 'GpNextAgent', desc = 'Next Agent' }, { 'p', ":'<,'>GpChatPaste", desc = 'Visual Chat Paste' }, { 'r', ":'<,'>GpRewrite", desc = 'Visual Rewrite' }, { 's', 'GpStop', desc = 'GpStop' }, { 't', ":'<,'>GpChatToggle", desc = 'Visual Toggle Chat' }, { 'w', group = 'Whisper' }, { 'wa', ":'<,'>GpWhisperAppend", desc = 'Whisper Append' }, { 'wb', ":'<,'>GpWhisperPrepend", desc = 'Whisper Prepend', }, { 'we', ":'<,'>GpWhisperEnew", desc = 'Whisper Enew' }, { 'wn', ":'<,'>GpWhisperNew", desc = 'Whisper New' }, { 'wp', ":'<,'>GpWhisperPopup", desc = 'Whisper Popup' }, { 'wr', ":'<,'>GpWhisperRewrite", desc = 'Whisper Rewrite', }, { 'wt', ":'<,'>GpWhisperTabnew", desc = 'Whisper Tabnew' }, { 'wv', ":'<,'>GpWhisperVnew", desc = 'Whisper Vnew' }, { 'ww', ":'<,'>GpWhisper", desc = 'Whisper' }, { 'x', ":'<,'>GpContext", desc = 'Visual GpContext' }, }, -- NORMAL mode mappings { mode = { 'n' }, nowait = true, remap = false, { '', 'GpChatNew tabnew', desc = 'New Chat tabnew' }, { '', 'GpChatNew vsplit', desc = 'New Chat vsplit' }, { '', 'GpChatNew split', desc = 'New Chat split' }, { 'a', 'GpAppend', desc = 'Append (after)' }, { 'b', 'GpPrepend', desc = 'Prepend (before)' }, { 'c', 'GpChatNew', desc = 'New Chat' }, { 'f', 'GpChatFinder', desc = 'Chat Finder' }, { 'g', group = 'generate into new ..' }, { 'ge', 'GpEnew', desc = 'GpEnew' }, { 'gn', 'GpNew', desc = 'GpNew' }, { 'gp', 'GpPopup', desc = 'Popup' }, { 'gt', 'GpTabnew', desc = 'GpTabnew' }, { 'gv', 'GpVnew', desc = 'GpVnew' }, { 'n', 'GpNextAgent', desc = 'Next Agent' }, { 'r', 'GpRewrite', desc = 'Inline Rewrite' }, { 's', 'GpStop', desc = 'GpStop' }, { 't', 'GpChatToggle', desc = 'Toggle Chat' }, { 'w', group = 'Whisper' }, { 'wa', 'GpWhisperAppend', desc = 'Whisper Append (after)', }, { 'wb', 'GpWhisperPrepend', desc = 'Whisper Prepend (before)', }, { 'we', 'GpWhisperEnew', desc = 'Whisper Enew' }, { 'wn', 'GpWhisperNew', desc = 'Whisper New' }, { 'wp', 'GpWhisperPopup', desc = 'Whisper Popup' }, { 'wr', 'GpWhisperRewrite', desc = 'Whisper Inline Rewrite', }, { 'wt', 'GpWhisperTabnew', desc = 'Whisper Tabnew' }, { 'wv', 'GpWhisperVnew', desc = 'Whisper Vnew' }, { 'ww', 'GpWhisper', desc = 'Whisper' }, { 'x', 'GpContext', desc = 'Toggle GpContext' }, }, -- INSERT mode mappings { mode = { 'i' }, nowait = true, remap = false, { '', 'GpChatNew tabnew', desc = 'New Chat tabnew' }, { '', 'GpChatNew vsplit', desc = 'New Chat vsplit' }, { '', 'GpChatNew split', desc = 'New Chat split' }, { 'a', 'GpAppend', desc = 'Append (after)' }, { 'b', 'GpPrepend', desc = 'Prepend (before)' }, { 'c', 'GpChatNew', desc = 'New Chat' }, { 'f', 'GpChatFinder', desc = 'Chat Finder' }, { 'g', group = 'generate into new ..' }, { 'ge', 'GpEnew', desc = 'GpEnew' }, { 'gn', 'GpNew', desc = 'GpNew' }, { 'gp', 'GpPopup', desc = 'Popup' }, { 'gt', 'GpTabnew', desc = 'GpTabnew' }, { 'gv', 'GpVnew', desc = 'GpVnew' }, { 'n', 'GpNextAgent', desc = 'Next Agent' }, { 'r', 'GpRewrite', desc = 'Inline Rewrite' }, { 's', 'GpStop', desc = 'GpStop' }, { 't', 'GpChatToggle', desc = 'Toggle Chat' }, { 'w', group = 'Whisper' }, { 'wa', 'GpWhisperAppend', desc = 'Whisper Append (after)', }, { 'wb', 'GpWhisperPrepend', desc = 'Whisper Prepend (before)', }, { 'we', 'GpWhisperEnew', desc = 'Whisper Enew' }, { 'wn', 'GpWhisperNew', desc = 'Whisper New' }, { 'wp', 'GpWhisperPopup', desc = 'Whisper Popup' }, { 'wr', 'GpWhisperRewrite', desc = 'Whisper Inline Rewrite', }, { 'wt', 'GpWhisperTabnew', desc = 'Whisper Tabnew' }, { 'wv', 'GpWhisperVnew', desc = 'Whisper Vnew' }, { 'ww', 'GpWhisper', desc = 'Whisper' }, { 'x', 'GpContext', desc = 'Toggle GpContext' }, }, }, } M.group = { avante = { { -- Avante lhs = 'a', icon = { icon = '', color = 'red' }, group = 'Avante', }, }, chatgpt = { -- ChatGPT lhs = 'cx', group = 'ChatGPT', icon = { icon = '', color = 'blue' }, }, gist = { -- Gists menu lhs = 'gn', group = 'Gists', icon = { icon = '', color = 'orange' }, }, minimap = { -- MiniMap menu lhs = 'n', group = 'MiniMap', icon = { icon = '', color = 'green' }, }, nvimup = { { -- Neovim Updater menu lhs = 'qu', group = 'Neovim Updater', icon = { icon = '', color = 'red' }, }, { -- Neovim Updater Commits menu lhs = 'quc', group = 'New Commits', icon = { icon = '', color = 'green' }, }, { -- MultiCursor lhs = 'm', group = 'MultiCursor', icon = { icon = '󰬸', color = 'green' }, }, }, } M.groups = { { -- Lazy menu lhs = 'l', group = 'Lazy', icon = { icon = '󰒲', color = 'red' }, }, } M.help = { { -- Lookup word lhs = 'h', rhs = "execute 'help ' . expand('')", desc = 'Lookup word', }, { -- Lookup selection lhs = 'h', rhs = function() require('data.func').help_lookup_visual() end, desc = 'Lookup selection', mode = 'v', }, } M.multicursor = { { '', function() require('multicursor-nvim').addCursor('k') end, mode = { 'n', 'v' }, desc = 'Add Cursor Above', }, { '', function() require('multicursor-nvim').addCursor('j') end, mode = { 'n', 'v' }, desc = 'Add Cursor Below', }, { '', function() require('multicursor-nvim').addCursor('*') end, desc = 'Add Cursor and Skip Word', mode = { 'n', 'v' }, }, { '', function() require('multicursor-nvim').skipCursor('*') end, desc = 'Skip Word', mode = { 'n', 'v' }, }, { '', function() require('multicursor-nvim').nextCursor() end, desc = 'Next Cursor', mode = { 'n', 'v' }, }, { '', function() require('multicursor-nvim').prevCursor() end, desc = 'Previous Cursor', mode = { 'n', 'v' }, }, { 'mx', function() require('multicursor-nvim').deleteCursor() end, desc = 'Delete Cursor', mode = { 'n', 'v' }, }, { '', function() require('multicursor-nvim').handleMouse() end, desc = 'Add/Remove Cursor', mode = 'n', }, { '', function() if require('multicursor-nvim').cursorsEnabled() then require('multicursor-nvim').disableCursors() -- Stop other cursors from moving, allowing main cursor repositioning. else require('multicursor-nvim').addCursor() -- Add a cursor if none are enabled. end end, desc = 'Add Cursor', mode = { 'n', 'v' }, }, { '', function() if not require('multicursor-nvim').cursorsEnabled() then require('multicursor-nvim').enableCursors() -- Enable cursors. elseif require('multicursor-nvim').hasCursors() then require('multicursor-nvim').clearCursors() -- Clear all cursors. else -- Default handler can be defined here if needed. end end, desc = 'Escape Handler', mode = 'n', }, { 'ma', function() require('multicursor-nvim').alignCursors() end, desc = 'Align Cursors', mode = 'n', }, { 'mS', function() require('multicursor-nvim').splitCursors() end, desc = 'Split Cursors', mode = 'v', }, { 'mI', function() require('multicursor-nvim').insertVisual() end, desc = 'Insert Visual', mode = 'v', }, { 'mA', function() require('multicursor-nvim').appendVisual() end, desc = 'Append Visual', mode = 'v', }, { 'mM', function() require('multicursor-nvim').matchCursors() end, desc = 'Match Cursors', mode = 'v', }, { 'mt', function() require('multicursor-nvim').transposeCursors(1) end, desc = 'Transpose Cursors  ', mode = 'v', }, { 'mT', function() require('multicursor-nvim').transposeCursors(-1) end, desc = 'Transpose Cursors  ', mode = 'v', }, } M.nvimup = { { -- Update Neovim from source 'quU', ':UpdateNeovim', desc = 'Update Neovim', }, { -- Update Neovim from source in debug mode 'quD', function() require('nvim_updater').update_neovim({ build_type = 'Debug' }) end, desc = 'Debug Build Neovim', }, { -- Update Neovim from source in release mode 'quR', function() require('nvim_updater').update_neovim({ build_type = 'Release' }) end, desc = 'Release Build Neovim', }, { -- Remove Neovim Source directory 'quX', function() require('nvim_updater').remove_source_dir() end, desc = 'Remove Neovim Source', }, { -- Show new nvim source commits in Telescope 'quct', function() require('nvim_updater').show_new_commits_in_telescope() end, desc = 'Show New Commits in Telescope', }, { -- Show new nvim source commits in DiffView 'qucd', function() require('nvim_updater').show_new_commits_in_diffview() end, desc = 'Show New Commits in DiffView', }, { -- Show new nvim source commits in terminal 'qucc', function() require('nvim_updater').show_new_commits() end, desc = 'Show New Commits in terminal', }, } M.gx = { { -- Open URL/Link 'gx', 'Browse', mode = { 'n', 'x' }, desc = 'Open URL/Link', }, } M.indentor = { { -- Indentor '', function() require('utils.indentor').insert_previous_line_indentation() end, 'Insert Previous Line Indentation', { 'i', 'n' }, }, } M.lazygit = { { -- LazyGit 'lg', function() require('data.func').open_lazygit_popup() end, desc = 'LazyGit', }, } ---@function Helper function to toggle mini.files explorer ---@param ... any Optional arguments to pass to mini.files.open local minifiles_toggle = function(...) if not require('mini.files').close() then require('mini.files').open(...) end end --- MiniFiles keymaps M.minifiles = { { 'fm', function() minifiles_toggle(vim.api.nvim_buf_get_name(0), true) end, desc = 'Open mini.files', }, { 'fM', function() minifiles_toggle(vim.uv.cwd(), true) end, desc = 'Open mini.files (CWD)', }, { -- Mini.files '\\', function() minifiles_toggle(vim.api.nvim_buf_get_name(0), true) end, desc = 'Open mini.files', }, { -- Mini.files 'sf', function() minifiles_toggle(vim.api.nvim_buf_get_name(0), true) end, desc = 'Open mini.files', }, } --- Misc keymaps M.misc = { { -- jk in insert and visual to escape 'jk', '', mode = { 'i', 'v' }, desc = 'Escape', }, { -- Clear search highlight 's', 'noh', desc = 'Clear search', }, { -- Modeline 'cM', function() require('data.func').append_modeline() end, desc = 'Add Modeline', }, { -- Yank line (without whitespace) lhs = 'yo', rhs = function() rootiest.yank_line() end, desc = 'Yank Line-text', }, { -- Yank and trim selection lhs = 'y', rhs = function() require('data.func').trim_yank() end, desc = 'Yank and trim selection', }, { -- Hardmode lhs = 'uH', rhs = function() rootiest.toggle_hardmode() end, desc = 'Toggle Hardmode', }, { -- Reload config lhs = 'qr', rhs = function() require('data.func').reload_config() end, desc = 'Reload Config', }, { -- Yank buffer lhs = 'Y', rhs = '%y', desc = 'Yank buffer contents', }, { -- Select all lhs = '', rhs = 'norm ggVG', desc = 'Select all', }, { -- Explorer lhs = '', rhs = 'lua Snacks.picker.explorer()', desc = 'Toggle Snacks Explorer', }, { -- Explorer lhs = 'F', rhs = function() if require('data.cond').neotree() then vim.cmd('Neotree reveal toggle') else Pick('explorer') end end, desc = 'File Explorer', }, -- { -- Split Window Vertically -- lhs = '\\', -- rhs = 'v', -- desc = 'Split Window Right', -- }, { -- Split Window Vertically lhs = '|', rhs = 'v', desc = 'Split Window Right', }, { -- Smart Pick Files lhs = '', rhs = function() Pick('smart') end, desc = 'Find Files', }, { -- Grep files lhs = '/', rhs = function() Pick({ cmd = 'grep' }) end, desc = 'Grep Files', }, { -- Exit Neovim lhs = 'Q', rhs = "lua require('data').func.exit()", desc = 'Exit Neovim', }, { -- LazyVim lhs = 'lv', rhs = 'Lazy', desc = 'LazyVim', }, { -- LazyExtras lhs = 'lx', rhs = 'LazyExtras', desc = 'LazyExtras', }, { -- De-map Ctrl+Shift+LeftClick to avoid conflicts with WezTerm lhs = '', rhs = '', desc = 'Prevent conflict with WezTerm hyperlinks', mode = 'n', hidden = true, }, { -- Visual mode: Move selected block of text up lhs = 'K', rhs = function() local count = vim.v.count1 require('data.func').move_visual(true, count) end, desc = 'Move block of text up', mode = 'v', }, { -- Visual mode: Move selected block of text down lhs = 'J', rhs = function() local count = vim.v.count1 require('data.func').move_visual(false, count) end, desc = 'Move block of text down', mode = 'v', }, { -- Test Prompt: Enter your name lhs = 'qP', rhs = function() require('data.func').InputPrompt('Enter your name: ', function(input) if input then -- trim whitespace from end of input input = input:gsub('%s+$', '') print('👋😎 Hello ' .. input .. '!') else print('Input was canceled') end end) end, desc = 'Test Prompt', }, { -- Paste over text with overwrite lhs = 'cp', rhs = function() require('data.func').paste_overwrite() end, desc = 'Paste overwrite', mode = 'n', }, { -- Dump buffer contents to a table in register lhs = 'bY', rhs = function() require('data.func').dump_buffer_to_table('+') end, desc = 'Yank buffer as table', mode = 'n', }, { -- Yank buffer lhs = 'by', rhs = '%y', desc = 'Yank buffer', mode = 'n', }, } M.nekifoch = { { -- List Fonts 'u,l', 'Nekifoch list', desc = 'Fonts list', }, { -- Check Font 'u,c', 'Nekifoch check', desc = 'Check current font settings', }, { -- Set Font Family 'u,f', function() require('nekifoch.nui_set_font')() end, desc = 'Set font family', }, { -- Set Font Size 'u,s', function() require('nekifoch.nui_set_size')() end, desc = 'Set font size', }, } M.precog = { { -- Toggle Precognition 'zk', function() require('config.rootiest').toggle_precognition() end, desc = 'Toggle Precognition', }, } M.qalc = { -- { -- Open Qalc -- "qc", -- "Qalc", -- desc = "Qalc", -- }, { -- Set a key mapping to run :Qalc and enter insert mode 'qc', function() -- Run the Qalc command vim.cmd('Qalc') -- Enter insert mode directly vim.cmd('startinsert') end, desc = 'Qalc', }, } M.recorder = { { 'q', desc = ' Start Recording' }, { 'Q', desc = ' Play Recording' }, } M.ripsub = { { -- Rip Substitute 'fs', function() require('rip-substitute').sub() end, mode = { 'n', 'x' }, desc = 'Rip Substitute', }, } M.smearcursor = function() require('snacks.toggle') .new({ id = 'smearcursor', name = 'Smear-Cursor', get = function() return require('smear_cursor').enabled end, set = function() require('smear_cursor').toggle() end, }) :map('uW') end M.snacksterm = { -- { -- Toggle Terminal -- lhs = '', -- rhs = function() -- require('snacks.terminal').toggle() -- end, -- desc = 'Toggle Terminal', -- }, } M.splitjoin = { toggle = 'gJ', } M.splits = { resize = { { -- Resize split leftwards '', function() require('smart-splits').resize_left() end, desc = 'Resize split left', }, { -- Resize split downwards '', function() require('smart-splits').resize_down() end, desc = 'Resize split down', }, { -- Resize split upwards '', function() require('smart-splits').resize_up() end, desc = 'Resize split up', }, { -- Resize split rightwards '', function() require('smart-splits').resize_right() end, desc = 'Resize split right', }, { -- Start interactive split resizing '', function() require('smart-splits').start_resize_mode() end, desc = 'Resize split interactively', }, }, move = { { -- Move cursor to split left '', function() require('smart-splits').move_cursor_left() end, desc = 'Move to split left', }, { -- Move cursor to split below '', function() require('smart-splits').move_cursor_down() end, desc = 'Move to split below', }, { -- Move cursor to split above '', function() require('smart-splits').move_cursor_up() end, desc = 'Move to split above', }, { -- Move cursor to split right '', function() require('smart-splits').move_cursor_right() end, desc = 'Move to split right', }, { -- Move cursor to previous split '', function() require('smart-splits').move_cursor_previous() end, desc = 'Move to previous split', }, }, swap = { { -- Swap buffer with the one to the left '', function() require('smart-splits').swap_buf_left() end, desc = 'Swap buffer left', }, { -- Swap buffer with the one below '', function() require('smart-splits').swap_buf_down() end, desc = 'Swap buffer down', }, { -- Swap buffer with the one above '', function() require('smart-splits').swap_buf_up() end, desc = 'Swap buffer up', }, { -- Swap buffer with the one to the right '', function() require('smart-splits').swap_buf_right() end, desc = 'Swap buffer right', }, }, } M.substitute = { { -- Substitute operator in normal mode 'x', function() require('substitute').operator() end, desc = 'Substitute operator', }, { -- Substitute line in normal mode 'xx', function() require('substitute').line() end, desc = 'Substitute line', }, { -- Substitute end of line in normal mode 'X', function() require('substitute').eol() end, desc = 'Substitute end of line', }, { -- Substitute visual selection in visual mode 'x', function() require('substitute').visual() end, desc = 'Substitute visual selection', mode = 'x', }, { -- Substitute visual selection in visual mode 'm', function() require('substitute').visual() end, desc = 'Substitute', mode = 'x', }, } M.overrides = { { -- De-map 's' to avoid conflicts with mini.surround lhs = 's', rhs = '', -- This disables the keymap desc = 'Surround', mode = { 'n', 'x' }, }, { -- Stop snippet when leaving insert mode lhs = '', rhs = function() vim.snippet.stop() return '' end, }, } M.telescope = { cmdline = { { ':', function() require('telescope').extensions.cmdline.cmdline() end, desc = 'Cmdline', }, }, lazy = { { 'fz', function() require('telescope').extensions.lazy.lazy() end, desc = 'Lazy Picker', }, }, symbols = { { -- Telescope Symbols 'f.', function() require('telescope.builtin').symbols({ sources = { 'nerd', 'emoji', 'kaomoji', 'gitmoji', 'math', 'latex', 'julia', }, }) end, desc = 'Pick Icons', }, { -- Pick Icon in insert mode '', function() require('telescope.builtin').symbols({ sources = { 'nerd', 'emoji', 'kaomoji', 'gitmoji', 'math', 'latex', 'julia', }, }) end, desc = 'Pick Icon', mode = 'i', }, }, toggleterm = { { -- Pick ToggleTerms 'ft', function() require('toggleterm-manager').open({}) end, desc = 'Pick Terminals', mode = 'n', }, }, filebrowser = { { 'e', function() require('telescope').extensions.file_browser.file_browser() end, desc = 'Telescope File Browser', mode = 'n', }, { 'sF', function() require('telescope').extensions.file_browser.file_browser() end, desc = 'Telescope File Browser', mode = 'n', }, }, } M.toggleterm = { { -- Toggle Terminal '', 'ToggleTerm', desc = 'Toggle Terminal', mode = 'n', }, } M.transparent = { { 'wt', function() require('transparent').toggle() end, desc = 'Toggle Transparency', }, } M.yanky = { { -- Yanky put after 'P', '(YankyPutAfter)', desc = 'Yanky put after', mode = { 'n', 'x' }, }, { -- Yanky put before 'p', '(YankyPutBefore)', desc = 'Yanky put before', mode = { 'n', 'x' }, }, { -- Yanky gput after 'gP', '(YankyGPutAfter)', desc = 'Yanky gput after', mode = { 'n', 'x' }, }, { -- Yanky gput before 'gp', '(YankyGPutBefore)', desc = 'Yanky gput before', mode = { 'n', 'x' }, }, { -- Yanky previous entry '', '(YankyPreviousEntry)', desc = 'Yanky previous entry', mode = 'n', }, { -- Yanky next entry '', '(YankyNextEntry)', desc = 'Yanky next entry', mode = 'n', }, { -- Put indent after linewise ']p', '(YankyPutIndentAfterLinewise)', desc = 'Put indent after linewise', }, { -- Put indent before linewise '[p', '(YankyPutIndentBeforeLinewise', desc = 'Put indent before linewise', }, { -- Put indent after linewise (uppercase) ']P', '(YankyPutIndentAfterLinewise)', desc = 'Put indent after linewise (uppercase)', }, { -- Put indent before linewise (uppercase) '[P', '(YankyPutIndentBeforeLinewise)', desc = 'Put indent before linewise (uppercase)', }, { -- Put indent after shift right '>p', '(YankyPutIndentAfterShiftRight)', desc = 'Put indent after shift right', }, { -- Put indent after shift left '(YankyPutIndentAfterShiftLeft)', desc = 'Put indent after shift left', }, { -- Put indent before shift right '>P', '(YankyPutIndentBeforeShiftRight)', desc = 'Put indent before shift right', }, { -- Put indent before shift left '(YankyPutIndentBeforeShiftLeft)', desc = 'Put indent before shift left', }, { -- Put after filter '=p', '(YankyPutAfterFilter)', desc = 'Put after filter', }, { -- Put before filter '=P', '(YankyPutBeforeFilter)', desc = 'Put before filter', }, { -- Last put in operator-pending mode 'lp', -- Left-hand side (key combination) function() require('yanky.textobj').last_put() end, desc = 'Last put', mode = { 'x', 'o' }, }, { -- Open Yank History 'p', -- Left-hand side (key combination) function() if pcall(require, 'telescope') then require('telescope').extensions.yank_history.yank_history() else vim.cmd('YankyRingHistory') end end, desc = 'Yank History', }, } M.zen = { { -- Toggle ZenMode 'z', function() require('zen-mode').toggle() end, desc = 'Toggle ZenMode', }, } return M