From 43c8b90762430b1dae5480c49a0f8ee283d6a992 Mon Sep 17 00:00:00 2001 From: vigdorov Date: Tue, 3 Mar 2026 11:25:51 +0300 Subject: [PATCH] Update nvim config Co-Authored-By: Claude Opus 4.6 --- .stylua.toml | 2 +- lazy-lock.json | 58 +++++++++++--------- lua/chadrc.lua | 60 ++++++++++++++++++--- lua/configs/conform.lua | 27 ++++++---- lua/configs/lspconfig.lua | 34 +++++------- lua/mappings.lua | 66 +++++++++++++++++++++-- lua/options.lua | 42 +++++++++++++-- lua/plugins/init.lua | 108 ++++++++++++++++++++++++++++++-------- 8 files changed, 303 insertions(+), 94 deletions(-) diff --git a/.stylua.toml b/.stylua.toml index ecb6dca..ca1541c 100644 --- a/.stylua.toml +++ b/.stylua.toml @@ -1,6 +1,6 @@ column_width = 120 line_endings = "Unix" indent_type = "Spaces" -indent_width = 2 +indent_width = 4 quote_style = "AutoPreferDouble" call_parentheses = "None" diff --git a/lazy-lock.json b/lazy-lock.json index f654b22..ef4de0c 100644 --- a/lazy-lock.json +++ b/lazy-lock.json @@ -1,29 +1,35 @@ { - "LuaSnip": { "branch": "master", "commit": "33b06d72d220aa56a7ce80a0dd6f06c70cd82b9d" }, - "NvChad": { "branch": "v2.5", "commit": "bbc3d43db088c141b142a40cd5f717635833a54e" }, - "base46": { "branch": "v2.5", "commit": "40943fc668bf8f1caa4cc45f71c784cf0d3cc34f" }, - "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, - "cmp-nvim-lsp": { "branch": "main", "commit": "39e2eda76828d88b773cc27a3f61d2ad782c922d" }, - "cmp-nvim-lua": { "branch": "main", "commit": "f12408bdb54c39c23e67cab726264c10db33ada8" }, - "cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" }, + "LuaSnip": { "branch": "master", "commit": "dae4f5aaa3574bd0c2b9dd20fb9542a02c10471c" }, + "NvChad": { "branch": "v2.5", "commit": "f437558f23c8f50c36cd09748121ab2c822e8ec9" }, + "base46": { "branch": "v2.5", "commit": "fde7a2cd54599e148d376f82980407c2d24b0fa2" }, + "cmp-async-path": { "branch": "main", "commit": "f8af3f726e07f2e9d37672eaa9102581aefce149" }, + "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, + "cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" }, + "cmp-nvim-lua": { "branch": "main", "commit": "e3a22cb071eb9d6508a156306b102c45cd2d573d" }, "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, - "conform.nvim": { "branch": "master", "commit": "02fd64fb3d4b18ec029c0e0683c3dc3ec6d2c5b8" }, - "friendly-snippets": { "branch": "main", "commit": "efff286dd74c22f731cdec26a70b46e5b203c619" }, - "gitsigns.nvim": { "branch": "main", "commit": "5f808b5e4fef30bd8aca1b803b4e555da07fc412" }, - "indent-blankline.nvim": { "branch": "master", "commit": "259357fa4097e232730341fa60988087d189193a" }, - "lazy.nvim": { "branch": "main", "commit": "a44e9cd165e11fa61ccfbea2a3cc1aaa3bcfc4f1" }, - "mason.nvim": { "branch": "main", "commit": "e2f7f9044ec30067bc11800a9e266664b88cda22" }, - "menu": { "branch": "main", "commit": "657bfc91382c0928453d9a4d0a10ec92db5de2bb" }, - "minty": { "branch": "main", "commit": "6dce9f097667862537823d515a0250ce58faab05" }, - "nvim-autopairs": { "branch": "master", "commit": "b464658e9b880f463b9f7e6ccddd93fb0013f559" }, - "nvim-cmp": { "branch": "main", "commit": "ca4d3330d386e76967e53b85953c170658255ecb" }, - "nvim-lspconfig": { "branch": "master", "commit": "2c007c79eedfca0ec652c50d571cb0c52d1577ba" }, - "nvim-tree.lua": { "branch": "master", "commit": "ca7c4c33cac2ad66ec69d45e465379716ef0cc97" }, - "nvim-treesitter": { "branch": "master", "commit": "acada1a685f5decd0f10e1672963bf3425eafa45" }, - "nvim-web-devicons": { "branch": "master", "commit": "203da76ecfbb4b192cf830665b03eb651b635c94" }, - "plenary.nvim": { "branch": "master", "commit": "2d9b06177a975543726ce5c73fca176cedbffe9d" }, - "telescope.nvim": { "branch": "master", "commit": "2eca9ba22002184ac05eddbe47a7fe2d5a384dfc" }, - "ui": { "branch": "v3.0", "commit": "7905539f1e10f460811dc0db800355611f8a527a" }, - "volt": { "branch": "main", "commit": "e01090ff27b34288574c24a09cb166e47c4a0c3d" }, - "which-key.nvim": { "branch": "main", "commit": "9b365a6428a9633e3eeb34dbef1b791511c54f70" } + "conform.nvim": { "branch": "master", "commit": "c2526f1cde528a66e086ab1668e996d162c75f4f" }, + "dressing.nvim": { "branch": "master", "commit": "2d7c2db2507fa3c4956142ee607431ddb2828639" }, + "friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" }, + "gitsigns.nvim": { "branch": "main", "commit": "9f3c6dd7868bcc116e9c1c1929ce063b978fa519" }, + "im-select.nvim": { "branch": "master", "commit": "113a6905a1c95d2990269f96abcbad9718209557" }, + "indent-blankline.nvim": { "branch": "master", "commit": "d28a3f70721c79e3c5f6693057ae929f3d9c0a03" }, + "lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" }, + "mason.nvim": { "branch": "main", "commit": "44d1e90e1f66e077268191e3ee9d2ac97cc18e65" }, + "mdviewer": { "branch": "main", "commit": "80901b3dc68243ce74c31a53239841993902d661" }, + "menu": { "branch": "main", "commit": "7a0a4a2896b715c066cfbe320bdc048091874cc6" }, + "minty": { "branch": "main", "commit": "aafc9e8e0afe6bf57580858a2849578d8d8db9e0" }, + "nvim-autopairs": { "branch": "master", "commit": "59bce2eef357189c3305e25bc6dd2d138c1683f5" }, + "nvim-cmp": { "branch": "main", "commit": "da88697d7f45d16852c6b2769dc52387d1ddc45f" }, + "nvim-lspconfig": { "branch": "master", "commit": "5a855bcfec7973767a1a472335684bbd71d2fa2b" }, + "nvim-surround": { "branch": "main", "commit": "1098d7b3c34adcfa7feb3289ee434529abd4afd1" }, + "nvim-tree.lua": { "branch": "master", "commit": "e11ce83ed9a00f065bf676ae4e6c261c766989ba" }, + "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, + "nvim-ts-autotag": { "branch": "main", "commit": "8e1c0a389f20bf7f5b0dd0e00306c1247bda2595" }, + "nvim-web-devicons": { "branch": "master", "commit": "746ffbb17975ebd6c40142362eee1b0249969c5c" }, + "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, + "telescope.nvim": { "branch": "master", "commit": "5255aa27c422de944791318024167ad5d40aad20" }, + "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" }, + "ui": { "branch": "v3.0", "commit": "cb75908a86720172594b30de147272c1b3a7f452" }, + "volt": { "branch": "main", "commit": "620de1321f275ec9d80028c68d1b88b409c0c8b1" }, + "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } } diff --git a/lua/chadrc.lua b/lua/chadrc.lua index c82dca1..18131c3 100644 --- a/lua/chadrc.lua +++ b/lua/chadrc.lua @@ -1,17 +1,63 @@ --- This file needs to have same structure as nvconfig.lua +-- This file needs to have same structure as nvconfig.lua -- https://github.com/NvChad/ui/blob/v3.0/lua/nvconfig.lua --- Please read that file to know all available options :( +-- Please read that file to know all available options :( ---@type ChadrcConfig local M = {} M.base46 = { - theme = "onedark", + theme = "oceanic-next", - -- hl_override = { - -- Comment = { italic = true }, - -- ["@comment"] = { italic = true }, - -- }, + hl_add = { + St_kbd_en_sep = { fg = "green", bg = "statusline_bg" }, + St_kbd_en_icon = { fg = "black", bg = "green", bold = true }, + St_kbd_ru_sep = { fg = "orange", bg = "statusline_bg" }, + St_kbd_ru_icon = { fg = "black", bg = "orange", bold = true }, + }, + + -- Match VS Code Oceanic Next (naumovs) colors exactly + changed_themes = { + ["oceanic-next"] = { + base_30 = { + cyan = "#5FB3B3", -- VS Code: operators/regexp/escape + red = "#EB606B", -- VS Code: tags (NVChad had EC5F67) + }, + base_16 = { + base05 = "#CDD3DE", -- foreground text (NVChad had C0C5Ce) + base08 = "#5FB3B3", -- operators/punctuation (NVChad had 6cbdbc) + base0C = "#5FB3B3", -- regexp/escape (NVChad had 5aaeae) + base0F = "#EB606B", -- tags (NVChad had EC5F67) + }, + }, + }, + + nvdash = { + load_on_startup = true, + header = { + "██╗ ██╗██╗ ██████╗ ██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗", + "██║ ██║██║██╔════╝ ██╔══██╗██╔═══██╗██╔══██╗██╔═══██╗██║ ██║", + "██║ ██║██║██║ ███╗██║ ██║██║ ██║██████╔╝██║ ██║██║ ██║", + "╚██╗ ██╔╝██║██║ ██║██║ ██║██║ ██║██╔══██╗██║ ██║╚██╗ ██╔╝", + " ╚████╔╝ ██║╚██████╔╝██████╔╝╚██████╔╝██║ ██║╚██████╔╝ ╚████╔╝ ", + " ╚═══╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═══╝ ", + }, + }, +} + +M.ui = { + statusline = { + order = { "mode", "file", "git", "%=", "lsp_msg", "%=", "diagnostics", "lsp", "kbd", "cwd", "cursor" }, + modules = { + kbd = function() + local lang = vim.g.im_current_lang or "EN" + if lang == "RU" then + return "%#St_kbd_ru_sep#" .. "" .. "%#St_kbd_ru_icon# 󰌌 RU " + else + return "%#St_kbd_en_sep#" .. "" .. "%#St_kbd_en_icon# 󰌌 EN " + end + end, + }, + }, } return M diff --git a/lua/configs/conform.lua b/lua/configs/conform.lua index 35ba6cf..d5e5744 100644 --- a/lua/configs/conform.lua +++ b/lua/configs/conform.lua @@ -1,15 +1,22 @@ local options = { - formatters_by_ft = { - lua = { "stylua" }, - -- css = { "prettier" }, - -- html = { "prettier" }, - }, + formatters_by_ft = { + lua = { "stylua" }, + css = { "prettier" }, + html = { "prettier" }, + javascript = { "prettier" }, + typescript = { "prettier" }, + javascriptreact = { "prettier" }, + typescriptreact = { "prettier" }, + json = { "prettier" }, + yaml = { "prettier" }, + markdown = { "prettier" }, + sh = { "prettier" }, + }, - -- format_on_save = { - -- -- These options will be passed to conform.format() - -- timeout_ms = 500, - -- lsp_fallback = true, - -- }, + format_on_save = { + timeout_ms = 500, + lsp_fallback = true, + }, } return options diff --git a/lua/configs/lspconfig.lua b/lua/configs/lspconfig.lua index 478df01..5f23f8b 100644 --- a/lua/configs/lspconfig.lua +++ b/lua/configs/lspconfig.lua @@ -1,24 +1,14 @@ --- load defaults i.e lua_lsp require("nvchad.configs.lspconfig").defaults() -local lspconfig = require "lspconfig" - --- EXAMPLE -local servers = { "html", "cssls" } -local nvlsp = require "nvchad.configs.lspconfig" - --- lsps with default config -for _, lsp in ipairs(servers) do - lspconfig[lsp].setup { - on_attach = nvlsp.on_attach, - on_init = nvlsp.on_init, - capabilities = nvlsp.capabilities, - } -end - --- configuring single server, example: typescript --- lspconfig.ts_ls.setup { --- on_attach = nvlsp.on_attach, --- on_init = nvlsp.on_init, --- capabilities = nvlsp.capabilities, --- } +-- Серверы с дефолтными настройками (capabilities и on_init уже заданы через "*") +vim.lsp.enable { + "html", + "cssls", + "ts_ls", + "jsonls", + "yamlls", + "dockerls", + "bashls", + "lua_ls", + "tailwindcss", +} diff --git a/lua/mappings.lua b/lua/mappings.lua index 783b78f..f221504 100644 --- a/lua/mappings.lua +++ b/lua/mappings.lua @@ -1,10 +1,68 @@ require "nvchad.mappings" --- add yours here - local map = vim.keymap.set map("n", ";", ":", { desc = "CMD enter command mode" }) -map("i", "jk", "") +map("i", "jj", "") +map("i", "оо", "") --- map({ "n", "i", "v" }, "", " w ") +-- Перемещение строк вверх/вниз в Visual режиме +map("v", "", ":m '>+1gv=gv", { desc = "Move line down" }) +map("v", "", ":m '<-2gv=gv", { desc = "Move line up" }) + +-- Курсор остаётся на месте при объединении строк +map("n", "J", "mzJ`z", { desc = "Join lines keeping cursor" }) + +-- Центрировать экран при скролле и поиске +map("n", "", "zz", { desc = "Scroll down centered" }) +map("n", "", "zz", { desc = "Scroll up centered" }) +map("n", "n", "nzzzv", { desc = "Next search centered" }) +map("n", "N", "Nzzzv", { desc = "Prev search centered" }) + +-- Вставка поверх выделения без потери буфера +map("x", "p", '"_dP', { desc = "Paste without yanking" }) + +-- Быстрое сохранение +map({ "n", "i", "v" }, "", "w", { desc = "Save file" }) + +-- Markdown превью: scroll sync +local mdviewer_sync = vim.api.nvim_create_augroup("MDViewerScrollSync", { clear = true }) +local mdviewer_preview_win = nil + +local function setup_scroll_sync() + vim.api.nvim_clear_autocmds { group = mdviewer_sync } + vim.api.nvim_create_autocmd("CursorMoved", { + group = mdviewer_sync, + callback = function() + local win = mdviewer_preview_win + if not win or not vim.api.nvim_win_is_valid(win) then return end + + local src_line = vim.api.nvim_win_get_cursor(0)[1] + local src_total = vim.api.nvim_buf_line_count(0) + if src_total <= 1 then return end + + local ratio = (src_line - 1) / (src_total - 1) + + pcall(vim.api.nvim_win_call, win, function() + local term_total = vim.fn.line "$" + if term_total <= 1 then return end + local target = math.max(1, math.floor(ratio * (term_total - 1)) + 1) + vim.cmd("normal! " .. target .. "Gzt") + end) + end, + }) +end + +map("n", "mp", function() + vim.cmd "MDViewerToggle" + local preview = require "mdviewer.preview" + if preview.is_active() then + -- После toggle курсор в окне превью — запоминаем его + mdviewer_preview_win = vim.api.nvim_get_current_win() + vim.cmd "wincmd p" + setup_scroll_sync() + else + mdviewer_preview_win = nil + vim.api.nvim_clear_autocmds { group = mdviewer_sync } + end +end, { desc = "Toggle markdown preview" }) diff --git a/lua/options.lua b/lua/options.lua index 738f20b..17574b6 100644 --- a/lua/options.lua +++ b/lua/options.lua @@ -1,6 +1,42 @@ require "nvchad.options" --- add yours here! +local o = vim.o --- local o = vim.o --- o.cursorlineopt ='both' -- to enable cursorline! +o.relativenumber = true -- относительные номера строк (5j, 12k) +o.scrolloff = 8 -- курсор не прижимается к краю экрана +o.wrap = false -- длинные строки не переносятся +o.cursorline = true -- подсветка текущей строки +o.swapfile = false -- без .swp файлов +o.clipboard = "unnamedplus" -- yank/delete → системный буфер обмена + +-- Русская раскладка: хоткеи работают как на английской +vim.opt.langmap = + "ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯ;ABCDEFGHIJKLMNOPQRSTUVWXYZ," + .. "фисвуапршолдьтщзйкыегмцчня;abcdefghijklmnopqrstuvwxyz" + +-- Определение текущей раскладки через im-select (для строки статуса) +vim.g.im_current_lang = "EN" + +if vim.fn.executable "im-select" == 1 then + local im_timer = vim.uv.new_timer() + im_timer:start( + 0, + 1000, + vim.schedule_wrap(function() + vim.fn.jobstart({ "im-select" }, { + stdout_buffered = true, + on_stdout = function(_, data) + if data and data[1] and data[1] ~= "" then + local new_lang = data[1]:find "Russian" and "RU" or "EN" + if vim.g.im_current_lang ~= new_lang then + vim.g.im_current_lang = new_lang + vim.schedule(function() + vim.cmd.redrawstatus() + end) + end + end + end, + }) + end) + ) +end diff --git a/lua/plugins/init.lua b/lua/plugins/init.lua index 6474776..bd56b9f 100644 --- a/lua/plugins/init.lua +++ b/lua/plugins/init.lua @@ -1,25 +1,91 @@ return { - { - "stevearc/conform.nvim", - -- event = 'BufWritePre', -- uncomment for format on save - opts = require "configs.conform", - }, + { + "stevearc/conform.nvim", + event = "BufWritePre", + opts = require "configs.conform", + }, - -- These are some examples, uncomment them if you want to see them work! - { - "neovim/nvim-lspconfig", - config = function() - require "configs.lspconfig" - end, - }, + { + "neovim/nvim-lspconfig", + config = function() + require "configs.lspconfig" + end, + }, - -- { - -- "nvim-treesitter/nvim-treesitter", - -- opts = { - -- ensure_installed = { - -- "vim", "lua", "vimdoc", - -- "html", "css" - -- }, - -- }, - -- }, + { + "stevearc/dressing.nvim", + lazy = false, + opts = {}, + }, + + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "vim", + "lua", + "vimdoc", + "html", + "css", + "javascript", + "typescript", + "tsx", + "json", + "yaml", + "toml", + "bash", + "dockerfile", + "markdown", + "markdown_inline", + "gitcommit", + "diff", + }, + }, + }, + + -- Автозакрытие HTML/JSX тегов + { + "windwp/nvim-ts-autotag", + event = "InsertEnter", + opts = {}, + }, + + -- Оборачивание текста в скобки/кавычки (ysiw", cs"', ds") + { + "kylechui/nvim-surround", + event = "VeryLazy", + opts = {}, + }, + + -- Подсветка TODO/FIXME/HACK в коде + { + "folke/todo-comments.nvim", + event = "BufRead", + opts = {}, + }, + + -- Автопереключение раскладки: English в Normal, восстановление в Insert + { + "keaising/im-select.nvim", + event = "VimEnter", + opts = { + default_im_select = "com.apple.keylayout.US", + default_command = "im-select", + }, + }, + + -- Просмотр markdown в терминале (mermaid, картинки, таблицы) + { + "aquele-dinho/mdviewer", + ft = "markdown", + config = function() + vim.opt.rtp:append(vim.fn.stdpath "data" .. "/lazy/mdviewer/contrib/neovim/mdviewer.nvim") + require("mdviewer").setup { + style = "clean", + window_type = "vsplit", + auto_refresh = true, + mermaid_mode = "terminal", + } + end, + }, }