Files
dotfiles/.config/nvim/lua/base.lua
2026-01-04 22:29:08 +04:00

219 lines
7.0 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local cmd = vim.cmd -- execute Vim commands
local exec = vim.api.nvim_exec -- execute Vimscript
local g = vim.g -- global variables
local opt = vim.opt -- global/buffer/windows-scoped options
-----------------------------------------------------------
-- Главные
-----------------------------------------------------------
-- Отключить поддержку со старым vi
-- g.nocompatible = true
opt.compatible = false
-- Не делать бекап файла
g.nobackup = true
g.nowritebackup = true
-- Кодировка по умолчанию
g.encoding = "utf-8"
-- Буфер обмена с системой (нужен xclip)
opt.clipboard = "unnamed,unnamedplus"
-- Разделитель на 80 символов
opt.colorcolumn = "80"
-- Словари рус eng
opt.spelllang = { "en_us", "ru" }
-- Включаем нумерацию строк
opt.number = true
-- Вкл. относительную нумерацию строк
opt.relativenumber = true
-- Возможность отката назад
opt.undofile = true
-- vertical split вправо
opt.splitright = true
-- horizontal split вниз
opt.splitbelow = true
-- Отступ во время скрола
opt.scrolloff = 10
-- Показать парную скобку
opt.showmatch = true
-- Всегда показывать столбец для значков
opt.signcolumn = "yes"
-- Скрыть командную строку по умолчанию
opt.cmdheight = 0
-- Не создавать swap файл
opt.swapfile = false
-- Отключить стандартный проводник
-- g.loaded_netrw = 1
-- g.loaded_netrwPlugin = 1
-- Игнорировать регистр при поиске, если все буквы строчные
opt.ignorecase = true
opt.smartcase = true
-- Не прыгать при поиске
opt.incsearch = true
-- Подсветка результатов поиска
opt.hlsearch = true
-- Автодополнение путей
opt.wildmenu = true
opt.wildmode = "longest:full,full"
-- Конфигурация проверки орфографии
opt.spell = true
opt.spelllang = { "en_us", "ru" }
opt.spellsuggest = "best,3"
-- Автоматическое включение проверки для определенных типов файлов
vim.api.nvim_create_autocmd("FileType", {
pattern = { "markdown", "text", "gitcommit", "latex", "tex" },
callback = function()
vim.opt_local.spell = true
end,
})
-----------------------------------------------------------
-- Цветовая схема
-----------------------------------------------------------
-- Нужно для поддержки pywal
-- opt.termguicolors = false
-- Устанавливаем тему из pywal
-- cmd([[
-- highlight ColorColumn ctermbg=16
-- ]])
-----------------------------------------------------------
-- Табы и отступы
-----------------------------------------------------------
cmd([[
filetype indent plugin on
syntax enable
]])
-- Использовать пробелы вместо табуляции
opt.expandtab = true
-- Количество пробелов используемых для отступа
opt.shiftwidth = 4
-- 1 таб = 4 пробелам
opt.tabstop = 4
-- Добавлять отступ на новых строках
opt.smartindent = true
-- Не автокомментировать новые строки
cmd([[au BufEnter * set fo-=c fo-=r fo-=o]])
-- Удалить маркер длинны строки для выбранных типов файлов
cmd([[autocmd FileType text,markdown,html,xhtml,javascript setlocal cc=0]])
-- 2 пробела для выбранных типов файлов
cmd([[
autocmd FileType xml,html,xhtml,css,scss,sass,javascript,typescript,lua,yaml,htmljinja,vue,svelte setlocal shiftwidth=2 tabstop=2
]])
-- Показывать непечатные символы
opt.list = true
opt.listchars = {
tab = "",
trail = "·",
nbsp = "",
extends = "",
precedes = "",
}
-----------------------------------------------------------
-- Полезные фишки
-----------------------------------------------------------
-- Запоминает где nvim последний раз редактировал файл
cmd([[
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
]])
-- Подсвечивает на доли секунды скопированную часть текста
exec(
[[
augroup YankHighlight
autocmd!
autocmd TextYankPost * silent! lua vim.highlight.on_yank{higroup="IncSearch", timeout=300}
augroup end
]],
false
)
-- Автоматическое перечитывание файла при изменении извне
opt.autoread = true
vim.api.nvim_create_autocmd({ "FocusGained", "BufEnter" }, {
pattern = "*",
command = "checktime",
})
-----------------------------------------------------------
-- Полезные фишки: Автосохранение с таймаутом
-----------------------------------------------------------
-- local autosave_timers = {}
--
-- -- Функция для сохранения буфера
-- local function save_buffer(bufnr)
-- vim.api.nvim_buf_call(bufnr, function()
-- vim.cmd("silent! write")
-- end)
-- end
--
-- -- Автогруппа для автосохранения
-- vim.api.nvim_create_augroup("autosave_debounced", { clear = true })
--
-- -- Дебаунсим только изменения вне insert mode (TextChanged)
-- vim.api.nvim_create_autocmd("TextChanged", {
-- group = "autosave_debounced",
-- pattern = "*",
-- callback = function(args)
-- local bufnr = args.buf
--
-- -- Отменяем предыдущий таймер для этого буфера
-- if autosave_timers[bufnr] then
-- autosave_timers[bufnr]:stop()
-- autosave_timers[bufnr]:close()
-- end
--
-- -- Создаем новый таймер на 500 мс
-- autosave_timers[bufnr] = vim.defer_fn(function()
-- save_buffer(bufnr)
-- autosave_timers[bufnr] = nil
-- end, 500)
-- end,
-- })
--
-- -- Сохраняем сразу при выходе из insert mode
-- vim.api.nvim_create_autocmd("InsertLeave", {
-- group = "autosave_debounced",
-- pattern = "*",
-- callback = function(args)
-- local bufnr = args.buf
--
-- -- Отменяем отложенное сохранение, если оно было запланировано
-- if autosave_timers[bufnr] then
-- autosave_timers[bufnr]:stop()
-- autosave_timers[bufnr]:close()
-- autosave_timers[bufnr] = nil
-- end
--
-- -- Сохраняем сразу
-- save_buffer(bufnr)
-- end,
-- })
--
-- -- Очистка таймеров при закрытии буфера
-- vim.api.nvim_create_autocmd("BufWipeout", {
-- group = "autosave_debounced",
-- pattern = "*",
-- callback = function(args)
-- if autosave_timers[args.buf] then
-- autosave_timers[args.buf]:stop()
-- autosave_timers[args.buf]:close()
-- autosave_timers[args.buf] = nil
-- end
-- end,
-- })