diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index 0042d90..407d43e 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -3,4 +3,3 @@ require("config.keymaps") require("config.autocmds") require("config.diagnostics") require("config.lazy") - diff --git a/.config/nvim/lua/config/autocmds.lua b/.config/nvim/lua/config/autocmds.lua index a050543..e2ba9af 100644 --- a/.config/nvim/lua/config/autocmds.lua +++ b/.config/nvim/lua/config/autocmds.lua @@ -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) - diff --git a/.config/nvim/lua/config/diagnostics.lua b/.config/nvim/lua/config/diagnostics.lua index 0311572..965bf87 100644 --- a/.config/nvim/lua/config/diagnostics.lua +++ b/.config/nvim/lua/config/diagnostics.lua @@ -18,4 +18,3 @@ vim.diagnostic.config({ severity_sort = true, float = { border = "rounded", source = "if_many" }, }) - diff --git a/.config/nvim/lua/config/keymaps.lua b/.config/nvim/lua/config/keymaps.lua index f1fded7..3e97e46 100644 --- a/.config/nvim/lua/config/keymaps.lua +++ b/.config/nvim/lua/config/keymaps.lua @@ -20,3 +20,13 @@ map("n", "fg", "Telescope live_grep", { desc = "Live grep" }) map("n", "fb", "Telescope buffers", { desc = "Buffers" }) map("n", "fh", "Telescope help_tags", { desc = "Help" }) +-- file tree +map("n", "tt", "Neotree toggle", { desc = "Toggle file tree" }) +map("n", "tf", "Neotree reveal", { desc = "Reveal file in tree" }) + +-- Git +map("n", "gs", "Git", { desc = "Git status" }) +map("n", "gg", "LazyGit", { desc = "LazyGit" }) +map("n", "gd", "DiffviewOpen", { desc = "Diffview open" }) +map("n", "gD", "DiffviewClose", { desc = "Diffview close" }) +map("n", "gh", "DiffviewFileHistory", { desc = "Diffview file history" }) diff --git a/.config/nvim/lua/config/lazy.lua b/.config/nvim/lua/config/lazy.lua index 37546ea..9abf13f 100644 --- a/.config/nvim/lua/config/lazy.lua +++ b/.config/nvim/lua/config/lazy.lua @@ -19,4 +19,3 @@ require("lazy").setup({ checker = { enabled = true }, ui = { border = "rounded" }, }) - diff --git a/.config/nvim/lua/config/options.lua b/.config/nvim/lua/config/options.lua index e292339..cc410af 100644 --- a/.config/nvim/lua/config/options.lua +++ b/.config/nvim/lua/config/options.lua @@ -1,6 +1,12 @@ vim.g.mapleader = " " 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 opt.number = true opt.relativenumber = true @@ -28,4 +34,3 @@ opt.timeoutlen = 400 opt.clipboard = "unnamedplus" opt.undofile = true - diff --git a/.config/nvim/lua/plugins/cmp.lua b/.config/nvim/lua/plugins/cmp.lua index aa948a1..5d138df 100644 --- a/.config/nvim/lua/plugins/cmp.lua +++ b/.config/nvim/lua/plugins/cmp.lua @@ -65,4 +65,3 @@ return { end, }, } - diff --git a/.config/nvim/lua/plugins/core.lua b/.config/nvim/lua/plugins/core.lua index ed3b238..ec2d80a 100644 --- a/.config/nvim/lua/plugins/core.lua +++ b/.config/nvim/lua/plugins/core.lua @@ -1,15 +1,13 @@ 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 }, } diff --git a/.config/nvim/lua/plugins/devops.lua b/.config/nvim/lua/plugins/devops.lua new file mode 100644 index 0000000..362c71d --- /dev/null +++ b/.config/nvim/lua/plugins/devops.lua @@ -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, + }, +} diff --git a/.config/nvim/lua/plugins/explorer.lua b/.config/nvim/lua/plugins/explorer.lua new file mode 100644 index 0000000..154904b --- /dev/null +++ b/.config/nvim/lua/plugins/explorer.lua @@ -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 }, + }, + }, +} diff --git a/.config/nvim/lua/plugins/git.lua b/.config/nvim/lua/plugins/git.lua new file mode 100644 index 0000000..c179981 --- /dev/null +++ b/.config/nvim/lua/plugins/git.lua @@ -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", "hs", gs.stage_hunk, "Stage hunk") + map("n", "hS", gs.stage_buffer, "Stage buffer") + map("n", "hr", gs.reset_hunk, "Reset hunk") + map("n", "hR", gs.reset_buffer, "Reset buffer") + map("n", "hp", gs.preview_hunk, "Preview hunk") + map("n", "hb", gs.blame_line, "Blame line") + map("n", "hd", gs.diffthis, "Diff this") + map("n", "hD", function() gs.diffthis("~") end, "Diff this ~") + map("n", "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" }, + }, +} diff --git a/.config/nvim/lua/plugins/lsp.lua b/.config/nvim/lua/plugins/lsp.lua index 2577be5..62340b1 100644 --- a/.config/nvim/lua/plugins/lsp.lua +++ b/.config/nvim/lua/plugins/lsp.lua @@ -1,79 +1,172 @@ local function lsp_keymaps(ev) - local buf = ev.buf - local map = function(mode, lhs, rhs, desc) - vim.keymap.set(mode, lhs, rhs, { buffer = buf, desc = desc }) - end + local buf = ev.buf + local map = function(mode, lhs, rhs, desc) + vim.keymap.set(mode, lhs, rhs, { buffer = buf, desc = desc }) + end - map("n", "K", vim.lsp.buf.hover, "Hover") - map("n", "gd", vim.lsp.buf.definition, "Go to definition") - map("n", "gD", vim.lsp.buf.declaration, "Go to declaration") - map("n", "gr", vim.lsp.buf.references, "References") - map("n", "gi", vim.lsp.buf.implementation, "Implementation") - map("n", "rn", vim.lsp.buf.rename, "Rename") - map("n", "ca", vim.lsp.buf.code_action, "Code action") + map("n", "K", vim.lsp.buf.hover, "Hover") + map("n", "gd", vim.lsp.buf.definition, "Go to definition") + map("n", "gD", vim.lsp.buf.declaration, "Go to declaration") + map("n", "gr", vim.lsp.buf.references, "References") + map("n", "gi", vim.lsp.buf.implementation, "Implementation") + map("n", "rn", vim.lsp.buf.rename, "Rename") + map("n", "ca", vim.lsp.buf.code_action, "Code action") - if vim.lsp.inlay_hint then - pcall(vim.lsp.inlay_hint.enable, true, { bufnr = buf }) - end + if vim.lsp.inlay_hint then + pcall(vim.lsp.inlay_hint.enable, true, { bufnr = buf }) + end end return { - { "williamboman/mason.nvim", cmd = "Mason", opts = {} }, + { "williamboman/mason.nvim", cmd = "Mason", opts = {} }, - { - "williamboman/mason-lspconfig.nvim", - event = "VeryLazy", - dependencies = { "mason.nvim" }, - opts = { - ensure_installed = { "clangd", "gopls", "pyright", "lua_ls" }, - automatic_installation = true, + { + "williamboman/mason-lspconfig.nvim", + event = "VeryLazy", + dependencies = { "mason.nvim" }, + opts = { + ensure_installed = { + "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), - -- but DO NOT call require("lspconfig") anymore. - { - "neovim/nvim-lspconfig", - event = { "BufReadPre", "BufNewFile" }, - dependencies = { "hrsh7th/cmp-nvim-lsp" }, - config = function() - vim.api.nvim_create_autocmd("LspAttach", { callback = lsp_keymaps }) + -- Keep nvim-lspconfig installed (it provides server definitions), + -- but DO NOT call require("lspconfig") anymore. + { + "neovim/nvim-lspconfig", + event = { "BufReadPre", "BufNewFile" }, + dependencies = { "hrsh7th/cmp-nvim-lsp", "b0o/schemastore.nvim" }, + config = function() + vim.api.nvim_create_autocmd("LspAttach", { callback = lsp_keymaps }) - local caps = vim.lsp.protocol.make_client_capabilities() - local ok, cmp_lsp = pcall(require, "cmp_nvim_lsp") - if ok then - caps = cmp_lsp.default_capabilities(caps) - end + local caps = vim.lsp.protocol.make_client_capabilities() + local ok, cmp_lsp = pcall(require, "cmp_nvim_lsp") + if ok then + caps = cmp_lsp.default_capabilities(caps) + end - vim.lsp.config("clangd", { - capabilities = caps, - cmd = { "clangd", "--background-index", "--clang-tidy", "--header-insertion=iwyu" }, - }) + vim.lsp.config("clangd", { + capabilities = caps, + cmd = { "clangd", "--background-index", "--clang-tidy", "--header-insertion=iwyu" }, + }) - vim.lsp.config("gopls", { - capabilities = caps, - settings = { - gopls = { - staticcheck = true, - analyses = { unusedparams = true, nilness = true, shadow = true }, - }, - }, - }) + vim.lsp.config("gopls", { + capabilities = caps, + settings = { + gopls = { + staticcheck = 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", { - capabilities = caps, - settings = { - Lua = { - diagnostics = { globals = { "vim" } }, - workspace = { checkThirdParty = false }, - }, - }, - }) + vim.lsp.config("lua_ls", { + capabilities = caps, + settings = { + Lua = { + diagnostics = { globals = { "vim" } }, + workspace = { checkThirdParty = false }, + }, + }, + }) - vim.lsp.enable({ "clangd", "gopls", "pyright", "lua_ls" }) - end, - }, + vim.lsp.config("rust_analyzer", { + 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, + }, } - diff --git a/.config/nvim/lua/plugins/tooling.lua b/.config/nvim/lua/plugins/tooling.lua index 67a7cfd..87bb740 100644 --- a/.config/nvim/lua/plugins/tooling.lua +++ b/.config/nvim/lua/plugins/tooling.lua @@ -1,46 +1,47 @@ return { - -- formatting - { - "stevearc/conform.nvim", - event = { "BufReadPre", "BufNewFile" }, - opts = { - format_on_save = { timeout_ms = 1500, lsp_fallback = true }, - formatters_by_ft = { - c = { "clang_format" }, - cpp = { "clang_format" }, - go = { "gofmt", "goimports" }, - python = { "isort", "black" }, - lua = { "stylua" }, - json = { "prettier" }, - yaml = { "prettier" }, - markdown = { "prettier" }, - }, - }, - config = function(_, opts) - require("conform").setup(opts) - vim.keymap.set("n", "f", function() - require("conform").format({ lsp_fallback = true }) - end, { desc = "Format buffer" }) - 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() + -- formatting + { + "stevearc/conform.nvim", + event = { "BufReadPre", "BufNewFile" }, + opts = { + format_on_save = { timeout_ms = 1500, lsp_fallback = true }, + formatters_by_ft = { + c = { "clang_format" }, + cpp = { "clang_format" }, + go = { "gofmt", "goimports" }, + terraform = { "terraform_fmt" }, + rust = { "rustfmt" }, + python = { "isort", "black" }, + lua = { "stylua" }, + json = { "prettier" }, + yaml = { "prettier" }, + markdown = { "prettier" }, + }, + }, + config = function(_, opts) + require("conform").setup(opts) + vim.keymap.set("n", "f", function() + require("conform").format({ lsp_fallback = true }) + end, { desc = "Format buffer" }) 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, + }, +} diff --git a/.config/nvim/lua/plugins/treesitter.lua b/.config/nvim/lua/plugins/treesitter.lua index efaf883..95b18af 100644 --- a/.config/nvim/lua/plugins/treesitter.lua +++ b/.config/nvim/lua/plugins/treesitter.lua @@ -1,23 +1,23 @@ return { - { - "nvim-treesitter/nvim-treesitter", - build = ":TSUpdate", - event = { "BufReadPost", "BufNewFile" }, - opts = { - ensure_installed = { - "c", "cpp", "go", "python", "lua", - "bash", "json", "yaml", "toml", - "markdown", "markdown_inline", - "regex", "vim", "vimdoc", - }, - auto_install = true, - sync_install = false, - highlight = { enable = true }, - indent = { enable = true }, + { + "nvim-treesitter/nvim-treesitter", + build = ":TSUpdate", + event = { "BufReadPost", "BufNewFile" }, + opts = { + ensure_installed = { + "c", "cpp", "go", "rust", "python", "lua", "asm", "nasm", + "terraform", "hcl", "dockerfile", + "bash", "json", "yaml", "toml", + "markdown", "markdown_inline", + "regex", "vim", "vimdoc", + }, + auto_install = true, + sync_install = false, + highlight = { enable = true }, + indent = { enable = true }, + }, + config = function(_, opts) + require("nvim-treesitter").setup(opts) + end, }, - config = function(_, opts) - require("nvim-treesitter").setup(opts) - end, - }, } - diff --git a/.config/nvim/lua/plugins/ui.lua b/.config/nvim/lua/plugins/ui.lua index 42eadb9..f20b829 100644 --- a/.config/nvim/lua/plugins/ui.lua +++ b/.config/nvim/lua/plugins/ui.lua @@ -38,4 +38,3 @@ return { }, }, } - diff --git a/.config/nvim/nvim b/.config/nvim/nvim deleted file mode 120000 index 59fb84e..0000000 --- a/.config/nvim/nvim +++ /dev/null @@ -1 +0,0 @@ -/Users/itq/dotfiles/.config/nvim \ No newline at end of file