local M = {} local diagnostic = require 'fschauen.diagnostic' local window = require 'fschauen.window' 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 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' }, { 'g*', 'g*zzzv' }, { 'g#', 'g#zzzv' }, { '', '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 { '', diagnostic.goto_next }, { '', diagnostic.goto_prev }, { 'dd', diagnostic.toggle }, { 'do', diagnostic.open_float }, { 'dh', diagnostic.hide }, { 'dt', diagnostic.select_virtual_text_severity }, -- 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' }, -- quickly open lazy.nvim plugin manager { 'L', 'Lazy' }, -- toggle options { 'sn', toggle_number }, { 'sr', toggle_relativenumber }, { 'sl', 'set list! | set list?' }, { 'sw', 'set wrap! | set wrap?' }, { 'ss', 'set spell! | set spell?' }, } 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 return M