feat(nvim): some devops stuff, additions and optimizations for nvim

This commit is contained in:
ITQ
2026-05-15 20:48:46 +03:00
parent b4e15131d1
commit 1273a6cd74
16 changed files with 334 additions and 142 deletions
-1
View File
@@ -3,4 +3,3 @@ require("config.keymaps")
require("config.autocmds") require("config.autocmds")
require("config.diagnostics") require("config.diagnostics")
require("config.lazy") require("config.lazy")
-1
View File
@@ -9,4 +9,3 @@ vim.api.nvim_create_autocmd("TextYankPost", {
}) })
-- optional: auto format on save (handled by conform too, but this is a safe place for extra logic later) -- optional: auto format on save (handled by conform too, but this is a safe place for extra logic later)
-1
View File
@@ -18,4 +18,3 @@ vim.diagnostic.config({
severity_sort = true, severity_sort = true,
float = { border = "rounded", source = "if_many" }, float = { border = "rounded", source = "if_many" },
}) })
+10
View File
@@ -20,3 +20,13 @@ map("n", "<leader>fg", "<cmd>Telescope live_grep<cr>", { desc = "Live grep" })
map("n", "<leader>fb", "<cmd>Telescope buffers<cr>", { desc = "Buffers" }) map("n", "<leader>fb", "<cmd>Telescope buffers<cr>", { desc = "Buffers" })
map("n", "<leader>fh", "<cmd>Telescope help_tags<cr>", { desc = "Help" }) map("n", "<leader>fh", "<cmd>Telescope help_tags<cr>", { desc = "Help" })
-- file tree
map("n", "<leader>tt", "<cmd>Neotree toggle<cr>", { desc = "Toggle file tree" })
map("n", "<leader>tf", "<cmd>Neotree reveal<cr>", { desc = "Reveal file in tree" })
-- Git
map("n", "<leader>gs", "<cmd>Git<cr>", { desc = "Git status" })
map("n", "<leader>gg", "<cmd>LazyGit<cr>", { desc = "LazyGit" })
map("n", "<leader>gd", "<cmd>DiffviewOpen<cr>", { desc = "Diffview open" })
map("n", "<leader>gD", "<cmd>DiffviewClose<cr>", { desc = "Diffview close" })
map("n", "<leader>gh", "<cmd>DiffviewFileHistory<cr>", { desc = "Diffview file history" })
-1
View File
@@ -19,4 +19,3 @@ require("lazy").setup({
checker = { enabled = true }, checker = { enabled = true },
ui = { border = "rounded" }, ui = { border = "rounded" },
}) })
+6 -1
View File
@@ -1,6 +1,12 @@
vim.g.mapleader = " " vim.g.mapleader = " "
vim.g.maplocalleader = " " vim.g.maplocalleader = " "
local mason_bin = vim.fn.stdpath("data") .. "/mason/bin"
local path = vim.env.PATH or ""
if not string.find(path, mason_bin, 1, true) then
vim.env.PATH = mason_bin .. ":" .. path
end
local opt = vim.opt local opt = vim.opt
opt.number = true opt.number = true
opt.relativenumber = true opt.relativenumber = true
@@ -28,4 +34,3 @@ opt.timeoutlen = 400
opt.clipboard = "unnamedplus" opt.clipboard = "unnamedplus"
opt.undofile = true opt.undofile = true
-1
View File
@@ -65,4 +65,3 @@ return {
end, end,
}, },
} }
+6 -8
View File
@@ -1,15 +1,13 @@
return { return {
{ "nvim-lua/plenary.nvim", lazy = true }, { "nvim-lua/plenary.nvim", lazy = true },
{ "folke/which-key.nvim", event = "VeryLazy", opts = {} }, { "folke/which-key.nvim", event = "VeryLazy", opts = {} },
{ "numToStr/Comment.nvim", event = "VeryLazy", opts = {} }, { "numToStr/Comment.nvim", event = "VeryLazy", opts = {} },
{ "kylechui/nvim-surround", event = "VeryLazy", opts = {} }, { "kylechui/nvim-surround", event = "VeryLazy", opts = {} },
{ "windwp/nvim-autopairs", event = "InsertEnter", opts = {} }, { "windwp/nvim-autopairs", event = "InsertEnter", opts = {} },
{ "lewis6991/gitsigns.nvim", event = "VeryLazy", opts = {} }, { "wakatime/vim-wakatime", lazy = false },
{ 'wakatime/vim-wakatime', lazy = false },
} }
+22
View File
@@ -0,0 +1,22 @@
return {
{
"towolf/vim-helm",
lazy = false,
},
{
"hashivim/vim-terraform",
ft = { "terraform", "hcl" },
},
{
"ekalinin/Dockerfile.vim",
ft = { "dockerfile" },
},
{
"pearofducks/ansible-vim",
lazy = false,
},
{
"b0o/schemastore.nvim",
lazy = true,
},
}
+22
View File
@@ -0,0 +1,22 @@
return {
{
"nvim-neo-tree/neo-tree.nvim",
branch = "v3.x",
cmd = "Neotree",
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-tree/nvim-web-devicons",
"MunifTanjim/nui.nvim",
},
opts = {
sources = { "filesystem", "buffers", "git_status" },
close_if_last_window = true,
filesystem = {
follow_current_file = { enabled = true },
hijack_netrw_behavior = "open_default",
use_libuv_file_watcher = true,
},
window = { width = 32 },
},
},
}
+48
View File
@@ -0,0 +1,48 @@
return {
{
"lewis6991/gitsigns.nvim",
event = { "BufReadPre", "BufNewFile" },
opts = {
on_attach = function(bufnr)
local gs = package.loaded.gitsigns
local map = function(mode, lhs, rhs, desc)
vim.keymap.set(mode, lhs, rhs, { buffer = bufnr, desc = desc })
end
map("n", "]h", gs.next_hunk, "Next hunk")
map("n", "[h", gs.prev_hunk, "Prev hunk")
map("n", "<leader>hs", gs.stage_hunk, "Stage hunk")
map("n", "<leader>hS", gs.stage_buffer, "Stage buffer")
map("n", "<leader>hr", gs.reset_hunk, "Reset hunk")
map("n", "<leader>hR", gs.reset_buffer, "Reset buffer")
map("n", "<leader>hp", gs.preview_hunk, "Preview hunk")
map("n", "<leader>hb", gs.blame_line, "Blame line")
map("n", "<leader>hd", gs.diffthis, "Diff this")
map("n", "<leader>hD", function() gs.diffthis("~") end, "Diff this ~")
map("n", "<leader>ht", gs.toggle_current_line_blame, "Toggle line blame")
end,
},
},
{
"tpope/vim-fugitive",
cmd = { "Git", "G", "Gdiffsplit", "Gvdiffsplit", "Gedit" },
},
{
"sindrets/diffview.nvim",
cmd = { "DiffviewOpen", "DiffviewClose", "DiffviewFileHistory" },
},
{
"kdheepak/lazygit.nvim",
cmd = {
"LazyGit",
"LazyGitConfig",
"LazyGitCurrentFile",
"LazyGitFilter",
"LazyGitFilterCurrentFile",
},
dependencies = { "nvim-lua/plenary.nvim" },
},
}
+156 -63
View File
@@ -1,79 +1,172 @@
local function lsp_keymaps(ev) local function lsp_keymaps(ev)
local buf = ev.buf local buf = ev.buf
local map = function(mode, lhs, rhs, desc) local map = function(mode, lhs, rhs, desc)
vim.keymap.set(mode, lhs, rhs, { buffer = buf, desc = desc }) vim.keymap.set(mode, lhs, rhs, { buffer = buf, desc = desc })
end end
map("n", "K", vim.lsp.buf.hover, "Hover") map("n", "K", vim.lsp.buf.hover, "Hover")
map("n", "gd", vim.lsp.buf.definition, "Go to definition") map("n", "gd", vim.lsp.buf.definition, "Go to definition")
map("n", "gD", vim.lsp.buf.declaration, "Go to declaration") map("n", "gD", vim.lsp.buf.declaration, "Go to declaration")
map("n", "gr", vim.lsp.buf.references, "References") map("n", "gr", vim.lsp.buf.references, "References")
map("n", "gi", vim.lsp.buf.implementation, "Implementation") map("n", "gi", vim.lsp.buf.implementation, "Implementation")
map("n", "<leader>rn", vim.lsp.buf.rename, "Rename") map("n", "<leader>rn", vim.lsp.buf.rename, "Rename")
map("n", "<leader>ca", vim.lsp.buf.code_action, "Code action") map("n", "<leader>ca", vim.lsp.buf.code_action, "Code action")
if vim.lsp.inlay_hint then if vim.lsp.inlay_hint then
pcall(vim.lsp.inlay_hint.enable, true, { bufnr = buf }) pcall(vim.lsp.inlay_hint.enable, true, { bufnr = buf })
end end
end end
return { return {
{ "williamboman/mason.nvim", cmd = "Mason", opts = {} }, { "williamboman/mason.nvim", cmd = "Mason", opts = {} },
{ {
"williamboman/mason-lspconfig.nvim", "williamboman/mason-lspconfig.nvim",
event = "VeryLazy", event = "VeryLazy",
dependencies = { "mason.nvim" }, dependencies = { "mason.nvim" },
opts = { opts = {
ensure_installed = { "clangd", "gopls", "pyright", "lua_ls" }, ensure_installed = {
automatic_installation = true, "clangd",
"gopls",
"pyright",
"lua_ls",
"rust_analyzer",
"asm_lsp",
"terraformls",
"ansiblels",
"dockerls",
"yamlls",
"jsonls",
"helm_ls",
},
automatic_installation = true,
},
}, },
},
-- Keep nvim-lspconfig installed (it provides server definitions), -- Keep nvim-lspconfig installed (it provides server definitions),
-- but DO NOT call require("lspconfig") anymore. -- but DO NOT call require("lspconfig") anymore.
{ {
"neovim/nvim-lspconfig", "neovim/nvim-lspconfig",
event = { "BufReadPre", "BufNewFile" }, event = { "BufReadPre", "BufNewFile" },
dependencies = { "hrsh7th/cmp-nvim-lsp" }, dependencies = { "hrsh7th/cmp-nvim-lsp", "b0o/schemastore.nvim" },
config = function() config = function()
vim.api.nvim_create_autocmd("LspAttach", { callback = lsp_keymaps }) vim.api.nvim_create_autocmd("LspAttach", { callback = lsp_keymaps })
local caps = vim.lsp.protocol.make_client_capabilities() local caps = vim.lsp.protocol.make_client_capabilities()
local ok, cmp_lsp = pcall(require, "cmp_nvim_lsp") local ok, cmp_lsp = pcall(require, "cmp_nvim_lsp")
if ok then if ok then
caps = cmp_lsp.default_capabilities(caps) caps = cmp_lsp.default_capabilities(caps)
end end
vim.lsp.config("clangd", { vim.lsp.config("clangd", {
capabilities = caps, capabilities = caps,
cmd = { "clangd", "--background-index", "--clang-tidy", "--header-insertion=iwyu" }, cmd = { "clangd", "--background-index", "--clang-tidy", "--header-insertion=iwyu" },
}) })
vim.lsp.config("gopls", { vim.lsp.config("gopls", {
capabilities = caps, capabilities = caps,
settings = { settings = {
gopls = { gopls = {
staticcheck = true, staticcheck = true,
analyses = { unusedparams = true, nilness = true, shadow = true }, analyses = { unusedparams = true, nilness = true, shadow = true },
}, },
}, },
}) })
vim.lsp.config("pyright", { capabilities = caps }) vim.lsp.config("pyright", { capabilities = caps })
vim.lsp.config("lua_ls", { vim.lsp.config("lua_ls", {
capabilities = caps, capabilities = caps,
settings = { settings = {
Lua = { Lua = {
diagnostics = { globals = { "vim" } }, diagnostics = { globals = { "vim" } },
workspace = { checkThirdParty = false }, workspace = { checkThirdParty = false },
}, },
}, },
}) })
vim.lsp.enable({ "clangd", "gopls", "pyright", "lua_ls" }) vim.lsp.config("rust_analyzer", {
end, capabilities = caps,
}, settings = {
["rust-analyzer"] = {
cargo = { allFeatures = true },
checkOnSave = { command = "clippy" },
},
},
})
vim.lsp.config("asm_lsp", {
capabilities = caps,
filetypes = { "asm", "nasm" },
})
vim.lsp.config("terraformls", { capabilities = caps })
vim.lsp.config("ansiblels", { capabilities = caps })
vim.lsp.config("dockerls", { capabilities = caps })
local k8s_schema = "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.27.0-standalone-strict/all.json"
local schemastore_ok, schemastore = pcall(require, "schemastore")
local yaml_schemas = {}
local json_schemas = {}
if schemastore_ok then
yaml_schemas = schemastore.yaml.schemas()
json_schemas = schemastore.json.schemas()
end
yaml_schemas[k8s_schema] = {
"k8s/**/*.yaml",
"k8s/**/*.yml",
"kubernetes/**/*.yaml",
"kubernetes/**/*.yml",
"*.k8s.yaml",
"*.k8s.yml",
}
yaml_schemas["https://json.schemastore.org/kustomization.json"] = {
"kustomization.yaml",
"kustomization.yml",
}
vim.lsp.config("yamlls", {
capabilities = caps,
settings = {
yaml = {
validate = true,
format = { enable = true },
schemaStore = { enable = false, url = "" },
schemas = yaml_schemas,
},
},
})
vim.lsp.config("jsonls", {
capabilities = caps,
settings = {
json = {
validate = { enable = true },
schemaStore = { enable = false, url = "" },
schemas = json_schemas,
},
},
})
vim.lsp.config("helm_ls", { capabilities = caps })
vim.lsp.enable({
"clangd",
"gopls",
"pyright",
"lua_ls",
"rust_analyzer",
"asm_lsp",
"terraformls",
"ansiblels",
"dockerls",
"yamlls",
"jsonls",
"helm_ls",
})
end,
},
} }
+44 -43
View File
@@ -1,46 +1,47 @@
return { return {
-- formatting -- formatting
{ {
"stevearc/conform.nvim", "stevearc/conform.nvim",
event = { "BufReadPre", "BufNewFile" }, event = { "BufReadPre", "BufNewFile" },
opts = { opts = {
format_on_save = { timeout_ms = 1500, lsp_fallback = true }, format_on_save = { timeout_ms = 1500, lsp_fallback = true },
formatters_by_ft = { formatters_by_ft = {
c = { "clang_format" }, c = { "clang_format" },
cpp = { "clang_format" }, cpp = { "clang_format" },
go = { "gofmt", "goimports" }, go = { "gofmt", "goimports" },
python = { "isort", "black" }, terraform = { "terraform_fmt" },
lua = { "stylua" }, rust = { "rustfmt" },
json = { "prettier" }, python = { "isort", "black" },
yaml = { "prettier" }, lua = { "stylua" },
markdown = { "prettier" }, json = { "prettier" },
}, yaml = { "prettier" },
}, markdown = { "prettier" },
config = function(_, opts) },
require("conform").setup(opts) },
vim.keymap.set("n", "<leader>f", function() config = function(_, opts)
require("conform").format({ lsp_fallback = true }) require("conform").setup(opts)
end, { desc = "Format buffer" }) vim.keymap.set("n", "<leader>f", function()
end, require("conform").format({ lsp_fallback = true })
}, end, { desc = "Format buffer" })
-- linting (optional but nice)
{
"mfussenegger/nvim-lint",
event = { "BufReadPost", "BufNewFile" },
config = function()
local lint = require("lint")
lint.linters_by_ft = {
python = { "flake8" },
go = { "golangcilint" },
}
vim.api.nvim_create_autocmd({ "BufWritePost", "InsertLeave" }, {
callback = function()
lint.try_lint()
end, end,
}) },
end,
},
}
-- linting (optional but nice)
{
"mfussenegger/nvim-lint",
event = { "BufReadPost", "BufNewFile" },
config = function()
local lint = require("lint")
lint.linters_by_ft = {
python = { "flake8" },
go = { "golangcilint" },
}
vim.api.nvim_create_autocmd({ "BufWritePost", "InsertLeave" }, {
callback = function()
lint.try_lint()
end,
})
end,
},
}
+20 -20
View File
@@ -1,23 +1,23 @@
return { return {
{ {
"nvim-treesitter/nvim-treesitter", "nvim-treesitter/nvim-treesitter",
build = ":TSUpdate", build = ":TSUpdate",
event = { "BufReadPost", "BufNewFile" }, event = { "BufReadPost", "BufNewFile" },
opts = { opts = {
ensure_installed = { ensure_installed = {
"c", "cpp", "go", "python", "lua", "c", "cpp", "go", "rust", "python", "lua", "asm", "nasm",
"bash", "json", "yaml", "toml", "terraform", "hcl", "dockerfile",
"markdown", "markdown_inline", "bash", "json", "yaml", "toml",
"regex", "vim", "vimdoc", "markdown", "markdown_inline",
}, "regex", "vim", "vimdoc",
auto_install = true, },
sync_install = false, auto_install = true,
highlight = { enable = true }, sync_install = false,
indent = { enable = true }, highlight = { enable = true },
indent = { enable = true },
},
config = function(_, opts)
require("nvim-treesitter").setup(opts)
end,
}, },
config = function(_, opts)
require("nvim-treesitter").setup(opts)
end,
},
} }
-1
View File
@@ -38,4 +38,3 @@ return {
}, },
}, },
} }
-1
View File
@@ -1 +0,0 @@
/Users/itq/dotfiles/.config/nvim