-- Personal keymaps (plugin-agnostic). Plugin-bound keys live in their specs. local function map(mode, lhs, rhs, opts) local options = { noremap = true, silent = true } if opts then options = vim.tbl_extend('force', options, opts) end vim.keymap.set(mode, lhs, rhs, options) end local function no(lhs, rhs) map('n', lhs, rhs, { silent = false }) end local function no_s(lhs, rhs) map('n', lhs, rhs) end local function no_r(lhs, rhs) map('n', lhs, rhs, { noremap = false, silent = false }) end local function i(lhs, rhs) map('i', lhs, rhs, { silent = false }) end local function i_s(lhs, rhs) map('i', lhs, rhs) end local function v_s(lhs, rhs) map('v', lhs, rhs) end -- disable arrow keys and middle-click (muscle memory from the old config) no_s('', '') no_s('', '') no_s('', '') no_s('', '') no_s('', '') no_s('', '') v_s('', '') v_s('', '') v_s('', '') v_s('', '') v_s('', '') v_s('', '') -- escape from insert mode on home-row bigrams i_s('jj', '') i_s('jk', '') i_s('kj', '') i_s('чя', '') i_s('', '') i_s('', '') -- bracket-return expansions: open a line between the delimiters, indented i('[', '[]O') i('{', '{}O') i('(', '()O') vim.keymap.set({ 'n', 'i', 'v' }, '', '') -- Russian-layout fixes: `ж` types `:`, `W`/`E`/`w'` expand in cmdline no_r('ж', ':') vim.cmd.cnoreabbrev({ " W", "((getcmdtype() is# ':' && getcmdline() is# 'W')?('w'):('W'))" }) vim.cmd.cnoreabbrev({ " E", "((getcmdtype() is# ':' && getcmdline() is# 'E')?('e'):('E'))" }) vim.cmd.cnoreabbrev({ " w'", "(getcmdtype() == \":\" && getcmdline() == \"w'\" ? \"w\" : \"w'\")" })