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.
This commit is contained in:
mk committed 2026-07-28 03:23:41 +03:00
commit 97a90cc1e5
16 files changed
+575

No files matched your search

+1
View File
@@ -0,0 +1 @@
-- Autocmds. Currently empty; add vim.api.nvim_create_autocmd groups here as needed.
+52
View File
@@ -0,0 +1,52 @@
-- 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'\")" })
+37
View File
@@ -0,0 +1,37 @@
-- Bootstrap lazy.nvim on a fresh machine (needs only git + internet).
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
if vim.v.shell_error ~= 0 then
vim.api.nvim_echo({
{ "Failed to clone lazy.nvim:\n", "ErrorMsg" },
{ out, "WarningMsg" },
{ "\nPress any key to exit..." },
}, true, {})
vim.fn.getchar()
os.exit(1)
end
end
vim.opt.rtp:prepend(lazypath)
require("lazy").setup({
spec = { { import = "plugins" } },
defaults = {
lazy = false,
version = false, -- use latest git commit; lazy-lock.json pins the exact SHAs
},
install = { colorscheme = { "based" } },
checker = { enabled = true, notify = false },
performance = {
rtp = {
disabled_plugins = {
"gzip",
"tarPlugin",
"tohtml",
"tutor",
"zipPlugin",
},
},
},
})
+56
View File
@@ -0,0 +1,56 @@
-- Options are set before lazy.nvim startup.
vim.opt.termguicolors = true
vim.opt.encoding = "utf8"
vim.opt.hidden = true
vim.opt.incsearch = true
vim.opt.langmap =
"ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯ;ABCDEFGHIJKLMNOPQRSTUVWXYZ,фисвуапршолдьтщзйкыегмцчня;abcdefghijklmnopqrstuvwxyz"
vim.opt.maxmempattern = 5000
-- completion
vim.opt.wildignorecase = true
vim.opt.smartcase = true
vim.opt.wildmenu = true
vim.opt.path:append("**")
-- `gf` will try these extensions on a bare word under the cursor.
vim.opt.suffixesadd = { ".lua", ".vim", ".md", ".json", ".ts", ".tsx", ".js", ".py", ".rs" }
vim.opt.wildignore:append("**/node_modules/**")
vim.opt.completeopt = { "menu", "menuone", "preview", "noinsert" }
-- backups and recovery
vim.opt.backup = true
vim.opt.backupdir = os.getenv("HOME") .. "/.local/state/nvim/backup"
vim.opt.swapfile = true
vim.opt.undofile = true
vim.opt.updatetime = 800
-- misc
vim.opt.wrap = false
vim.opt.whichwrap:append("<,>,[,]")
vim.opt.timeoutlen = 500
vim.opt.ttimeoutlen = 50
-- indentation/tabulation
vim.opt.tabstop = 4
vim.opt.softtabstop = 4
vim.opt.expandtab = true
vim.opt.shiftwidth = 4
vim.opt.smartindent = true
vim.opt.autoindent = true
-- layout
vim.opt.signcolumn = "yes"
vim.opt.colorcolumn = { 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 80, 99 }
vim.opt.cmdheight = 1
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.scrolloff = 10
-- folds (treesitter-based; no nvim-ufo needed)
vim.opt.foldcolumn = "1"
vim.opt.foldlevel = 99
vim.opt.foldlevelstart = 99
vim.opt.foldenable = true
vim.opt.foldmethod = "expr"
vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()"