nvim-minimal/lua/config/keymaps.lua
mk 97a90cc1e5 Initial commit: nvim-minimal
A small, fast, portable Neovim config built on bare lazy.nvim (no LazyVim,
no LSPs, no Mason). Vendored `based` colorscheme (GPLv3, self-authored,
derived from vim-vividchalk) so the config loads on any machine with just
nvim + git — the listed treesitter parsers ship prebuilt, so no compiler
is needed for the configured languages.

Plugins: snacks.nvim (picker/explorer/buffers), nvim-treesitter (pinned to
master for the declarative ensure_installed/highlight/indent API), blink.cmp
(buffer+path completion, prebuilt binary), lualine, gitsigns, mini.align/
comment/surround.

Personal keymaps ported: jj/jk/kj/чя escape, ж -> :, Russian langmap, arrow
disables, bracket-return expansions, gc/sa-sd-sr/gz-gZ.
2026-07-28 03:23:41 +03:00

52 lines
1.8 KiB
Lua

-- 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('<up>', '<nop>')
no_s('<down>', '<nop>')
no_s('<left>', '<nop>')
no_s('<right>', '<nop>')
no_s('<c-left>', '<nop>')
no_s('<c-right>', '<nop>')
v_s('<up>', '<nop>')
v_s('<down>', '<nop>')
v_s('<left>', '<nop>')
v_s('<right>', '<nop>')
v_s('<c-left>', '<nop>')
v_s('<c-right>', '<nop>')
-- escape from insert mode on home-row bigrams
i_s('jj', '<esc>')
i_s('jk', '<esc>')
i_s('kj', '<esc>')
i_s('чя', '<esc>')
i_s('<esc>', '<nop>')
i_s('<C-c>', '<nop>')
-- bracket-return expansions: open a line between the delimiters, indented
i('[<CR>', '[<CR>]<Esc>O<BS><Tab>')
i('{<CR>', '{<CR>}<Esc>O<BS><Tab>')
i('(<CR>', '(<CR>)<Esc>O<BS><Tab>')
vim.keymap.set({ 'n', 'i', 'v' }, '<LeftMouse>', '<nop>')
-- Russian-layout fixes: `ж` types `:`, `W`/`E`/`w'` expand in cmdline
no_r('ж', ':')
vim.cmd.cnoreabbrev({ "<expr> W", "((getcmdtype() is# ':' && getcmdline() is# 'W')?('w'):('W'))" })
vim.cmd.cnoreabbrev({ "<expr> E", "((getcmdtype() is# ':' && getcmdline() is# 'E')?('e'):('E'))" })
vim.cmd.cnoreabbrev({ "<expr> w'", "(getcmdtype() == \":\" && getcmdline() == \"w'\" ? \"w\" : \"w'\")" })