local M = function(mode, lhs, rhs, opts) local merged_opts = vim.tbl_extend('keep', opts or {}, { noremap = true }) local map = { mode = mode, lhs = lhs, rhs = rhs, opts = merged_opts } map.remap = function() map.opts.noremap = false; return map end map.silent = function() map.opts.silent = true; return map end map.expr = function() map.opts.expr = true; return map end map.unique = function() map.opts.unique = true; return map end map.nowait = function() map.opts.nowait = true; return map end map.script = function() map.opts.script = true; return map end return map end local register = function(maps) for _, m in ipairs(maps) do vim.api.nvim_set_keymap(m.mode, m.lhs, m.rhs, m.opts) end end vim.g.mapleader = ' ' register { -- better navigation for wrapped lines M('n', 'j', 'gj'), M('n', 'k', 'gk'), -- retain selection when indenting/unindenting in visual mode M('v', '>', '>gv'), M('v', '<', '<gv'), -- easier window navigation M('n', '', 'j'), M('n', '', 'k'), M('n', '', 'h'), M('n', '', 'l'), -- window resizing M('n', '', 'resize +1'), M('n', '', 'resize -1'), M('n', '', 'vertical resize -1'), M('n', '', 'vertical resize +1'), -- easier tab navigation M('n', '', ':tabprevious').silent(), M('n', '', ':tabnext' ).silent(), -- move lines up and down M('n', '', [[:move .+1==]] ).silent(), M('n', '', [[:move .-2==]] ).silent(), M('v', '', [[:move '>+1gv=gv]] ).silent(), M('v', '', [[:move '<-2gv=gv]] ).silent(), M('i', '', [[:move .+1==gi]] ).silent(), M('i', '', [[:move .-2==gi]] ).silent(), -- cycle through line numbering modes M('n', 'ln', ':set nonumber norelativenumber' ).silent(), M('n', 'll', ':set number norelativenumber' ).silent(), M('n', 'lr', ':set number relativenumber' ).silent(), -- show list of buffers and prepare to switch M('n', 'bf', ':ls:b'), -- quickly change background M('n', 'bg', [[:let &background = &background ==? 'light' ? 'dark' : 'light']]), -- toggle search highlight M('n', 'h', ':set hlsearch!'), -- toggle NERDTree M('n', 'n', ':NERDTreeToggle'), -- toggle rainbow parens M('n', 'p', ':RainbowParentheses!!'), -- fix whitespace M('n', 'w', ':FixWhitespace'), }