local utils = require("utils") local plugin_dir = vim.fn.stdpath("data") .. "/lazy" local lazypath = plugin_dir .. "/lazy.nvim" if not vim.uv.fs_stat(lazypath) then vim.fn.system { "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", -- latest stable release lazypath, } end vim.opt.rtp:prepend(lazypath) -- check if firenvim is active local firenvim_not_active = function() return not vim.g.started_by_firenvim end local plugin_specs = { -- auto-completion engine { "hrsh7th/cmp-nvim-lsp", lazy = true }, { "hrsh7th/cmp-path", lazy = true }, { "hrsh7th/cmp-buffer", lazy = true }, { "hrsh7th/cmp-omni", lazy = true }, { "hrsh7th/cmp-cmdline", lazy = true }, { "quangnguyen30192/cmp-nvim-ultisnips", lazy = true }, { "hrsh7th/nvim-cmp", name = "nvim-cmp", event = "VeryLazy", config = function() require("config.nvim-cmp") end, }, --{ -- "saghen/blink.cmp", -- -- optional: provides snippets for the snippet source -- dependencies = { "rafamadriz/friendly-snippets" }, -- -- use a release tag to download pre-built binaries -- version = "1.*", -- ---@module 'blink.cmp' -- ---@type blink.cmp.Config -- opts = { -- -- 'default' (recommended) for mappings similar to built-in completions (C-y to accept) -- -- 'super-tab' for mappings similar to vscode (tab to accept) -- -- 'enter' for enter to accept -- -- 'none' for no mappings -- -- -- keymap = { -- preset = "default", -- [""] = { "select_next", "fallback" }, -- [""] = { "select_prev", "fallback" }, -- [""] = { "select_and_accept", "fallback" }, -- [""] = { "scroll_documentation_up", "fallback" }, -- [""] = { "scroll_documentation_down", "fallback" }, -- }, -- appearance = { -- -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font' -- -- Adjusts spacing to ensure icons are aligned -- nerd_font_variant = "mono", -- }, -- -- (Default) Only show the documentation popup when manually triggered -- completion = { -- documentation = { -- auto_show = true, -- }, -- }, -- -- Default list of enabled providers defined so that you can extend it -- -- elsewhere in your config, without redefining it, due to `opts_extend` -- sources = { -- default = { "lsp", "path", "buffer" }, -- }, -- -- (Default) Rust fuzzy matcher for typo resistance and significantly better performance -- -- You may use a lua implementation instead by using `implementation = "lua"` or fallback to the lua implementation, -- -- when the Rust fuzzy matcher is not available, by using `implementation = "prefer_rust"` -- -- -- -- See the fuzzy documentation for more information -- fuzzy = { implementation = "prefer_rust_with_warning" }, -- cmdline = { -- completion = { -- menu = { -- auto_show = true, -- }, -- }, -- keymap = { -- [""] = { "select_and_accept", "fallback" }, -- }, -- }, -- }, -- opts_extend = { "sources.default" }, --}, { "neovim/nvim-lspconfig", event = { "BufRead", "BufNewFile" }, config = function() require("config.lsp") end, }, { "dnlhc/glance.nvim", config = function() require("config.glance") end, event = "VeryLazy", }, { "nvim-treesitter/nvim-treesitter", lazy = true, build = ":TSUpdate", config = function() require("config.treesitter") end, }, { "nvim-treesitter/nvim-treesitter-textobjects", event = "VeryLazy", branch = "master", config = function() require("config.treesitter-textobjects") end, }, { "machakann/vim-swap", event = "VeryLazy" }, -- IDE for Lisp -- 'kovisoft/slimv' { "vlime/vlime", enabled = function() return utils.executable("sbcl") end, config = function(plugin) vim.opt.rtp:append(plugin.dir .. "/vim") end, ft = { "lisp" }, }, -- Super fast buffer jump { "smoka7/hop.nvim", keys = { "f" }, config = function() require("config.nvim_hop") end, }, -- Show match number and index for searching { "kevinhwang91/nvim-hlslens", branch = "main", keys = { "*", "#", "n", "N" }, config = function() require("config.hlslens") end, }, { "nvim-telescope/telescope.nvim", cmd = "Telescope", dependencies = { "nvim-telescope/telescope-symbols.nvim", }, }, { "ibhagwan/fzf-lua", config = function() require("config.fzf-lua") end, event = "VeryLazy", }, { "MeanderingProgrammer/markdown.nvim", main = "render-markdown", opts = {}, ft = { "markdown" }, }, -- A list of colorscheme plugin you may want to try. Find what suits you. { "navarasu/onedark.nvim", lazy = true }, { "sainnhe/edge", lazy = true }, { "sainnhe/sonokai", lazy = true }, { "sainnhe/gruvbox-material", lazy = true }, { "sainnhe/everforest", lazy = true }, { "EdenEast/nightfox.nvim", lazy = true }, { "catppuccin/nvim", name = "catppuccin", lazy = true }, { "olimorris/onedarkpro.nvim", lazy = true }, { "marko-cerovac/material.nvim", lazy = true }, { "rockyzhang24/arctic.nvim", dependencies = { "rktjmp/lush.nvim" }, name = "arctic", branch = "v2", }, { "rebelot/kanagawa.nvim", lazy = true }, { "miikanissi/modus-themes.nvim", priority = 1000 }, { "wtfox/jellybeans.nvim", priority = 1000 }, { "projekt0n/github-nvim-theme", name = "github-theme" }, { "e-ink-colorscheme/e-ink.nvim", priority = 1000 }, { "ficcdaf/ashen.nvim", priority = 1000 }, { "savq/melange-nvim", priority = 1000 }, { "Skardyy/makurai-nvim", priority = 1000 }, { "vague2k/vague.nvim", priority = 1000 }, { "webhooked/kanso.nvim", priority = 1000 }, { "zootedb0t/citruszest.nvim", priority = 1000 }, -- plugins to provide nerdfont icons { "echasnovski/mini.icons", version = false, config = function() -- this is the compatibility fix for plugins that only support nvim-web-devicons require("mini.icons").mock_nvim_web_devicons() require("mini.icons").tweak_lsp_kind() end, lazy = true, }, { "nvim-lualine/lualine.nvim", event = "BufRead", cond = firenvim_not_active, config = function() require("config.lualine") end, }, { "akinsho/bufferline.nvim", event = { "BufEnter" }, cond = firenvim_not_active, config = function() require("config.bufferline") end, }, -- fancy start screen { "nvimdev/dashboard-nvim", cond = firenvim_not_active, config = function() require("config.dashboard-nvim") end, }, { "echasnovski/mini.indentscope", version = false, config = function() local mini_indent = require("mini.indentscope") mini_indent.setup { draw = { animation = mini_indent.gen_animation.none(), }, symbol = "▏", } end, }, { "luukvbaal/statuscol.nvim", opts = {}, config = function() require("config.nvim-statuscol") end, }, { "kevinhwang91/nvim-ufo", dependencies = "kevinhwang91/promise-async", event = "VeryLazy", opts = {}, init = function() vim.o.foldcolumn = "1" -- '0' is not bad vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value vim.o.foldlevelstart = 99 vim.o.foldenable = true end, config = function() require("config.nvim_ufo") end, }, -- Highlight URLs inside vim { "itchyny/vim-highlighturl", event = "BufReadPost" }, -- notification plugin { "rcarriga/nvim-notify", event = "VeryLazy", config = function() require("config.nvim-notify") end, }, { "nvim-lua/plenary.nvim", lazy = true }, -- For Windows and Mac, we can open an URL in the browser. For Linux, it may -- not be possible since we maybe in a server which disables GUI. { "chrishrb/gx.nvim", keys = { { "gx", "Browse", mode = { "n", "x" } } }, cmd = { "Browse" }, init = function() vim.g.netrw_nogx = 1 -- disable netrw gx end, enabled = function() return vim.g.is_win or vim.g.is_mac end, config = true, -- default settings submodules = false, -- not needed, submodules are required only for tests }, -- Only install these plugins if ctags are installed on the system -- show file tags in vim window { "liuchengxu/vista.vim", enabled = function() return utils.executable("ctags") end, cmd = "Vista", }, -- Snippet engine and snippet template { "SirVer/ultisnips", dependencies = { "honza/vim-snippets", }, event = "InsertEnter", }, -- Automatic insertion and deletion of a pair of characters { "windwp/nvim-autopairs", event = "InsertEnter", config = true, }, -- Comment plugin { "tpope/vim-commentary", keys = { { "gc", mode = "n" }, { "gc", mode = "v" }, }, }, -- Multiple cursor plugin like Sublime Text? -- 'mg979/vim-visual-multi' -- Show undo history visually { "simnalamburt/vim-mundo", cmd = { "MundoToggle", "MundoShow" } }, -- Manage your yank history { "gbprod/yanky.nvim", config = function() require("config.yanky") end, cmd = "YankyRingHistory", }, -- Handy unix command inside Vim (Rename, Move etc.) { "tpope/vim-eunuch", cmd = { "Rename", "Delete" } }, -- Repeat vim motions { "tpope/vim-repeat", event = "VeryLazy" }, { "nvim-zh/better-escape.vim", event = { "InsertEnter" } }, { "lyokha/vim-xkbswitch", enabled = function() return vim.g.is_mac and utils.executable("xkbswitch") end, event = { "InsertEnter" }, }, { "Neur1n/neuims", enabled = function() return vim.g.is_win end, event = { "InsertEnter" }, }, -- Git command inside vim { "tpope/vim-fugitive", event = "User InGitRepo", config = function() require("config.fugitive") end, }, { "NeogitOrg/neogit", dependencies = { "nvim-lua/plenary.nvim", -- required "sindrets/diffview.nvim", -- optional - Diff integration -- Only one of these is needed. "ibhagwan/fzf-lua", -- optional }, event = "User InGitRepo", }, -- Better git log display { "rbong/vim-flog", cmd = { "Flog" } }, { "akinsho/git-conflict.nvim", version = "*", event = "VeryLazy", config = function() require("config.git-conflict") end, }, { "ruifm/gitlinker.nvim", event = "User InGitRepo", config = function() require("config.git-linker") end, }, -- Show git change (change, delete, add) signs in vim sign column { "lewis6991/gitsigns.nvim", config = function() require("config.gitsigns") end, event = "BufRead", }, { "sindrets/diffview.nvim", cmd = { "DiffviewOpen" }, }, { "kevinhwang91/nvim-bqf", ft = "qf", config = function() require("config.bqf") end, }, -- Faster footnote generation { "vim-pandoc/vim-markdownfootnotes", ft = { "markdown" } }, -- Vim tabular plugin for manipulate tabular, required by markdown plugins { "godlygeek/tabular", ft = { "markdown" } }, -- Markdown previewing (only for Mac and Windows) { "iamcco/markdown-preview.nvim", enabled = function() return vim.g.is_win or vim.g.is_mac end, build = "cd app && npm install && git restore .", ft = { "markdown" }, }, { "rhysd/vim-grammarous", enabled = function() return vim.g.is_mac end, ft = { "markdown" }, }, { "chrisbra/unicode.vim", keys = { "ga" }, cmd = { "UnicodeSearch" } }, -- Additional powerful text object for vim, this plugin should be studied -- carefully to use its full power { "wellle/targets.vim", event = "VeryLazy" }, -- Plugin to manipulate character pairs quickly { "machakann/vim-sandwich", event = "VeryLazy" }, -- Only use these plugin on Windows and Mac and when LaTeX is installed { "lervag/vimtex", enabled = function() return utils.executable("latex") end, ft = { "tex" }, }, -- Since tmux is only available on Linux and Mac, we only enable these plugins -- for Linux and Mac -- .tmux.conf syntax highlighting and setting check { "tmux-plugins/vim-tmux", enabled = function() return utils.executable("tmux") end, ft = { "tmux" }, }, -- Modern matchit implementation { "andymass/vim-matchup", event = "BufRead" }, { "tpope/vim-scriptease", cmd = { "Scriptnames", "Messages", "Verbose" } }, -- Asynchronous command execution { "skywind3000/asyncrun.vim", lazy = true, cmd = { "AsyncRun" } }, { "cespare/vim-toml", ft = { "toml" }, branch = "main" }, -- Edit text area in browser using nvim { "glacambre/firenvim", enabled = function() return vim.g.is_win or vim.g.is_mac end, -- it seems that we can only call the firenvim function directly. -- Using vim.fn or vim.cmd to call this function will fail. build = function() local firenvim_path = plugin_dir .. "/firenvim" vim.opt.runtimepath:append(firenvim_path) vim.cmd("runtime! firenvim.vim") -- macOS will reset the PATH when firenvim starts a nvim process, causing the PATH variable to change unexpectedly. -- Here we are trying to get the correct PATH and use it for firenvim. -- See also https://github.com/glacambre/firenvim/blob/master/TROUBLESHOOTING.md#make-sure-firenvims-path-is-the-same-as-neovims local path_env = vim.env.PATH local prologue = string.format('export PATH="%s"', path_env) -- local prologue = "echo" local cmd_str = string.format(":call firenvim#install(0, '%s')", prologue) vim.cmd(cmd_str) end, }, -- Debugger plugin { "sakhnik/nvim-gdb", enabled = function() return vim.g.is_win or vim.g.is_linux end, build = { "bash install.sh" }, lazy = true, }, -- Session management plugin { "tpope/vim-obsession", cmd = "Obsession" }, { "ojroques/vim-oscyank", enabled = function() return vim.g.is_linux end, cmd = { "OSCYank", "OSCYankReg" }, }, -- showing keybindings { "folke/which-key.nvim", event = "VeryLazy", config = function() require("config.which-key") end, }, { "folke/snacks.nvim", priority = 1000, lazy = false, opts = { -- more beautiful vim.ui.input input = { enabled = true, win = { relative = "cursor", backdrop = true, }, }, -- more beautiful vim.ui.select picker = { enabled = true }, }, }, -- show and trim trailing whitespaces { "jdhao/whitespace.nvim", event = "VeryLazy" }, -- file explorer { "nvim-tree/nvim-tree.lua", keys = { "s" }, config = function() require("config.nvim-tree") end, }, { "j-hui/fidget.nvim", event = "BufRead", config = function() require("config.fidget-nvim") end, }, { "folke/lazydev.nvim", ft = "lua", -- only load on lua files opts = { library = { -- See the configuration section for more details -- Load luvit types when the `vim.uv` word is found { path = "${3rd}/luv/library", words = { "vim%.uv" } }, }, }, }, { "CopilotC-Nvim/CopilotChat.nvim", dependencies = { { "zbirenbaum/copilot.lua" }, -- or github/copilot.vim }, opts = { debug = true, -- Enable debugging -- See Configuration section for rest }, cmd = { "CopilotChat" }, }, { "zbirenbaum/copilot.lua", cmd = "Copilot", config = function() require("copilot").setup {} end, }, { "smjonas/live-command.nvim", -- live-command supports semantic versioning via Git tags -- tag = "2.*", cmd = "Preview", config = function() require("config.live-command") end, }, { -- show hint for code actions, the user can also implement code actions themselves, -- see discussion here: https://github.com/neovim/neovim/issues/14869 "kosayoda/nvim-lightbulb", config = function() require("config.lightbulb") end, event = "LspAttach", }, { "Bekaboo/dropbar.nvim", event = "VeryLazy", }, { "catgoose/nvim-colorizer.lua", event = "BufReadPre", opts = { -- set to setup table }, }, } ---@diagnostic disable-next-line: missing-fields require("lazy").setup { spec = plugin_specs, ui = { border = "rounded", title = "Plugin Manager", title_pos = "center", }, rocks = { enabled = false, hererocks = false, }, }