From 8bb513a86e8bea07fdb8cea71d254d46ffc7806b Mon Sep 17 00:00:00 2001 From: Polesznyák Márk Date: Sat, 4 Apr 2026 03:16:27 +0200 Subject: feat!: migrate to vim.pack --- plugin/00-settings.lua | 140 ++++++++++++++++++++++++++++++++++++++++ plugin/10-remap.lua | 162 +++++++++++++++++++++++++++++++++++++++++++++++ plugin/20-colors.lua | 27 ++++++++ plugin/30-lspconfig.lua | 58 +++++++++++++++++ plugin/40-completion.lua | 36 +++++++++++ plugin/40-git.lua | 18 ++++++ plugin/40-guard.lua | 14 ++++ plugin/40-lsp.lua | 61 ++++++++++++++++++ plugin/40-misc.lua | 17 +++++ plugin/40-oil.lua | 24 +++++++ plugin/40-treesitter.lua | 58 +++++++++++++++++ 11 files changed, 615 insertions(+) create mode 100644 plugin/00-settings.lua create mode 100644 plugin/10-remap.lua create mode 100644 plugin/20-colors.lua create mode 100644 plugin/30-lspconfig.lua create mode 100644 plugin/40-completion.lua create mode 100644 plugin/40-git.lua create mode 100644 plugin/40-guard.lua create mode 100644 plugin/40-lsp.lua create mode 100644 plugin/40-misc.lua create mode 100644 plugin/40-oil.lua create mode 100644 plugin/40-treesitter.lua (limited to 'plugin') diff --git a/plugin/00-settings.lua b/plugin/00-settings.lua new file mode 100644 index 0000000..fba8771 --- /dev/null +++ b/plugin/00-settings.lua @@ -0,0 +1,140 @@ +vim.o.rnu = true +vim.o.nu = true + +vim.o.conceallevel = 2 + +vim.o.laststatus = 3 + +vim.o.winborder = "rounded" + +-- Plugin specific +vim.g.rustfmt_autosave = 1 +vim.g.vimtex_view_method = 'mupdf' +vim.g.guard_config = { + fmt_on_save = true, + lsp_as_default_formatter = true, +} + +vim.g.mason_path = vim.fn.stdpath("data") .. "/mason/bin" + +vim.diagnostic.config({ virtual_lines = true }) + +local function diagnostics() + local warns = vim.diagnostic.get(nil, { severity = vim.diagnostic.severity.WARN }) + local errors = vim.diagnostic.get(nil, { severity = vim.diagnostic.severity.ERROR }) + return string.format(" %d |  %d", #warns, #errors) +end + +local function get_attached_clients() + local buf_clients = vim.lsp.get_clients({ bufnr = 0 }) + if #buf_clients == 0 then + return "LSP Inactive" + end + + local buf_client_names = {} + + for _, client in pairs(buf_clients) do + table.insert(buf_client_names, client.name) + end + + local unique_client_names = {} + for _, client_name_target in ipairs(buf_client_names) do + local is_duplicate = false + for _, client_name_compare in ipairs(unique_client_names) do + if client_name_target == client_name_compare then + is_duplicate = true + end + end + if not is_duplicate then + table.insert(unique_client_names, client_name_target) + end + end + + local client_names_str = table.concat(unique_client_names, ", ") + local language_servers = string.format("[%s]", client_names_str) + + return language_servers +end + +vim.api.nvim_create_user_command("LspLog", function(_) + vim.cmd("edit " .. vim.fn.stdpath("state") .. "/lsp.log") +end, { + desc = "Show LSP log", +}) + +vim.api.nvim_create_user_command("PackUpdate", function(_) + vim.pack.update() +end, { + desc = "Update vim.pack plugins", +}) + +vim.api.nvim_create_user_command("PackList", function(_) + vim.pack.update(nil, { offline = true }) +end, { + desc = "List vim.pack plugins", +}) + +require("vim._core.ui2").enable({ + enable = true, +}) + +local function branch_name() + local branch = vim.fn.system("git branch --show-current 2> /dev/null | tr -d '\n'") + if branch ~= "" then + return " " .. branch + else + return "" + end +end + +vim.api.nvim_create_autocmd({ "FileType", "BufEnter", "FocusGained" }, { + callback = function() + vim.b.branch_name = branch_name() + end +}) + +function Status_Line() + return " " + .. "%<" + .. " %f " + .. (vim.b.branch_name or "") + .. " %m" + .. " %= " + .. diagnostics() + .. " " + .. get_attached_clients() + .. " [%{&filetype}]" + .. " %l:%c " +end + +vim.opt.statusline = "%{%v:lua.Status_Line()%}" + +vim.o.shiftwidth = 2 +vim.o.tabstop = 2 +vim.o.softtabstop = 2 +vim.o.expandtab = true + +vim.o.mouse = "" + +vim.o.smartindent = true + +vim.o.swapfile = false +vim.o.backup = false + +vim.o.scrolloff = 10 +vim.o.cursorline = false + +vim.o.hlsearch = true +vim.o.incsearch = true +vim.o.splitbelow = true +vim.o.splitright = true + +vim.o.clipboard = "unnamedplus" + +vim.opt.whichwrap:append "<>[]hl" + +vim.o.foldmethod = "expr" +vim.o.foldenable = false +vim.o.foldexpr = "v:lua.vim.treesitter.foldexpr()" + +vim.env.PATH = vim.g.mason_path .. ":" .. vim.env.PATH diff --git a/plugin/10-remap.lua b/plugin/10-remap.lua new file mode 100644 index 0000000..a30d6a8 --- /dev/null +++ b/plugin/10-remap.lua @@ -0,0 +1,162 @@ +vim.g.mapleader = " " +vim.keymap.set("n", "e", "Oil --float") +vim.keymap.set("n", "n", "set nu!") +vim.keymap.set("n", "rn", "set rnu!") +vim.keymap.set("n", "", "nohl") +vim.keymap.set("n", "x", "bw") +vim.keymap.set("n", "n", "bn") +vim.keymap.set("n", "p", "bp") +vim.keymap.set("n", "fb", "=ap") +vim.keymap.set("n", "m", "make") +vim.keymap.set("n", "", "!chmod 755 %", { silent = true }) +vim.keymap.set("n", "", ":m .+1==") +vim.keymap.set("n", "", ":m .-2==") +vim.keymap.set("v", "J", ":m '>+1gv=gv") +vim.keymap.set("v", "K", ":m '<-2gv=gv") +vim.keymap.set("n", "", "") +vim.keymap.set("n", "", "") +vim.keymap.set("v", ">", ">gv") +vim.keymap.set("v", "<", "sl", "exec \"normal i\".nr2char(getchar()).\"\\e\"") +vim.keymap.set("n", "sc", "exec \"normal a\".nr2char(getchar()).\"\\e\"") + +-- u/soer9459 +vim.keymap.set("n", ",", + function() + local cursor = vim.api.nvim_win_get_cursor(0) + vim.cmd("norm A;") + vim.api.nvim_win_set_cursor(0, cursor) + end, + { noremap = true, silent = true }) + +-- Switch between windows +vim.keymap.set("n", "", "h") +vim.keymap.set("n", "", "l") +vim.keymap.set("n", "", "j") +vim.keymap.set("n", "", "k") +vim.keymap.set("n", "v", ":vsp") +vim.keymap.set("n", "-", ":sp") + +-- Switch between panes +vim.keymap.set("n", "", "TmuxNavigateLeft") +vim.keymap.set("n", "", "TmuxNavigateRight") +vim.keymap.set("n", "", "TmuxNavigateDown") +vim.keymap.set("n", "", "TmuxNavigateUp") + +-- Color picker +vim.keymap.set("n", "cc", "CccPick") + +-- VimTex +vim.keymap.set("n", "ll", "VimtexCompile") +vim.keymap.set("n", "vl", "VimtexView") + +-- Screenkey +vim.keymap.set("n", "sk", "Screenkey") + +-- Undotree +vim.cmd("packadd nvim.undotree") +vim.keymap.set("n", "u", require("undotree").open) + +-- Telescope +local lazy_telescope = function() + vim.pack.add({ + "https://github.com/nvim-lua/plenary.nvim", + { + src = "https://github.com/nvim-telescope/telescope.nvim", + version = "v0.2.2" + }, + }) + + require("telescope").setup({ + pickers = { + find_files = { + hidden = true, + find_command = { "rg", "--files", "--hidden", "--glob", "!**/.git/**" }, + }, + }, + }) +end + +vim.keymap.set("n", "ff", function() + lazy_telescope() + vim.cmd("Telescope find_files") +end, {}) +vim.keymap.set("n", "fw", function() + lazy_telescope() + vim.cmd("Telescope live_grep") +end, {}) +vim.keymap.set("n", "fo", function() + lazy_telescope() + vim.cmd("Telescope buffers") +end, {}) +vim.keymap.set("n", "fh", function() + lazy_telescope() + vim.cmd("Telescope help_tags") +end, {}) +vim.keymap.set("n", "fz", function() + lazy_telescope() + vim.cmd("Telescope current_buffer_fuzzy_find") +end, {}) +vim.keymap.set("n", "fg", function() + lazy_telescope() + vim.cmd("Telescope git_files") +end, {}) +vim.keymap.set("n", "fd", function() + lazy_telescope() + vim.cmd("Telescope diagnostics") +end, {}) +vim.keymap.set("n", "ft", function() + lazy_telescope() + local telescope = require("telescope.builtin") + local handle = io.popen("rg 'TODO'") + if handle == nil then return end + local result = handle:read("*a") + handle:close() + + if result:match("[^\r\n]+") == nil then + local todo_files = {} + + local files_handle = io.popen("rg --files -g 'TODO.{md,txt}'") + if files_handle == nil then return end + local files_result = files_handle:read("*a") + files_handle:close() + + for file in files_result:gmatch("[^\r\n]+") do + table.insert(todo_files, file) + end + + if #todo_files > 0 then + telescope.find_files({ + prompt_title = "Choose TODO file", + cwd = vim.fn.getcwd(), + search_dirs = todo_files + }) + else + vim.api.nvim_echo({ { "Failed to find any to-dos", "WarningMsg" } }, true, {}) + end + else + telescope.grep_string({ search = "TODO" }) + end +end, { noremap = true, silent = true }) + +-- Diagnostics, LSP +vim.keymap.set("n", "gl", "lua vim.diagnostic.open_float()") +vim.keymap.set("n", "gp", "lua vim.diagnostic.jump({ count = -1 })") +vim.keymap.set("n", "gn", "lua vim.diagnostic.jump({ count = 1 })") + +vim.api.nvim_create_autocmd("LspAttach", { + desc = "LSP actions", + callback = function(event) + local opts = { buffer = event.buf } + + vim.keymap.set("n", "gd", "lua vim.lsp.buf.definition()", opts) + vim.keymap.set("n", "gD", "lua vim.lsp.buf.declaration()", opts) + vim.keymap.set("n", "go", "lua vim.lsp.buf.type_definition()", opts) + vim.keymap.set("n", "gs", "lua vim.lsp.buf.signature_help()", opts) + vim.keymap.set({ "n", "x" }, "", "lua vim.lsp.buf.format({async = true})", opts) + -- u/Blan_11 + vim.keymap.set("n", "lh", function() + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) + end, { silent = true, buffer = event.buf }) + end +}) diff --git a/plugin/20-colors.lua b/plugin/20-colors.lua new file mode 100644 index 0000000..dcab6d5 --- /dev/null +++ b/plugin/20-colors.lua @@ -0,0 +1,27 @@ +vim.pack.add({ + "https://github.com/uga-rosa/ccc.nvim", + { + src = "https://github.com/pml68/rosepine-tmuxed", + name = "rose-pine", + }, +}) + +require("ccc").setup({ + highlighter = { + auto_enable = true, + lsp = true, + }, +}) + +require("rose-pine").setup({ + styles = { + transparency = true, + italic = false, + }, + highlight_groups = { + StatusLine = { fg = "iris", bg = "iris", blend = 25 }, + StatusLineNC = { fg = "subtle", bg = "surface" }, + }, +}) + +vim.cmd.colorscheme("rose-pine") diff --git a/plugin/30-lspconfig.lua b/plugin/30-lspconfig.lua new file mode 100644 index 0000000..d8a9cfc --- /dev/null +++ b/plugin/30-lspconfig.lua @@ -0,0 +1,58 @@ +local servers = { + -- "asm_lsp", + "html", + "ts_ls", + "cssls", + "svelte", + "bashls", + "clangd", + "pyright", + "emmet_language_server", + "jsonls", + "rust_analyzer", + "kotlin_lsp", + "lua_ls", + "glsl_analyzer", + "csharp_ls", + "unocss", +} + +vim.api.nvim_create_autocmd({ "BufEnter" }, { + pattern = { "build.sh", "*.subpackage.sh", "PKGBUILD", "*.install", + "makepkg.conf", "*.ebuild", "*.eclass", "color.map", "make.conf" }, + callback = function() + vim.lsp.start({ + name = "termux", + cmd = { "termux-language-server" } + }) + end, +}) + +vim.api.nvim_create_autocmd({ "BufEnter" }, { + once = true, + pattern = { "Cargo.toml" }, + callback = function() + vim.pack.add({ "https://github.com/saecki/crates.nvim" }) + require("crates").setup({ + lsp = { + enabled = true, + actions = true, + completion = true, + hover = true, + }, + }) + + vim.keymap.set("n", "rcu", function() + require("crates").upgrade_all_crates() + end) + end, +}) + +vim.lsp.config('*', { + on_attach = function(client, bufnr) + vim.pack.add({ "https://github.com/artemave/workspace-diagnostics.nvim" }) + require("workspace-diagnostics").populate_workspace_diagnostics(client, bufnr) + end +}) + +vim.lsp.enable(servers) diff --git a/plugin/40-completion.lua b/plugin/40-completion.lua new file mode 100644 index 0000000..597a426 --- /dev/null +++ b/plugin/40-completion.lua @@ -0,0 +1,36 @@ +vim.pack.add({ + { + src = "https://github.com/saghen/blink.compat", + version = vim.version.range("2.x"), + }, + { + src = "https://github.com/saghen/blink.cmp", + version = vim.version.range("1.x"), + }, +}) + +require("blink.compat").setup({}) + +require("blink.cmp").setup({ + keymap = { preset = "default" }, + appearance = { + nerd_font_variant = "normal", + }, + completion = { + documentation = { + auto_show = true, + auto_show_delay_ms = 150, + }, + }, + sources = { + default = { "lsp", "path", "vimtex", "buffer" }, + providers = { + vimtex = { + name = "vimtex", + module = "blink.compat.source", + }, + }, + }, + cmdline = { enabled = false }, + signature = { enabled = true }, +}) diff --git a/plugin/40-git.lua b/plugin/40-git.lua new file mode 100644 index 0000000..eaf67b4 --- /dev/null +++ b/plugin/40-git.lua @@ -0,0 +1,18 @@ +vim.pack.add({ "https://github.com/lewis6991/gitsigns.nvim" }) + +require("gitsigns").setup({ + signs = { + add = { text = "│" }, + change = { text = "│" }, + delete = { text = "󰍵" }, + topdelete = { text = "‾" }, + changedelete = { text = "~" }, + untracked = { text = "│" }, + }, + on_attach = function(bufnr) + local gs = package.loaded.gitsigns + + vim.keymap.set("n", "gb", gs.blame_line, { buffer = bufnr }) + vim.keymap.set("n", "gr", gs.reset_hunk, { buffer = bufnr }) + end, +}) diff --git a/plugin/40-guard.lua b/plugin/40-guard.lua new file mode 100644 index 0000000..ffdd82a --- /dev/null +++ b/plugin/40-guard.lua @@ -0,0 +1,14 @@ +vim.api.nvim_create_autocmd({ "BufEnter" }, { + once = true, + pattern = { "*.c", "*.cpp", "*.cc", "*.h", "*.hpp", "*.toml", "*.json", "*.lua" }, + callback = function() + vim.pack.add({ "https://github.com/nvimdev/guard-collection" }) + vim.pack.add({ "https://github.com/nvimdev/guard.nvim" }) + + local ft = require("guard.filetype") + + ft("c,cpp,h"):fmt("clang-format") + ft("toml"):fmt("taplo") + ft("json"):fmt("jq") + end, +}) diff --git a/plugin/40-lsp.lua b/plugin/40-lsp.lua new file mode 100644 index 0000000..af95c47 --- /dev/null +++ b/plugin/40-lsp.lua @@ -0,0 +1,61 @@ +local opts = { + ensure_installed = { + "bash-language-server", + "termux-language-server", + "lua-language-server", + "clangd", + "clang-format", + "taplo", + "jq", + "json-lsp", + "svelte-language-server", + "emmet-language-server", + "html-lsp", + "css-lsp", + "typescript-language-server", + "pyright", + "glsl_analyzer", + "kotlin-lsp", + "jdtls", + "csharp-language-server", + "unocss-language-server", + }, + PATH = "skip", + ui = { + icons = { + package_pending = " ", + package_installed = "󰄳 ", + package_uninstalled = " 󰚌", + }, + keymaps = { + toggle_server_expand = "", + install_server = "i", + update_server = "u", + check_server_version = "c", + update_all_servers = "U", + check_outdated_servers = "C", + uninstall_server = "X", + cancel_installation = "", + }, + }, + max_concurrent_installers = 10, +} + +vim.api.nvim_create_user_command("MasonInstallAll", function () + if opts.ensure_installed and #opts.ensure_installed > 0 then + vim.cmd("MasonInstall " .. table.concat(opts.ensure_installed, " ")) + end +end, { + desc = "Install all required mason packages", +}) + +vim.pack.add({ + "https://github.com/neovim/nvim-lspconfig", + "https://github.com/mason-org/mason.nvim", +}) + +require("mason").setup(opts) + +if not (vim.uv or vim.loop).fs_stat(vim.g.mason_path) then + vim.cmd("MasonInstallAll") +end diff --git a/plugin/40-misc.lua b/plugin/40-misc.lua new file mode 100644 index 0000000..94e46e0 --- /dev/null +++ b/plugin/40-misc.lua @@ -0,0 +1,17 @@ +vim.schedule(function() + vim.pack.add({ + "https://github.com/andweeb/presence.nvim", + "https://github.com/NStefan002/screenkey.nvim", + "https://github.com/NStefan002/visual-surround.nvim", + "https://github.com/christoomey/vim-tmux-navigator", + "https://github.com/artemave/workspace-diagnostics.nvim", + "https://github.com/lukas-reineke/indent-blankline.nvim", + }) + + require("presence").setup({ + main_image = "file", + }) + require("screenkey").setup({}) + require("visual-surround").setup({}) + require("ibl").setup() +end) diff --git a/plugin/40-oil.lua b/plugin/40-oil.lua new file mode 100644 index 0000000..34b4a90 --- /dev/null +++ b/plugin/40-oil.lua @@ -0,0 +1,24 @@ +vim.pack.add({ "https://github.com/stevearc/oil.nvim" }) +require("oil").setup({ + keymaps = { + [""] = false, + }, + view_options = { + show_hidden = true, + natural_order = true, + is_always_hidden = function(name, _) + return name == "node_modules" or name == "target" + end + }, + float = { + padding = 2, + max_width = 50, + max_height = 0, + border = "single", + win_options = { + winblend = 0, + }, + }, + skip_confirm_for_simple_edits = true, + default_file_explorer = true, +}) diff --git a/plugin/40-treesitter.lua b/plugin/40-treesitter.lua new file mode 100644 index 0000000..a9ff45b --- /dev/null +++ b/plugin/40-treesitter.lua @@ -0,0 +1,58 @@ +vim.pack.add({ "https://github.com/nvim-treesitter/nvim-treesitter" }) + +local ts = require("nvim-treesitter") + +local ensure_installed = { + "asm", + "bash", + "c", + "c_sharp", + "cpp", + "css", + "git_config", + "gitattributes", + "gitcommit", + "gitignore", + "glsl", + "hare", + "html", + "java", + "javascript", + "json", + "kotlin", + "lua", + "make", + "markdown", + "markdown_inline", + "python", + "rust", + "scss", + "svelte", + "typescript", + "vim", + "vimdoc", + "yaml", +} + +ts.install(ensure_installed, { + max_jobs = 12, + summary = false, +}) + +local ignore = { + "checkhealth", + "lazy", + "mason", + "TelescopePrompt", +} + +vim.api.nvim_create_autocmd("FileType", { + group = vim.api.nvim_create_augroup("EnableTreesitterHighlighting", { clear = true }), + callback = function(event) + if vim.tbl_contains(ignore, event.match) then + return + end + + pcall(function() vim.treesitter.start(event.buf) end) + end +}) -- cgit v1.2.3