local M = {} local diagnostic = require 'fschauen.diagnostic' local window = require 'fschauen.window' local pick = require('fschauen.telescope').pickers local toggle_number = function() vim.wo.number = not vim.wo.number vim.wo.relativenumber = false end local toggle_relativenumber = function() vim.wo.relativenumber = not vim.wo.relativenumber vim.wo.number = vim.wo.relativenumber or vim.wo.number end local toggle_colorcolumn = function() if vim.o.colorcolumn == '' then vim.o.colorcolumn = '+1' -- one after 'textwidth' else vim.o.colorcolumn = '' -- none end end local keymap = { -- better navigation for wrapped lines { 'j', 'gj' }, { 'k', 'gk' }, -- maintain cursor position when joining lines { 'J', 'mzJ`z' }, -- retain selection when making changes in visual mode { '', 'gv', mode = 'v' }, { '', 'gv', mode = 'v' }, { 'g', 'ggv', mode = 'v' }, { 'g', 'ggv', mode = 'v' }, { '>', '>gv', mode = 'v' }, { '<', '<gv', mode = 'v' }, -- place destination of important movements in the center of the screen { 'n', 'nzzzv' }, { 'N', 'Nzzzv' }, { '', 'zzzv' }, { '', 'zzzv' }, -- easier window navigation { '', 'j' }, { '', 'k' }, { '', 'h' }, { '', 'l' }, -- window resizing { '', window.resize_up(2), desc = 'Resize window upward' }, { '', window.resize_down(2), desc = 'Resize window downward' }, { '', window.resize_left(2), desc = 'Resize window leftward' }, { '', window.resize_right(2), desc = 'Resize window rightward' }, -- easy tab navigation { '', 'tabnext' }, { '', 'tabprevious' }, -- move lines up and down { '', [[:move .+1==]] }, { '', [[:move .-2==]] }, { '', [[:move '>+1gv=gv]], mode = 'v' }, { '', [[:move '<-2gv=gv]], mode = 'v' }, { '', [[:move .+1==gi]], mode = 'i' }, { '', [[:move .-2==gi]], mode = 'i' }, -- move to begin/end of line in insert mode { '', '^', mode = 'i' }, { '', '$', mode = 'i' }, -- move to begin of line in command mode ( moves to end by default) { '', '', mode = 'c' }, -- more convenient way of entering normal mode from terminal mode { [[]], [[]], mode = 't' }, -- recall older/recent command-line from history { '', '', mode = 'c' }, { '', '', mode = 'c' }, -- quickly change background { 'bg', [[let &background = &background ==? 'light' ? 'dark' : 'light']] }, -- navigate diagnostics { 'dj', diagnostic.goto_next }, { 'dk', diagnostic.goto_prev }, { 'dd', diagnostic.toggle }, { 'do', diagnostic.open_float }, { 'dh', diagnostic.hide }, telescope_file_browser = { { 'fB', 'Telescope file_browser' , desc = ' file [B]rowser' }, }, telescope = { { 'fa', pick.autocommands ' Autocommands' , desc = ' Telescope [a]utocommands' }, { 'fb', pick.buffers ' Buffers' , desc = ' Telescope [b]uffers' }, { 'fc', pick.colorscheme ' Colorschemes' , desc = ' Telescope [c]olorschemes' }, { 'fdd', pick.diagnostics '󰀪 Document Diagnostics' , desc = ' Telescope [d]iagnostics [d]ocument' }, { 'fdw', pick.diagnostics '󰀪 Workspace Diagnostics', desc = ' Telescope [d]iagnostics [w]orkspace' }, --'fe' { 'ff', pick.find_files ' Files' , desc = ' Telescope [f]ind files' }, { 'fF', pick.all_files ' ALL files' , desc = ' Telescope all [F]iles' }, { 'fgr', pick.live_grep ' Live grep' , desc = ' Telescope Live [gr]ep' }, { 'fgf', pick.git_files ' Git files' , desc = ' Telescope [g]it [f]iles' }, { 'fgc', pick.git_commits ' Commits' , desc = ' Telescope [g]it [c]ommits' }, { 'fh', pick.here ' Current buffer' , desc = ' Telescope [b]uffer [h]ere' }, { 'fH', pick.highlights '󰌶 Highlights' , desc = ' Telescope [H]ighlights' }, --'fi' { 'fj', pick.jumplist ' Jumplist' , desc = ' Telescope [j]umplist' }, { 'fk', pick.keymaps ' Keymaps' , desc = ' Telescope [k]eymaps' }, { 'fK', pick.help_tags ' Help tags' , desc = ' Telescope [K] help/documentation' }, { 'fl', pick.loclist ' Location list' , desc = ' Telescope [l]ocation List' }, { 'fm', pick.man_pages ' Man pages' , desc = ' Telescope [m]an pages' }, --'fn' { 'fo', pick.vim_options ' Vim options' , desc = ' Telescope vim [o]ptions' }, --'fp' { 'fq', pick.quickfix ' Quickfix' , desc = ' Telescope [q]uickfix' }, { 'fr', pick.lsp_references ' References' , desc = ' Telescope [r]eferences' }, { 'fR', pick.registers '󱓥 Registers' , desc = ' Telescope [R]registers' }, { 'fs', pick.lsp_document_symbols '󰫧 Document Symbols ' , desc = ' Telescope lsp document [s]ymbols' }, { 'fS', pick.lsp_workspace_symbols '󱄑 Workspace Symbols ' , desc = ' Telescope lsp workspace [S]ymbols' }, --'ft' used in todo_comments below { 'fT', pick.treesitter ' Treesitter symbols' , desc = ' Telescope [T]reesitter Symbols' }, --'fu' --'fv' { 'fw', pick.selection ' Grep' , desc = ' Telescope [w]word under cursor' }, { 'fw', pick.selection ' Grep', mode = 'v' , desc = ' Telescope [w]ord(s) selected' }, --'fx' --'fy' { 'fz', pick.spell_suggest '󰓆 Spelling suggestions' , desc = ' Telescope [z] spell suggestions' }, { 'f.', pick.dotfiles ' Dotfiles' , desc = ' Telescope [.]dotfiles' }, { 'f:', pick.command_history ' Command history' , desc = ' Telescope [:]command history' }, { 'f?', pick.commands ' Commands' , desc = ' Telescope commands [?]' }, { 'f/', pick.search_history ' Search history' , desc = ' Telescope [/]search history' }, { 'f', pick.resume '󰐎 Resume' , desc = ' Telescope Resume ' }, }, todo_comments = { { 'ft', 'TodoTelescope' }, }, fugitive = { { 'gg', ':Git ' }, { 'gs', 'tab Git' }, { 'gb', 'Git blame' } }, neogit = { { 'gn', 'Neogit' }, }, -- disable highlight until next search { 'h', 'nohlsearch' }, -- navigate items in quickfix and location lists { 'j', 'cnextzz' }, { 'k', 'cpreviouszz' }, { 'j', 'lnextzz' }, { 'k', 'lpreviouszz' }, -- toggle quickfix and loclist { 'll', window.toggle_quickfix, desc = 'Toggle quickfix' }, { 'll', window.toggle_loclist, desc = 'Toggle loclist' }, trouble = { { 'lt', 'TroubleToggle' }, { 'lw', 'TroubleToggle workspace_diagnostics' }, { 'ld', 'TroubleToggle document_diagnostics' }, }, -- quickly open lazy.nvim plugin manager { 'L', 'Lazy' }, nvim_tree = { { 'nn', 'NvimTreeOpen' }, { 'nf', 'NvimTreeFindFile' }, { 'nc', 'NvimTreeClose' }, }, -- toggle options { 'sn', toggle_number }, { 'sr', toggle_relativenumber }, { 'sl', 'set list! | set list?' }, { 'sw', 'set wrap! | set wrap?' }, { 'ss', 'set spell! | set spell?' }, virt_column = { { 'sc', toggle_colorcolumn, desc = 'Toggle virtual colunn' }, }, indent_blankline = { { 'si', 'IndentBlanklineToggle' }, }, treesitter = { { 'tp', 'TSPlaygroundToggle' }, { 'th', 'TSHighlightCapturesUnderCursor' }, { 'tn', 'TSNodeUnderCursor' }, }, undotree = { { 'u', 'UndotreeToggle' }, }, whitespace ={ { 'ww', 'ToggleWhitespace' }, { 'wj', 'NextTrailingWhitespace' }, { 'wk', 'PrevTrailingWhitespace' }, { 'wd', 'StripWhitespace' }, }, } M.setup = function() local set = vim.keymap.set for _, map in ipairs(keymap) do local lhs, rhs, mode = map[1], map[2], map.mode or 'n' map[1], map[2], map.mode = nil, nil, nil map.silent = map.silent ~= false -- silent by default set(mode, lhs, rhs, map) end end setmetatable(M, { __index = function (_, k) return keymap[k] end }) return M