feat(nvim): add LazyVim-based configuration

This commit is contained in:
user
2026-09-07 22:38:38 +04:00
parent 39f17f25ee
commit adbc5ac606
17 changed files with 681 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
tt.*
.tests
doc/tags
debug
.repro
foo.*
*.log
data
+15
View File
@@ -0,0 +1,15 @@
{
"neodev": {
"library": {
"enabled": true,
"plugins": true
}
},
"neoconf": {
"plugins": {
"lua_ls": {
"enabled": true
}
}
}
}
+11
View File
@@ -0,0 +1,11 @@
-- bootstrap lazy.nvim, LazyVim and your plugins
require("config.lazy")
-- Associate .puml files with plantuml filetype
vim.filetype.add({
extension = {
puml = "plantuml",
},
})
-- vim.g.plugins_debug = true
+56
View File
@@ -0,0 +1,56 @@
{
"LazyVim": { "branch": "main", "commit": "c10948c50b18fae7f256433afdef09e432410480" },
"SchemaStore.nvim": { "branch": "main", "commit": "3d2c297f7152208daf4a382ea7123f9e4ebf9da1" },
"blink.cmp": { "branch": "main", "commit": "78336bc89ee5365633bcf754d93df01678b5c08f" },
"bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
"catppuccin": { "branch": "main", "commit": "79e2049a0fdf7ec840f8463fe1d962c94493196b" },
"clangd_extensions.nvim": { "branch": "main", "commit": "78c2ecd659d54972be17aa6ba2deac3c53223b80" },
"cmake-tools.nvim": { "branch": "master", "commit": "22859d754b5de738cfe9945e0910729f63deefd0" },
"conform.nvim": { "branch": "master", "commit": "619363c30309d29ffa631e67c8183f2a72caa373" },
"crates.nvim": { "branch": "main", "commit": "694357861ec9ebf12475ddcdd04ea45a0923c32d" },
"diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" },
"flash.nvim": { "branch": "main", "commit": "b6346946d10d07998efee029fb0f7a593806d0cd" },
"friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" },
"gitsigns.nvim": { "branch": "main", "commit": "31d6fb2d618bca1482b9f274751ead5f03461408" },
"grug-far.nvim": { "branch": "main", "commit": "0f6a5d0d7a70659b11bbcd6b3673ee0fe61b6024" },
"lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" },
"lazydev.nvim": { "branch": "main", "commit": "ff2cbcba459b637ec3fd165a2be59b7bbaeedf0d" },
"lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" },
"markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "7adc933dabcc7c86ae6b07aff7ee68eac398491f" },
"mason-nvim-dap.nvim": { "branch": "main", "commit": "9a10e096703966335bd5c46c8c875d5b0690dade" },
"mason.nvim": { "branch": "main", "commit": "2a6940af80375532e5e9e7c1f2fc6319a1b7a69d" },
"mini.ai": { "branch": "main", "commit": "25248c6aa002391936a6200f12d1466015987133" },
"mini.icons": { "branch": "main", "commit": "98faae31e9be1cc054ae63485e58ceb185efcad0" },
"mini.pairs": { "branch": "main", "commit": "b1c5a726921b7a8c9321e9a7a208aa0571de5810" },
"mini.surround": { "branch": "main", "commit": "8d5d0c5aa92449368ac251e85451d79d8f69d296" },
"noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" },
"nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
"nvim-dap": { "branch": "master", "commit": "9e848e09a697ee95302a3ef2dd43fd6eb709e570" },
"nvim-dap-go": { "branch": "main", "commit": "b4421153ead5d726603b02743ea40cf26a51ed5f" },
"nvim-dap-python": { "branch": "master", "commit": "1808458eba2b18f178f990e01376941a42c7f93b" },
"nvim-dap-ui": { "branch": "master", "commit": "cc9dd33aade7f20bae414d0cba163bc60d4d4b43" },
"nvim-dap-virtual-text": { "branch": "master", "commit": "fbdb48c2ed45f4a8293d0d483f7730d24467ccb6" },
"nvim-jdtls": { "branch": "master", "commit": "6e9d953f0b82bccdb834cfde0e893f3119c22592" },
"nvim-lint": { "branch": "master", "commit": "a219b2c9e5b4765e5c845aba119dad55806fcaf1" },
"nvim-lspconfig": { "branch": "master", "commit": "d592c1e6ad9a0a01b3d5ed3f0345d68407167181" },
"nvim-nio": { "branch": "master", "commit": "edcc181a875301dd21840189aa2f2f9ad69fc172" },
"nvim-treesitter": { "branch": "main", "commit": "8b3a191c015dd66a92d51a112ed96af0aac13b63" },
"nvim-treesitter-textobjects": { "branch": "main", "commit": "898ee307df58f854d11cd7edd06472574d48014e" },
"nvim-ts-autotag": { "branch": "main", "commit": "88c1453db4ba7dd24131086fe51fdf74e587d275" },
"omnisharp-extended-lsp.nvim": { "branch": "main", "commit": "51e407a46ddb15e49727139b5b1ae3650cd6a069" },
"open-browser.vim": { "branch": "master", "commit": "7d4c1d8198e889d513a030b5a83faa07606bac27" },
"persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" },
"plantuml-previewer.vim": { "branch": "master", "commit": "368a1f331c1ff29f6a3ee76facfca39a7f374b13" },
"plantuml-syntax": { "branch": "master", "commit": "9d4900aa16674bf5bb8296a72b975317d573b547" },
"plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" },
"render-markdown.nvim": { "branch": "main", "commit": "f422cb5c6855f150e2ddcfaf44e7157b98b34f6a" },
"rustaceanvim": { "branch": "main", "commit": "32969563686a262ef91161b54a1cac66b2d5a766" },
"snacks.nvim": { "branch": "main", "commit": "882c996cf28183f4d63640de0b4c02ec886d01f2" },
"todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" },
"tokyonight.nvim": { "branch": "main", "commit": "cdc07ac78467a233fd62c493de29a17e0cf2b2b6" },
"trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" },
"ts-comments.nvim": { "branch": "main", "commit": "a59d6092213447450191122c9346f309161504cb" },
"venv-selector.nvim": { "branch": "main", "commit": "cc4bb3975de8835291f9bb45889e96c6b2795fc4" },
"which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" }
}
+13
View File
@@ -0,0 +1,13 @@
{
"extras": [
"lazyvim.plugins.extras.coding.mini-surround",
"lazyvim.plugins.extras.lang.cmake",
"lazyvim.plugins.extras.lang.git",
"lazyvim.plugins.extras.lang.java"
],
"install_version": 8,
"news": {
"NEWS.md": "11866"
},
"version": 8
}
@@ -0,0 +1,8 @@
-- Autocmds are automatically loaded on the VeryLazy event
-- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua
--
-- Add any additional autocmds here
-- with `vim.api.nvim_create_autocmd`
--
-- Or remove existing autocmds by their group name (which is prefixed with `lazyvim_` for the defaults)
-- e.g. vim.api.nvim_del_augroup_by_name("lazyvim_wrap_spell")
+5
View File
@@ -0,0 +1,5 @@
-- Keymaps are automatically loaded on the VeryLazy event
-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua
-- Add any additional keymaps here
Snacks.toggle.option("list", { name = "Invisible chars" }):map("<leader>uv")
+100
View File
@@ -0,0 +1,100 @@
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)
-- Import all custom plugins recursively
local plugin_specs = require("utils.scanner").scan("plugins")
if vim.g.plugins_debug then
vim.notify(string.format("[plugins] Found %d import(s)", #plugin_specs), vim.log.levels.INFO)
for i, spec in ipairs(plugin_specs) do
vim.notify(string.format("[plugins] %d. %s", i, spec.import), vim.log.levels.INFO)
end
end
require("lazy").setup({
spec = {
-- add LazyVim and import its plugins
{ "LazyVim/LazyVim", import = "lazyvim.plugins" },
-- LazyVim extras would go here
{ import = "lazyvim.plugins.extras.dap.core" },
{ import = "lazyvim.plugins.extras.lang.clangd" },
{ import = "lazyvim.plugins.extras.lang.cmake" },
{ import = "lazyvim.plugins.extras.lang.docker" },
{ import = "lazyvim.plugins.extras.lang.dotnet" },
{ import = "lazyvim.plugins.extras.lang.git" },
{ import = "lazyvim.plugins.extras.lang.go" },
{ import = "lazyvim.plugins.extras.lang.java" },
{ import = "lazyvim.plugins.extras.lang.json" },
{ import = "lazyvim.plugins.extras.lang.markdown" },
{ import = "lazyvim.plugins.extras.lang.python" },
{ import = "lazyvim.plugins.extras.lang.rust" },
{ import = "lazyvim.plugins.extras.lang.toml" },
{ import = "lazyvim.plugins.extras.lang.typescript" },
{ import = "lazyvim.plugins.extras.lang.yaml" },
-- Your own plugins must be last
unpack(plugin_specs),
},
defaults = {
-- By default, only LazyVim plugins will be lazy-loaded.
-- Your custom plugins will load during startup.
lazy = false,
-- It's recommended to leave version=false for now.
version = false,
},
install = {
colorscheme = {
"tokyonight",
"habamax",
},
},
checker = {
enabled = true,
notify = false,
},
performance = {
rtp = {
disabled_plugins = {
"gzip",
-- "matchit",
-- "matchparen",
-- "netrwPlugin",
"tarPlugin",
"tohtml",
"tutor",
"zipPlugin",
},
},
},
})
+16
View File
@@ -0,0 +1,16 @@
-- Options are automatically loaded before lazy.nvim startup
-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua
-- Add any additional options here
--
vim.opt.list = true
vim.opt.listchars = {
tab = "→ ",
trail = "·",
nbsp = "␣",
space = "·",
}
vim.opt.encoding = "utf-8"
vim.opt.fileencoding = "utf-8"
vim.opt.fileencodings = "utf-8,latin1"
@@ -0,0 +1,90 @@
return {
{
"sindrets/diffview.nvim",
keys = {
-- Diffview
{
"<leader>dt",
function()
local lib = require("diffview.lib")
if lib.get_current_view() then
vim.cmd("DiffviewClose")
else
vim.cmd("DiffviewOpen")
end
end,
desc = "Diffview: Toggle",
},
-- Current conflict
{
"<leader>mo",
function()
require("diffview.config").actions.conflict_choose("ours")
end,
desc = "Merge: Choose Ours",
},
{
"<leader>mt",
function()
require("diffview.config").actions.conflict_choose("theirs")
end,
desc = "Merge: Choose Theirs",
},
{
"<leader>mb",
function()
require("diffview.config").actions.conflict_choose("base")
end,
desc = "Merge: Choose Base",
},
{
"<leader>ma",
function()
require("diffview.config").actions.conflict_choose("all")
end,
desc = "Merge: Keep All",
},
{
"<leader>mx",
function()
require("diffview.config").actions.conflict_choose("none")
end,
desc = "Merge: Delete Conflict",
},
-- All conflicts in current file
{
"<leader>mO",
function()
require("diffview.config").actions.conflict_choose_all("ours")
end,
desc = "Merge: Choose Ours (All)",
},
{
"<leader>mT",
function()
require("diffview.config").actions.conflict_choose_all("theirs")
end,
desc = "Merge: Choose Theirs (All)",
},
{
"<leader>mA",
function()
require("diffview.config").actions.conflict_choose_all("all")
end,
desc = "Merge: Keep All (All)",
},
},
opts = {
view = {
merge_tool = {
layout = "diff3_mixed",
},
},
},
},
}
@@ -0,0 +1,67 @@
return {
-- C/C++ formatter configuration
{
"stevearc/conform.nvim",
opts = {
formatters_by_ft = {
-- Format C source files
c = { "clang_format" },
-- Format C header files
h = { "clang_format" },
-- Format C++ source files
cpp = { "clang_format" },
-- Format C++ header files
hpp = { "clang_format" },
},
},
},
-- C/C++ language server configuration
{
"neovim/nvim-lspconfig",
opts = {
servers = {
clangd = {
-- Enable additional clangd features
capabilities = {
offsetEncoding = { "utf-16" },
},
-- clangd command options
cmd = {
"clangd",
"--background-index",
"--clang-tidy",
"--header-insertion=iwyu",
"--completion-style=detailed",
},
},
},
},
},
-- Install C/C++ tools through Mason
{
"mason-org/mason.nvim",
opts = {
ensure_installed = {
"clangd",
"clang-format",
},
},
},
-- Treesitter support for C/C++
{
"nvim-treesitter/nvim-treesitter",
opts = {
ensure_installed = {
"c",
"cpp",
},
},
},
}
@@ -0,0 +1,119 @@
return {
-- Java LSP, debugger, and test support
{
"mfussenegger/nvim-jdtls",
ft = "java",
opts = {
settings = {
java = {
-- Download source code for dependencies
eclipse = {
downloadSources = true,
},
-- Update Maven/Gradle configuration automatically
configuration = {
updateBuildConfiguration = "interactive",
},
-- Java code formatting configuration
format = {
enabled = true,
settings = {
url = vim.fn.stdpath("config") .. "/lang-servers/intellij-java-google-style.xml",
profile = "GoogleStyle",
},
},
-- Additional completion suggestions
completion = {
favoritestaticmembers = {
"org.junit.assert.*",
"org.mockito.mockito.*",
"org.springframework.util.assert.*",
},
},
-- show implementation hints in the editor
implementationscodelens = {
enabled = true,
},
-- show reference counters in the editor
referencescodelens = {
enabled = true,
},
-- display parameter names as inline hints
inlayhints = {
parameternames = {
enabled = "all",
},
},
-- organize imports automatically on save
saveactions = {
organizeimports = true,
},
},
},
},
},
-- install java syntax parser
{
"nvim-treesitter/nvim-treesitter",
opts = {
ensure_installed = {
"java",
},
},
},
-- install required java tools through mason
{
"mason-org/mason.nvim",
opts = {
ensure_installed = {
"google-java-format",
},
},
},
-- java formatter integration
{
"stevearc/conform.nvim",
event = { "BufWritePre" },
opts = {
formatters_by_ft = {
java = { "google-java-format" },
},
},
},
-- debug adapter protocol support
{
"mfussenegger/nvim-dap",
dependencies = {
"mfussenegger/nvim-dap-ui",
},
config = function()
local dap = require("dap")
-- Java debugger provided by JDTLS
require("jdtls").setup_dap({
hotcodereplace = "auto",
})
dap.configurations.java = dap.configurations.java or {}
table.insert(dap.configurations.java, {
type = "java",
request = "attach",
name = "Attach to Maven exec:java",
hostName = "127.0.0.1",
port = 5005,
})
end,
},
}
@@ -0,0 +1,34 @@
return {
-- json formatter integration
{
"stevearc/conform.nvim",
event = { "BufWritePre" },
opts = {
formatters_by_ft = {
json = { "prettier" },
jsonc = { "prettier" },
},
},
},
-- install required json tools through mason
{
"mason-org/mason.nvim",
opts = {
ensure_installed = {
"prettier",
},
},
},
-- treesitter json support
{
"nvim-treesitter/nvim-treesitter",
opts = {
ensure_installed = {
"json",
"jsonc",
},
},
},
}
@@ -0,0 +1,23 @@
return {
{
"weirongxu/plantuml-previewer.vim", -- main PlantUML plugin
ft = "plantuml", -- lazy-load for PlantUML files
dependencies = {
"tyru/open-browser.vim", -- browser preview dependency
"aklt/plantuml-syntax", -- syntax highlighting for PlantUML
},
config = function()
-- path to local PlantUML jar (if using local CLI)
vim.g.plantuml_previewer_jar_path = "/usr/share/java/plantuml/plantuml.jar"
-- output format for generated diagrams
vim.g.plantuml_previewer_output_type = "png"
-- automatically refresh preview when saving the file
vim.g.plantuml_previewer_refresh_on_save = 1
-- default browser for open-browser.vim
vim.g.open_browser_default_browser = "firefox"
end,
},
}
@@ -0,0 +1,28 @@
return {
{
"mason-org/mason.nvim",
opts = {
ensure_installed = {
"lemminx",
},
},
},
{
"neovim/nvim-lspconfig",
opts = {
servers = {
lemminx = {},
},
},
},
{
"nvim-treesitter/nvim-treesitter",
opts = {
ensure_installed = {
"xml",
},
},
},
}
+85
View File
@@ -0,0 +1,85 @@
---@class PluginScanner
---@field scan fun(root: string): table
-- Recursively scans a Lua directory and generates Lazy.nvim import specs.
--
-- Every directory is converted into a Lazy.nvim import spec, including
-- the root directory itself.
--
-- Example:
--
-- ~/.config/nvim/
-- └── lua/
-- └── plugins/
-- ├── ui.lua
-- ├── lsp/
-- │ ├── lua.lua
-- │ └── python.lua
-- └── languages/
-- └── rust/
-- └── dap.lua
--
-- Generated imports:
--
-- { import = "plugins" }
-- { import = "plugins.lsp" }
-- { import = "plugins.languages" }
-- { import = "plugins.languages.rust" }
--
-- Lazy.nvim can then recursively load Lua files from these directories.
--
-- Files themselves are not returned by the scanner.
--
-- Note:
-- Importing "plugins" already gives Lazy.nvim access to everything below
-- that directory, so nested imports are technically redundant. They are
-- still returned here because this scanner is explicitly designed to
-- report every discovered directory.
local M = {}
---@param root string
---@return table Lazy.nvim import specifications
function M.scan(root)
local result = {}
local config_path = vim.fn.stdpath("config")
local lua_path = vim.fs.normalize(config_path .. "/lua")
local base = vim.fs.normalize(lua_path .. "/" .. root)
-- Convert absolute filesystem path to Lua module name.
---@param path string
---@return string
local function path_to_module(path)
local module = path:sub(#lua_path + 2)
return module:gsub("[/\\]", ".")
end
-- Recursively scan directories.
---@param dir string
local function scan_dir(dir)
for name, type in vim.fs.dir(dir) do
local path = vim.fs.normalize(dir .. "/" .. name)
if type == "directory" then
table.insert(result, {
import = path_to_module(path),
})
scan_dir(path)
end
end
end
-- Always include the root directory itself.
table.insert(result, {
import = path_to_module(base),
})
scan_dir(base)
return result
end
return M
+3
View File
@@ -0,0 +1,3 @@
indent_type = "Spaces"
indent_width = 2
column_width = 120