mirror of
https://github.com/jdhao/nvim-config.git
synced 2025-06-08 14:14:33 +02:00
661 lines
16 KiB
Lua
661 lines
16 KiB
Lua
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",
|
|
-- ["<Tab>"] = { "select_next", "fallback" },
|
|
-- ["<S-Tab>"] = { "select_prev", "fallback" },
|
|
-- ["<Enter>"] = { "select_and_accept", "fallback" },
|
|
-- ["<C-U>"] = { "scroll_documentation_up", "fallback" },
|
|
-- ["<C-D>"] = { "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 = {
|
|
-- ["<Enter>"] = { "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", "<cmd>Browse<cr>", 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,
|
|
},
|
|
|
|
-- 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 = { "<space>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,
|
|
},
|
|
}
|