mirror of
https://github.com/d0zingcat/dotfiles.git
synced 2026-05-14 07:26:44 +00:00
34
nvim/lua/plugins/cmp.lua
Normal file
34
nvim/lua/plugins/cmp.lua
Normal file
@@ -0,0 +1,34 @@
|
||||
-- cmp.lua - 自动补全配置
|
||||
return {
|
||||
{
|
||||
"hrsh7th/nvim-cmp",
|
||||
dependencies = {
|
||||
"hrsh7th/cmp-nvim-lsp",
|
||||
"hrsh7th/cmp-buffer",
|
||||
"hrsh7th/cmp-path",
|
||||
"L3MON4D3/LuaSnip",
|
||||
"saadparwaiz1/cmp_luasnip",
|
||||
},
|
||||
event = "InsertEnter",
|
||||
opts = function()
|
||||
local cmp = require("cmp")
|
||||
return {
|
||||
snippet = {
|
||||
expand = function(args)
|
||||
require("luasnip").lsp_expand(args.body)
|
||||
end,
|
||||
},
|
||||
mapping = cmp.mapping.preset.insert({
|
||||
["<C-Space>"] = cmp.mapping.complete(),
|
||||
["<CR>"] = cmp.mapping.confirm({ select = true }),
|
||||
}),
|
||||
sources = cmp.config.sources({
|
||||
{ name = "nvim_lsp" },
|
||||
{ name = "luasnip" },
|
||||
{ name = "buffer" },
|
||||
{ name = "path" },
|
||||
}),
|
||||
}
|
||||
end,
|
||||
},
|
||||
}
|
||||
625
nvim/lua/plugins/coding.lua
Normal file
625
nvim/lua/plugins/coding.lua
Normal file
@@ -0,0 +1,625 @@
|
||||
-- coding.lua - 代码增强插件配置
|
||||
|
||||
return {
|
||||
-- LSP 配置
|
||||
{
|
||||
"neovim/nvim-lspconfig",
|
||||
event = { "BufReadPre", "BufNewFile" },
|
||||
dependencies = {
|
||||
-- LSP 管理器
|
||||
{ "williamboman/mason.nvim" },
|
||||
{ "williamboman/mason-lspconfig.nvim" },
|
||||
|
||||
-- 自动安装 LSP
|
||||
{ "WhoIsSethDaniel/mason-tool-installer.nvim" },
|
||||
|
||||
-- 显示 LSP 进度
|
||||
{ "j-hui/fidget.nvim", opts = {} },
|
||||
|
||||
-- 额外 LSP 功能
|
||||
{ "folke/neodev.nvim", opts = {} },
|
||||
},
|
||||
opts = {
|
||||
-- LSP 服务器诊断设置
|
||||
diagnostics = {
|
||||
underline = true,
|
||||
update_in_insert = false,
|
||||
virtual_text = {
|
||||
spacing = 4,
|
||||
source = "if_many",
|
||||
prefix = "●",
|
||||
},
|
||||
severity_sort = true,
|
||||
signs = {
|
||||
text = {
|
||||
[vim.diagnostic.severity.ERROR] = "✘",
|
||||
[vim.diagnostic.severity.WARN] = "▲",
|
||||
[vim.diagnostic.severity.HINT] = "⚑",
|
||||
[vim.diagnostic.severity.INFO] = "»",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 自动格式化
|
||||
format = {
|
||||
formatting_options = nil,
|
||||
timeout_ms = 1000,
|
||||
},
|
||||
|
||||
-- LSP 服务器设置
|
||||
servers = {
|
||||
-- 根据语言配置服务器
|
||||
lua_ls = {
|
||||
settings = {
|
||||
Lua = {
|
||||
completion = {
|
||||
callSnippet = "Replace",
|
||||
},
|
||||
workspace = {
|
||||
checkThirdParty = false,
|
||||
},
|
||||
telemetry = {
|
||||
enable = false,
|
||||
},
|
||||
diagnostics = {
|
||||
globals = { "vim" },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- Python 服务器
|
||||
pyright = {
|
||||
settings = {
|
||||
python = {
|
||||
analysis = {
|
||||
typeCheckingMode = "basic",
|
||||
autoSearchPaths = true,
|
||||
useLibraryCodeForTypes = true,
|
||||
diagnosticMode = "workspace",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
ruff_lsp = {
|
||||
-- Ruff 会处理导入和排序
|
||||
init_options = {
|
||||
settings = {
|
||||
args = {},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- Go 服务器
|
||||
gopls = {
|
||||
settings = {
|
||||
gopls = {
|
||||
gofumpt = true,
|
||||
codelenses = {
|
||||
gc_details = true,
|
||||
generate = true,
|
||||
regenerate_cgo = true,
|
||||
run_govulncheck = true,
|
||||
test = true,
|
||||
tidy = true,
|
||||
upgrade_dependency = true,
|
||||
vendor = true,
|
||||
},
|
||||
hints = {
|
||||
assignVariableTypes = true,
|
||||
compositeLiteralFields = true,
|
||||
compositeLiteralTypes = true,
|
||||
constantValues = true,
|
||||
functionTypeParameters = true,
|
||||
parameterNames = true,
|
||||
rangeVariableTypes = true,
|
||||
},
|
||||
analyses = {
|
||||
fieldalignment = true,
|
||||
nilness = true,
|
||||
unusedparams = true,
|
||||
unusedwrite = true,
|
||||
useany = true,
|
||||
shadow = true,
|
||||
},
|
||||
usePlaceholders = true,
|
||||
completeUnimported = true,
|
||||
staticcheck = true,
|
||||
directoryFilters = { "-.git", "-.vscode", "-.idea", "-.vscode-test", "-node_modules" },
|
||||
semanticTokens = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 自动设置功能
|
||||
setup = {
|
||||
ruff_lsp = function()
|
||||
require("lazyvim.util").lsp.on_attach(function(client, _)
|
||||
-- 禁用 ruff 格式化功能,由 none-ls 处理
|
||||
if client.name == "ruff_lsp" then
|
||||
client.server_capabilities.documentFormattingProvider = false
|
||||
end
|
||||
end)
|
||||
end,
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
-- 设置诊断标志
|
||||
for name, icon in pairs(opts.diagnostics.signs.text) do
|
||||
name = "DiagnosticSign" .. name
|
||||
vim.fn.sign_define(name, { text = icon, texthl = name, numhl = "" })
|
||||
end
|
||||
|
||||
-- 配置诊断
|
||||
vim.diagnostic.config(vim.deepcopy(opts.diagnostics))
|
||||
|
||||
-- 设置 LSP 的键绑定和自动命令
|
||||
vim.api.nvim_create_autocmd("LspAttach", {
|
||||
callback = function(args)
|
||||
local buffer = args.buf
|
||||
local client = vim.lsp.get_client_by_id(args.data.client_id)
|
||||
|
||||
-- 设置 LSP 键绑定
|
||||
local map = function(mode, l, r, opts_)
|
||||
opts_ = opts_ or {}
|
||||
opts_.silent = true
|
||||
opts_.buffer = buffer
|
||||
vim.keymap.set(mode, l, r, opts_)
|
||||
end
|
||||
|
||||
-- 导航键绑定
|
||||
map("n", "gd", "<cmd>Telescope lsp_definitions<cr>", { desc = "转到定义" })
|
||||
map("n", "gr", "<cmd>Telescope lsp_references<cr>", { desc = "查找引用" })
|
||||
map("n", "gD", vim.lsp.buf.declaration, { desc = "转到声明" })
|
||||
map("n", "gI", "<cmd>Telescope lsp_implementations<cr>", { desc = "转到实现" })
|
||||
map("n", "gt", "<cmd>Telescope lsp_type_definitions<cr>", { desc = "转到类型定义" })
|
||||
map("n", "K", vim.lsp.buf.hover, { desc = "显示悬停信息" })
|
||||
map("n", "gK", vim.lsp.buf.signature_help, { desc = "显示签名帮助" })
|
||||
|
||||
-- 代码操作键绑定
|
||||
map("n", "<leader>ca", vim.lsp.buf.code_action, { desc = "代码操作" })
|
||||
map("n", "<leader>cr", vim.lsp.buf.rename, { desc = "重命名" })
|
||||
|
||||
-- 诊断键绑定
|
||||
map("n", "]d", vim.diagnostic.goto_next, { desc = "下一个诊断" })
|
||||
map("n", "[d", vim.diagnostic.goto_prev, { desc = "上一个诊断" })
|
||||
map("n", "<leader>cd", vim.diagnostic.open_float, { desc = "行诊断" })
|
||||
map("n", "<leader>cl", "<cmd>LspInfo<cr>", { desc = "LSP 信息" })
|
||||
|
||||
-- 格式化文档(如果服务器支持)
|
||||
if client and client.supports_method("textDocument/formatting") then
|
||||
map("n", "<leader>cf", vim.lsp.buf.format, { desc = "格式化代码" })
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- 设置 LSP 服务器
|
||||
local capabilities = vim.tbl_deep_extend(
|
||||
"force",
|
||||
{},
|
||||
vim.lsp.protocol.make_client_capabilities(),
|
||||
require("cmp_nvim_lsp").default_capabilities(),
|
||||
opts.capabilities or {}
|
||||
)
|
||||
|
||||
-- 为 Lua 开发环境配置
|
||||
require("neodev").setup({
|
||||
library = {
|
||||
plugins = { "nvim-dap-ui" },
|
||||
types = true,
|
||||
},
|
||||
})
|
||||
|
||||
-- 设置 mason-lspconfig
|
||||
require("mason").setup()
|
||||
|
||||
local ensure_installed = {} -- 要安装的服务器列表
|
||||
|
||||
-- 收集需要安装的服务器
|
||||
for server, server_opts in pairs(opts.servers) do
|
||||
if server_opts then
|
||||
server_opts = server_opts == true and {} or server_opts
|
||||
-- 将服务器添加到安装列表
|
||||
ensure_installed[#ensure_installed + 1] = server
|
||||
end
|
||||
end
|
||||
|
||||
-- 设置 mason-lspconfig
|
||||
require("mason-lspconfig").setup({
|
||||
ensure_installed = vim.tbl_keys(ensure_installed),
|
||||
automatic_installation = true,
|
||||
})
|
||||
|
||||
-- 设置工具安装程序
|
||||
require("mason-tool-installer").setup({
|
||||
ensure_installed = {
|
||||
-- Python 工具
|
||||
"black",
|
||||
"isort",
|
||||
"mypy",
|
||||
"ruff",
|
||||
"debugpy",
|
||||
|
||||
-- Go 工具
|
||||
"gofumpt",
|
||||
"goimports",
|
||||
"golangci-lint",
|
||||
"delve",
|
||||
|
||||
-- 通用工具
|
||||
"stylua",
|
||||
"shfmt",
|
||||
},
|
||||
})
|
||||
|
||||
-- 启动服务器
|
||||
require("mason-lspconfig").setup_handlers({
|
||||
function(server)
|
||||
local server_opts = vim.tbl_deep_extend("force", {
|
||||
capabilities = vim.deepcopy(capabilities),
|
||||
}, opts.servers[server] or {})
|
||||
|
||||
-- 特殊设置钩子
|
||||
if opts.setup[server] then
|
||||
if opts.setup[server](server, server_opts) then
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- 启动服务器
|
||||
require("lspconfig")[server].setup(server_opts)
|
||||
end,
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- 自动完成
|
||||
{
|
||||
"hrsh7th/nvim-cmp",
|
||||
version = false,
|
||||
event = "InsertEnter",
|
||||
dependencies = {
|
||||
"hrsh7th/cmp-nvim-lsp",
|
||||
"hrsh7th/cmp-buffer",
|
||||
"hrsh7th/cmp-path",
|
||||
"saadparwaiz1/cmp_luasnip",
|
||||
"hrsh7th/cmp-cmdline",
|
||||
},
|
||||
opts = function()
|
||||
vim.api.nvim_set_hl(0, "CmpGhostText", { link = "Comment", default = true })
|
||||
local cmp = require("cmp")
|
||||
local luasnip = require("luasnip")
|
||||
|
||||
local function has_words_before()
|
||||
unpack = unpack or table.unpack
|
||||
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
|
||||
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
|
||||
end
|
||||
|
||||
return {
|
||||
completion = {
|
||||
completeopt = "menu,menuone,noinsert",
|
||||
},
|
||||
snippet = {
|
||||
expand = function(args)
|
||||
luasnip.lsp_expand(args.body)
|
||||
end,
|
||||
},
|
||||
mapping = cmp.mapping.preset.insert({
|
||||
["<C-n>"] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }),
|
||||
["<C-p>"] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }),
|
||||
["<C-b>"] = cmp.mapping.scroll_docs(-4),
|
||||
["<C-f>"] = cmp.mapping.scroll_docs(4),
|
||||
["<C-Space>"] = cmp.mapping.complete(),
|
||||
["<C-e>"] = cmp.mapping.abort(),
|
||||
["<CR>"] = cmp.mapping.confirm({ select = true }),
|
||||
["<S-CR>"] = cmp.mapping.confirm({
|
||||
behavior = cmp.ConfirmBehavior.Replace,
|
||||
select = true,
|
||||
}),
|
||||
["<Tab>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_next_item()
|
||||
elseif luasnip.expand_or_jumpable() then
|
||||
luasnip.expand_or_jump()
|
||||
elseif has_words_before() then
|
||||
cmp.complete()
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, { "i", "s" }),
|
||||
["<S-Tab>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_prev_item()
|
||||
elseif luasnip.jumpable(-1) then
|
||||
luasnip.jump(-1)
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, { "i", "s" }),
|
||||
}),
|
||||
sources = cmp.config.sources({
|
||||
{ name = "nvim_lsp", priority = 1000 },
|
||||
{ name = "luasnip", priority = 750 },
|
||||
{ name = "buffer", priority = 500 },
|
||||
{ name = "path", priority = 250 },
|
||||
}),
|
||||
formatting = {
|
||||
format = function(entry, vim_item)
|
||||
-- 添加源信息
|
||||
vim_item.menu = ({
|
||||
nvim_lsp = "[LSP]",
|
||||
luasnip = "[Snip]",
|
||||
buffer = "[Buf]",
|
||||
path = "[Path]",
|
||||
})[entry.source.name]
|
||||
|
||||
-- 设置最大宽度
|
||||
local MAX_LABEL_WIDTH = 50
|
||||
if #vim_item.abbr > MAX_LABEL_WIDTH then
|
||||
vim_item.abbr = vim_item.abbr:sub(1, MAX_LABEL_WIDTH) .. "..."
|
||||
end
|
||||
|
||||
return vim_item
|
||||
end,
|
||||
},
|
||||
experimental = {
|
||||
ghost_text = {
|
||||
hl_group = "CmpGhostText",
|
||||
},
|
||||
},
|
||||
}
|
||||
end,
|
||||
config = function(_, opts)
|
||||
-- 设置 nvim-cmp
|
||||
local cmp = require("cmp")
|
||||
cmp.setup(opts)
|
||||
|
||||
-- 为命令行设置完成
|
||||
cmp.setup.cmdline(":", {
|
||||
mapping = cmp.mapping.preset.cmdline(),
|
||||
sources = cmp.config.sources({
|
||||
{ name = "path" },
|
||||
{ name = "cmdline" },
|
||||
}),
|
||||
})
|
||||
|
||||
-- 为搜索设置完成
|
||||
cmp.setup.cmdline("/", {
|
||||
mapping = cmp.mapping.preset.cmdline(),
|
||||
sources = cmp.config.sources({
|
||||
{ name = "buffer" },
|
||||
}),
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- 代码格式化和 Linting
|
||||
{
|
||||
"stevearc/conform.nvim",
|
||||
event = { "BufReadPre", "BufNewFile" },
|
||||
cmd = { "ConformInfo" },
|
||||
keys = {
|
||||
{
|
||||
"<leader>cf",
|
||||
function()
|
||||
require("conform").format({ lsp_fallback = true, async = false })
|
||||
end,
|
||||
mode = { "n", "v" },
|
||||
desc = "格式化代码",
|
||||
},
|
||||
},
|
||||
opts = {
|
||||
formatters_by_ft = {
|
||||
lua = { "stylua" },
|
||||
python = { "isort", "black" },
|
||||
go = { "goimports", "gofumpt" },
|
||||
javascript = { "prettierd" },
|
||||
typescript = { "prettierd" },
|
||||
javascriptreact = { "prettierd" },
|
||||
typescriptreact = { "prettierd" },
|
||||
json = { "prettierd" },
|
||||
html = { "prettierd" },
|
||||
css = { "prettierd" },
|
||||
yaml = { "prettierd" },
|
||||
markdown = { "prettierd" },
|
||||
sh = { "shfmt" },
|
||||
},
|
||||
|
||||
-- 每个格式化工具的设置
|
||||
formatters = {
|
||||
black = {
|
||||
args = { "--line-length", "88", "--fast", "-" },
|
||||
},
|
||||
isort = {
|
||||
args = { "--stdout", "--profile", "black", "--line-length", "88", "-" },
|
||||
},
|
||||
stylua = {
|
||||
args = { "--indent-type", "Spaces", "--indent-width", "2", "-" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 保存时自动格式化
|
||||
format_on_save = function(bufnr)
|
||||
if vim.b[bufnr].disable_autoformat or vim.g.disable_autoformat then
|
||||
return
|
||||
end
|
||||
return { timeout_ms = 500, lsp_fallback = true }
|
||||
end,
|
||||
|
||||
-- 格式化超时时间
|
||||
format_after_save = function(bufnr)
|
||||
if vim.b[bufnr].disable_autoformat or vim.g.disable_autoformat then
|
||||
return
|
||||
end
|
||||
return { lsp_fallback = true }
|
||||
end,
|
||||
},
|
||||
init = function()
|
||||
-- 添加用户命令以切换格式化
|
||||
vim.api.nvim_create_user_command("FormatToggle", function(args)
|
||||
if args.bang then
|
||||
-- FormatToggle! 将为当前缓冲区切换格式化
|
||||
vim.b.disable_autoformat = not vim.b.disable_autoformat
|
||||
vim.notify(string.format("Buffer autoformatting %s", vim.b.disable_autoformat and "disabled" or "enabled"))
|
||||
else
|
||||
-- FormatToggle 将全局切换格式化
|
||||
vim.g.disable_autoformat = not vim.g.disable_autoformat
|
||||
vim.notify(string.format("Global autoformatting %s", vim.g.disable_autoformat and "disabled" or "enabled"))
|
||||
end
|
||||
end, { desc = "切换自动格式化", bang = true })
|
||||
end,
|
||||
},
|
||||
|
||||
-- 调试支持
|
||||
{
|
||||
"mfussenegger/nvim-dap",
|
||||
dependencies = {
|
||||
-- UI 相关
|
||||
{
|
||||
"rcarriga/nvim-dap-ui",
|
||||
keys = {
|
||||
{ "<leader>du", function() require("dapui").toggle() end, desc = "Dap UI" },
|
||||
},
|
||||
opts = {},
|
||||
config = function(_, opts)
|
||||
local dap = require("dap")
|
||||
local dapui = require("dapui")
|
||||
dapui.setup(opts)
|
||||
dap.listeners.after.event_initialized["dapui_config"] = function()
|
||||
dapui.open()
|
||||
end
|
||||
dap.listeners.before.event_terminated["dapui_config"] = function()
|
||||
dapui.close()
|
||||
end
|
||||
dap.listeners.before.event_exited["dapui_config"] = function()
|
||||
dapui.close()
|
||||
end
|
||||
end,
|
||||
},
|
||||
-- 虚拟文本支持
|
||||
{
|
||||
"theHamsta/nvim-dap-virtual-text",
|
||||
opts = {},
|
||||
},
|
||||
-- Python 调试支持
|
||||
{
|
||||
"mfussenegger/nvim-dap-python",
|
||||
config = function()
|
||||
local path = require("mason-registry").get_package("debugpy"):get_install_path()
|
||||
require("dap-python").setup(path .. "/venv/bin/python")
|
||||
end,
|
||||
},
|
||||
-- Go 调试支持
|
||||
{
|
||||
"leoluz/nvim-dap-go",
|
||||
config = true,
|
||||
},
|
||||
},
|
||||
keys = {
|
||||
{ "<leader>dB", function() require("dap").set_breakpoint(vim.fn.input('断点条件: ')) end, desc = "条件断点" },
|
||||
{ "<leader>db", function() require("dap").toggle_breakpoint() end, desc = "切换断点" },
|
||||
{ "<leader>dc", function() require("dap").continue() end, desc = "继续执行" },
|
||||
{ "<leader>da", function() require("dap").continue({ before = get_args }) end, desc = "带参数运行" },
|
||||
{ "<leader>dC", function() require("dap").run_to_cursor() end, desc = "运行到光标处" },
|
||||
{ "<leader>dg", function() require("dap").goto_() end, desc = "跳转到行" },
|
||||
{ "<leader>di", function() require("dap").step_into() end, desc = "单步进入" },
|
||||
{ "<leader>dj", function() require("dap").down() end, desc = "下栈帧" },
|
||||
{ "<leader>dk", function() require("dap").up() end, desc = "上栈帧" },
|
||||
{ "<leader>dl", function() require("dap").run_last() end, desc = "运行最后的配置" },
|
||||
{ "<leader>do", function() require("dap").step_out() end, desc = "单步跳出" },
|
||||
{ "<leader>dO", function() require("dap").step_over() end, desc = "单步跳过" },
|
||||
{ "<leader>dp", function() require("dap").pause() end, desc = "暂停执行" },
|
||||
{ "<leader>dr", function() require("dap").repl.toggle() end, desc = "切换 REPL" },
|
||||
{ "<leader>ds", function() require("dap").session() end, desc = "获取会话" },
|
||||
{ "<leader>dt", function() require("dap").terminate() end, desc = "终止调试" },
|
||||
{ "<leader>dw", function() require("dap.ui.widgets").hover() end, desc = "小部件" },
|
||||
},
|
||||
config = function()
|
||||
local icons = {
|
||||
dap = {
|
||||
Stopped = { " ", "DiagnosticWarn", "DapStoppedLine" },
|
||||
Breakpoint = " ",
|
||||
BreakpointCondition = " ",
|
||||
BreakpointRejected = { " ", "DiagnosticError" },
|
||||
LogPoint = ".>",
|
||||
},
|
||||
}
|
||||
|
||||
vim.api.nvim_set_hl(0, "DapStoppedLine", { default = true, link = "Visual" })
|
||||
|
||||
for name, sign in pairs(icons.dap) do
|
||||
sign = type(sign) == "table" and sign or { sign }
|
||||
vim.fn.sign_define(
|
||||
"Dap" .. name,
|
||||
{ text = sign[1], texthl = sign[2] or "DiagnosticInfo", linehl = sign[3], numhl = sign[3] }
|
||||
)
|
||||
end
|
||||
end,
|
||||
},
|
||||
|
||||
-- 问题检测器
|
||||
{
|
||||
"folke/trouble.nvim",
|
||||
cmd = { "TroubleToggle", "Trouble" },
|
||||
opts = {
|
||||
use_diagnostic_signs = true,
|
||||
action_keys = {
|
||||
close = "q",
|
||||
cancel = "<esc>",
|
||||
refresh = "r",
|
||||
jump = { "<cr>", "<tab>", "<2-leftmouse>" },
|
||||
open_split = { "<c-s>" },
|
||||
open_vsplit = { "<c-v>" },
|
||||
open_tab = { "<c-t>" },
|
||||
jump_close = { "o" },
|
||||
toggle_mode = "m",
|
||||
switch_severity = "s",
|
||||
toggle_preview = "P",
|
||||
hover = "K",
|
||||
preview = "p",
|
||||
close_folds = { "zM", "zm" },
|
||||
open_folds = { "zR", "zr" },
|
||||
toggle_fold = { "zA", "za" },
|
||||
previous = "k",
|
||||
next = "j",
|
||||
help = "?",
|
||||
},
|
||||
},
|
||||
keys = {
|
||||
{ "<leader>xx", "<cmd>TroubleToggle document_diagnostics<cr>", desc = "文档诊断" },
|
||||
{ "<leader>xX", "<cmd>TroubleToggle workspace_diagnostics<cr>", desc = "工作区诊断" },
|
||||
{ "<leader>xL", "<cmd>TroubleToggle loclist<cr>", desc = "位置列表" },
|
||||
{ "<leader>xQ", "<cmd>TroubleToggle quickfix<cr>", desc = "快速修复" },
|
||||
{
|
||||
"[q",
|
||||
function()
|
||||
if require("trouble").is_open() then
|
||||
require("trouble").previous({ skip_groups = true, jump = true })
|
||||
else
|
||||
local ok, err = pcall(vim.cmd.cprev)
|
||||
if not ok then
|
||||
vim.notify(err, vim.log.levels.ERROR)
|
||||
end
|
||||
end
|
||||
end,
|
||||
desc = "上一个问题",
|
||||
},
|
||||
{
|
||||
"]q",
|
||||
function()
|
||||
if require("trouble").is_open() then
|
||||
require("trouble").next({ skip_groups = true, jump = true })
|
||||
else
|
||||
local ok, err = pcall(vim.cmd.cnext)
|
||||
if not ok then
|
||||
vim.notify(err, vim.log.levels.ERROR)
|
||||
end
|
||||
end
|
||||
end,
|
||||
desc = "下一个问题",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
101
nvim/lua/plugins/colorscheme.lua
Normal file
101
nvim/lua/plugins/colorscheme.lua
Normal file
@@ -0,0 +1,101 @@
|
||||
-- colorscheme.lua - 主题配置
|
||||
|
||||
return {
|
||||
-- 主题:Tokyo Night
|
||||
{
|
||||
"folke/tokyonight.nvim",
|
||||
lazy = false, -- 不延迟加载主题
|
||||
priority = 1000, -- 确保先加载主题
|
||||
config = function()
|
||||
require("tokyonight").setup({
|
||||
style = "night", -- 可选值:"storm", "moon", "night", "day"
|
||||
transparent = false, -- 启用背景透明
|
||||
terminal_colors = true, -- 设置终端颜色
|
||||
styles = {
|
||||
comments = { italic = true },
|
||||
keywords = { italic = true },
|
||||
functions = {},
|
||||
variables = {},
|
||||
sidebars = "dark",
|
||||
floats = "dark",
|
||||
},
|
||||
sidebars = { "qf", "help", "terminal", "packer", "NvimTree", "Trouble" },
|
||||
dim_inactive = false, -- 非活动窗口变暗
|
||||
lualine_bold = true, -- 在状态栏中使用粗体
|
||||
|
||||
on_highlights = function(hl, c)
|
||||
-- 自定义高亮组
|
||||
hl.CursorLineNr = { fg = c.orange, bold = true }
|
||||
hl.LineNr = { fg = c.orange, bold = false }
|
||||
hl.LineNrAbove = { fg = c.fg_gutter }
|
||||
hl.LineNrBelow = { fg = c.fg_gutter }
|
||||
|
||||
-- 浮动窗口
|
||||
hl.NormalFloat = { bg = c.bg_dark }
|
||||
hl.FloatBorder = { bg = c.bg_dark, fg = c.blue }
|
||||
end,
|
||||
})
|
||||
|
||||
-- 加载主题
|
||||
vim.cmd.colorscheme("tokyonight")
|
||||
end
|
||||
},
|
||||
|
||||
-- 替代主题:Catppuccin
|
||||
{
|
||||
"catppuccin/nvim",
|
||||
name = "catppuccin",
|
||||
lazy = true, -- 懒加载此主题
|
||||
opts = {
|
||||
flavour = "mocha", -- 风格: latte, frappe, macchiato, mocha
|
||||
term_colors = true,
|
||||
transparent_background = false,
|
||||
styles = {
|
||||
comments = { "italic" },
|
||||
conditionals = { "italic" },
|
||||
loops = {},
|
||||
functions = {},
|
||||
keywords = {},
|
||||
strings = {},
|
||||
variables = {},
|
||||
numbers = {},
|
||||
booleans = {},
|
||||
properties = {},
|
||||
types = {},
|
||||
operators = {},
|
||||
},
|
||||
integrations = {
|
||||
cmp = true,
|
||||
gitsigns = true,
|
||||
nvimtree = true,
|
||||
treesitter = true,
|
||||
mason = true,
|
||||
telescope = {
|
||||
enabled = true,
|
||||
style = "nvchad",
|
||||
},
|
||||
native_lsp = {
|
||||
enabled = true,
|
||||
virtual_text = {
|
||||
errors = { "italic" },
|
||||
hints = { "italic" },
|
||||
warnings = { "italic" },
|
||||
information = { "italic" },
|
||||
},
|
||||
underlines = {
|
||||
errors = { "underline" },
|
||||
hints = { "underline" },
|
||||
warnings = { "underline" },
|
||||
information = { "underline" },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 图标支持
|
||||
{
|
||||
"nvim-tree/nvim-web-devicons",
|
||||
lazy = true,
|
||||
},
|
||||
}
|
||||
23
nvim/lua/plugins/dap.lua
Normal file
23
nvim/lua/plugins/dap.lua
Normal file
@@ -0,0 +1,23 @@
|
||||
-- dap.lua - 调试支持
|
||||
return {
|
||||
{
|
||||
"mfussenegger/nvim-dap",
|
||||
event = "VeryLazy",
|
||||
},
|
||||
{
|
||||
"leoluz/nvim-dap-go",
|
||||
ft = "go",
|
||||
dependencies = { "mfussenegger/nvim-dap" },
|
||||
config = function()
|
||||
require("dap-go").setup()
|
||||
end,
|
||||
},
|
||||
{
|
||||
"mfussenegger/nvim-dap-python",
|
||||
ft = "python",
|
||||
dependencies = { "mfussenegger/nvim-dap" },
|
||||
config = function()
|
||||
require("dap-python").setup("python")
|
||||
end,
|
||||
},
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
return {
|
||||
-- disable the plugins
|
||||
}
|
||||
516
nvim/lua/plugins/editor.lua
Normal file
516
nvim/lua/plugins/editor.lua
Normal file
@@ -0,0 +1,516 @@
|
||||
-- editor.lua - 编辑器增强插件配置
|
||||
|
||||
return {
|
||||
-- 模糊搜索
|
||||
{
|
||||
"nvim-telescope/telescope.nvim",
|
||||
cmd = "Telescope",
|
||||
version = false,
|
||||
dependencies = {
|
||||
"nvim-lua/plenary.nvim",
|
||||
{
|
||||
"nvim-telescope/telescope-fzf-native.nvim",
|
||||
build = "make",
|
||||
enabled = vim.fn.executable("make") == 1,
|
||||
},
|
||||
},
|
||||
keys = {
|
||||
-- 文件查找
|
||||
{ "<leader>ff", "<cmd>Telescope find_files<cr>", desc = "查找文件" },
|
||||
{ "<leader>fr", "<cmd>Telescope oldfiles<cr>", desc = "最近文件" },
|
||||
{ "<leader>fb", "<cmd>Telescope buffers<cr>", desc = "查找缓冲区" },
|
||||
|
||||
-- 内容搜索
|
||||
{ "<leader>fg", "<cmd>Telescope live_grep<cr>", desc = "全局搜索" },
|
||||
{ "<leader>fw", "<cmd>Telescope grep_string<cr>", desc = "搜索当前单词" },
|
||||
|
||||
-- 其他功能
|
||||
{ "<leader>fh", "<cmd>Telescope help_tags<cr>", desc = "帮助标签" },
|
||||
{ "<leader>fm", "<cmd>Telescope marks<cr>", desc = "跳转到书签" },
|
||||
{ "<leader>fc", "<cmd>Telescope commands<cr>", desc = "命令" },
|
||||
{ "<leader>fk", "<cmd>Telescope keymaps<cr>", desc = "快捷键" },
|
||||
|
||||
-- 工作区相关
|
||||
{ "<leader>ws", "<cmd>Telescope lsp_workspace_symbols<cr>", desc = "工作区符号" },
|
||||
|
||||
-- LSP 相关
|
||||
{ "<leader>cs", "<cmd>Telescope lsp_document_symbols<cr>", desc = "文档符号" },
|
||||
{ "<leader>cr", "<cmd>Telescope lsp_references<cr>", desc = "引用" },
|
||||
{ "<leader>ci", "<cmd>Telescope lsp_implementations<cr>", desc = "实现" },
|
||||
{ "<leader>cd", "<cmd>Telescope lsp_definitions<cr>", desc = "定义" },
|
||||
{ "<leader>ct", "<cmd>Telescope lsp_type_definitions<cr>", desc = "类型定义" },
|
||||
|
||||
-- 诊断
|
||||
{ "<leader>xx", "<cmd>Telescope diagnostics bufnr=0<cr>", desc = "当前文件诊断" },
|
||||
{ "<leader>xw", "<cmd>Telescope diagnostics<cr>", desc = "工作区诊断" },
|
||||
},
|
||||
opts = {
|
||||
defaults = {
|
||||
prompt_prefix = " ",
|
||||
selection_caret = " ",
|
||||
mappings = {
|
||||
i = {
|
||||
["<C-j>"] = function(...)
|
||||
return require("telescope.actions").move_selection_next(...)
|
||||
end,
|
||||
["<C-k>"] = function(...)
|
||||
return require("telescope.actions").move_selection_previous(...)
|
||||
end,
|
||||
["<C-n>"] = function(...)
|
||||
return require("telescope.actions").cycle_history_next(...)
|
||||
end,
|
||||
["<C-p>"] = function(...)
|
||||
return require("telescope.actions").cycle_history_prev(...)
|
||||
end,
|
||||
["<C-c>"] = function(...)
|
||||
return require("telescope.actions").close(...)
|
||||
end,
|
||||
["<C-u>"] = function(...)
|
||||
return require("telescope.actions").preview_scrolling_up(...)
|
||||
end,
|
||||
["<C-d>"] = function(...)
|
||||
return require("telescope.actions").preview_scrolling_down(...)
|
||||
end,
|
||||
},
|
||||
n = {
|
||||
["q"] = function(...)
|
||||
return require("telescope.actions").close(...)
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
pickers = {
|
||||
find_files = {
|
||||
-- 默认包含隐藏文件
|
||||
find_command = { "rg", "--files", "--hidden", "--glob", "!.git" },
|
||||
},
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
local telescope = require("telescope")
|
||||
telescope.setup(opts)
|
||||
|
||||
-- 加载扩展
|
||||
pcall(telescope.load_extension, "fzf")
|
||||
end,
|
||||
},
|
||||
|
||||
-- 高级语法高亮
|
||||
{
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
build = ":TSUpdate",
|
||||
event = { "BufReadPost", "BufNewFile" },
|
||||
dependencies = {
|
||||
"nvim-treesitter/nvim-treesitter-textobjects",
|
||||
},
|
||||
opts = {
|
||||
-- 自动安装的语法
|
||||
ensure_installed = {
|
||||
"bash",
|
||||
"c",
|
||||
"cmake",
|
||||
"comment",
|
||||
"cpp",
|
||||
"css",
|
||||
"dockerfile",
|
||||
"gitignore",
|
||||
"go",
|
||||
"gomod",
|
||||
"gowork",
|
||||
"html",
|
||||
"http",
|
||||
"java",
|
||||
"javascript",
|
||||
"json",
|
||||
"kotlin",
|
||||
"lua",
|
||||
"make",
|
||||
"markdown",
|
||||
"markdown_inline",
|
||||
"python",
|
||||
"regex",
|
||||
"ruby",
|
||||
"rust",
|
||||
"sql",
|
||||
"toml",
|
||||
"tsx",
|
||||
"typescript",
|
||||
"vim",
|
||||
"vimdoc",
|
||||
"xml",
|
||||
"yaml",
|
||||
},
|
||||
|
||||
-- 启用特性
|
||||
highlight = { enable = true },
|
||||
indent = { enable = true },
|
||||
incremental_selection = {
|
||||
enable = true,
|
||||
keymaps = {
|
||||
init_selection = "<C-space>",
|
||||
node_incremental = "<C-space>",
|
||||
scope_incremental = false,
|
||||
node_decremental = "<bs>",
|
||||
},
|
||||
},
|
||||
|
||||
-- 文本对象
|
||||
textobjects = {
|
||||
select = {
|
||||
enable = true,
|
||||
lookahead = true,
|
||||
keymaps = {
|
||||
["af"] = "@function.outer",
|
||||
["if"] = "@function.inner",
|
||||
["ac"] = "@class.outer",
|
||||
["ic"] = "@class.inner",
|
||||
["aa"] = "@parameter.outer",
|
||||
["ia"] = "@parameter.inner",
|
||||
},
|
||||
},
|
||||
move = {
|
||||
enable = true,
|
||||
set_jumps = true,
|
||||
goto_next_start = {
|
||||
["]f"] = "@function.outer",
|
||||
["]c"] = "@class.outer",
|
||||
},
|
||||
goto_next_end = {
|
||||
["]F"] = "@function.outer",
|
||||
["]C"] = "@class.outer",
|
||||
},
|
||||
goto_previous_start = {
|
||||
["[f"] = "@function.outer",
|
||||
["[c"] = "@class.outer",
|
||||
},
|
||||
goto_previous_end = {
|
||||
["[F"] = "@function.outer",
|
||||
["[C"] = "@class.outer",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
require("nvim-treesitter.configs").setup(opts)
|
||||
end,
|
||||
},
|
||||
|
||||
-- 代码注释
|
||||
{
|
||||
"numToStr/Comment.nvim",
|
||||
opts = {
|
||||
padding = true, -- 在注释分隔符后添加空格
|
||||
sticky = true, -- 注释时光标不移动
|
||||
toggler = {
|
||||
line = "gcc", -- 行注释切换
|
||||
block = "gbc", -- 块注释切换
|
||||
},
|
||||
opleader = {
|
||||
line = "gc", -- 行注释操作
|
||||
block = "gb", -- 块注释操作
|
||||
},
|
||||
extra = {
|
||||
above = "gcO", -- 在当前行上方添加注释
|
||||
below = "gco", -- 在当前行下方添加注释
|
||||
eol = "gcA", -- 在当前行尾添加注释
|
||||
},
|
||||
mappings = {
|
||||
basic = true, -- 基本映射
|
||||
extra = true, -- 额外映射
|
||||
},
|
||||
},
|
||||
keys = {
|
||||
{ "gcc", mode = "n", desc = "行注释" },
|
||||
{ "gbc", mode = "n", desc = "块注释" },
|
||||
{ "gc", mode = { "n", "o" }, desc = "行注释操作" },
|
||||
{ "gb", mode = { "n", "o" }, desc = "块注释操作" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 代码折叠
|
||||
{
|
||||
"kevinhwang91/nvim-ufo",
|
||||
dependencies = {
|
||||
"kevinhwang91/promise-async",
|
||||
{
|
||||
"luukvbaal/statuscol.nvim",
|
||||
config = function()
|
||||
local builtin = require("statuscol.builtin")
|
||||
require("statuscol").setup({
|
||||
relculright = true,
|
||||
segments = {
|
||||
{ text = { builtin.foldfunc }, click = "v:lua.ScFa" },
|
||||
{ text = { "%s" }, click = "v:lua.ScSa" },
|
||||
{ text = { builtin.lnumfunc, " " }, click = "v:lua.ScLa" },
|
||||
},
|
||||
})
|
||||
end,
|
||||
},
|
||||
},
|
||||
event = "BufReadPost",
|
||||
opts = {
|
||||
provider_selector = function()
|
||||
return { "treesitter", "indent" }
|
||||
end,
|
||||
open_fold_hl_timeout = 150,
|
||||
close_fold_kinds_for_ft = {
|
||||
default = { "imports", "comment" },
|
||||
json = { "array" },
|
||||
yaml = { "sequence" },
|
||||
},
|
||||
preview = {
|
||||
win_config = {
|
||||
border = { "", "─", "", "", "", "─", "", "" },
|
||||
winhighlight = "Normal:Folded",
|
||||
winblend = 0,
|
||||
},
|
||||
mappings = {
|
||||
scrollU = "<C-u>",
|
||||
scrollD = "<C-d>",
|
||||
jumpTop = "[",
|
||||
jumpBot = "]",
|
||||
},
|
||||
},
|
||||
},
|
||||
init = function()
|
||||
vim.o.foldcolumn = "0"
|
||||
vim.o.foldlevel = 99
|
||||
vim.o.foldlevelstart = 99
|
||||
vim.o.foldenable = true
|
||||
end,
|
||||
keys = {
|
||||
{ "zR", function() require("ufo").openAllFolds() end, desc = "打开所有折叠" },
|
||||
{ "zM", function() require("ufo").closeAllFolds() end, desc = "关闭所有折叠" },
|
||||
{ "zr", function() require("ufo").openFoldsExceptKinds() end, desc = "打开一级折叠" },
|
||||
{ "zm", function() require("ufo").closeFoldsWith() end, desc = "关闭一级折叠" },
|
||||
{ "zp", function() require("ufo").peekFoldedLinesUnderCursor() end, desc = "预览当前折叠" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 终端集成
|
||||
{
|
||||
"akinsho/toggleterm.nvim",
|
||||
version = "*",
|
||||
keys = {
|
||||
{ "<leader>tf", "<cmd>ToggleTerm direction=float<cr>", desc = "浮动终端" },
|
||||
{ "<leader>th", "<cmd>ToggleTerm direction=horizontal<cr>", desc = "水平终端" },
|
||||
{ "<leader>tv", "<cmd>ToggleTerm direction=vertical size=40<cr>", desc = "垂直终端" },
|
||||
{ "<leader>tt", "<cmd>ToggleTerm<cr>", desc = "切换终端" },
|
||||
},
|
||||
opts = {
|
||||
size = function(term)
|
||||
if term.direction == "horizontal" then
|
||||
return 15
|
||||
elseif term.direction == "vertical" then
|
||||
return vim.o.columns * 0.4
|
||||
end
|
||||
end,
|
||||
open_mapping = [[<c-\>]],
|
||||
hide_numbers = true,
|
||||
shade_filetypes = {},
|
||||
autochdir = true,
|
||||
shade_terminals = true,
|
||||
shading_factor = 2,
|
||||
start_in_insert = true,
|
||||
insert_mappings = true,
|
||||
terminal_mappings = true,
|
||||
persist_size = true,
|
||||
persist_mode = true,
|
||||
direction = "float",
|
||||
close_on_exit = true,
|
||||
shell = vim.o.shell,
|
||||
float_opts = {
|
||||
border = "curved",
|
||||
winblend = 3,
|
||||
highlights = {
|
||||
border = "Normal",
|
||||
background = "Normal",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 代码片段
|
||||
{
|
||||
"L3MON4D3/LuaSnip",
|
||||
dependencies = {
|
||||
"rafamadriz/friendly-snippets",
|
||||
config = function()
|
||||
require("luasnip.loaders.from_vscode").lazy_load()
|
||||
end,
|
||||
},
|
||||
opts = {
|
||||
history = true,
|
||||
delete_check_events = "TextChanged",
|
||||
},
|
||||
keys = {
|
||||
{
|
||||
"<tab>",
|
||||
function()
|
||||
return require("luasnip").jumpable(1) and "<Plug>luasnip-jump-next" or "<tab>"
|
||||
end,
|
||||
expr = true, silent = true, mode = "i",
|
||||
},
|
||||
{ "<tab>", function() require("luasnip").jump(1) end, mode = "s" },
|
||||
{ "<s-tab>", function() require("luasnip").jump(-1) end, mode = { "i", "s" } },
|
||||
},
|
||||
},
|
||||
|
||||
-- 自动括号配对
|
||||
{
|
||||
"windwp/nvim-autopairs",
|
||||
event = "InsertEnter",
|
||||
opts = {
|
||||
check_ts = true, -- 检查 treesitter
|
||||
ts_config = {
|
||||
lua = { "string", "source" },
|
||||
javascript = { "string", "template_string" },
|
||||
java = false,
|
||||
},
|
||||
fast_wrap = {
|
||||
map = "<M-e>",
|
||||
chars = { "{", "[", "(", '"', "'" },
|
||||
pattern = string.gsub([[ [%'%"%)%>%]%)%}%,] ]], "%s+", ""),
|
||||
offset = 0,
|
||||
end_key = "$",
|
||||
keys = "qwertyuiopzxcvbnmasdfghjkl",
|
||||
check_comma = true,
|
||||
highlight = "PmenuSel",
|
||||
highlight_grey = "LineNr",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- Git 集成
|
||||
{
|
||||
"lewis6991/gitsigns.nvim",
|
||||
event = { "BufReadPre", "BufNewFile" },
|
||||
opts = {
|
||||
signs = {
|
||||
add = { text = "▎" },
|
||||
change = { text = "▎" },
|
||||
delete = { text = "▁" },
|
||||
topdelete = { text = "▔" },
|
||||
changedelete = { text = "▎" },
|
||||
untracked = { text = "▎" },
|
||||
},
|
||||
on_attach = function(buffer)
|
||||
local gs = package.loaded.gitsigns
|
||||
|
||||
local function map(mode, l, r, desc)
|
||||
vim.keymap.set(mode, l, r, { buffer = buffer, desc = desc })
|
||||
end
|
||||
|
||||
-- 导航
|
||||
map("n", "]h", gs.next_hunk, "下一个变更")
|
||||
map("n", "[h", gs.prev_hunk, "上一个变更")
|
||||
|
||||
-- 操作
|
||||
map({ "n", "v" }, "<leader>gs", ":Gitsigns stage_hunk<CR>", "暂存变更")
|
||||
map({ "n", "v" }, "<leader>gr", ":Gitsigns reset_hunk<CR>", "重置变更")
|
||||
map("n", "<leader>gS", gs.stage_buffer, "暂存文件")
|
||||
map("n", "<leader>gu", gs.undo_stage_hunk, "取消暂存变更")
|
||||
map("n", "<leader>gR", gs.reset_buffer, "重置文件")
|
||||
map("n", "<leader>gp", gs.preview_hunk, "预览变更")
|
||||
map("n", "<leader>gb", function() gs.blame_line({ full = true }) end, "查看责任")
|
||||
map("n", "<leader>gB", gs.toggle_current_line_blame, "开关行责任")
|
||||
map("n", "<leader>gd", gs.diffthis, "文件差异")
|
||||
map("n", "<leader>gD", function() gs.diffthis("~") end, "与HEAD差异")
|
||||
map("n", "<leader>gt", gs.toggle_deleted, "开关显示删除")
|
||||
|
||||
-- 文本对象
|
||||
map({ "o", "x" }, "ih", ":<C-U>Gitsigns select_hunk<CR>", "选择变更")
|
||||
end,
|
||||
},
|
||||
},
|
||||
|
||||
-- 多光标编辑
|
||||
{
|
||||
"mg979/vim-visual-multi",
|
||||
event = "BufReadPost",
|
||||
init = function()
|
||||
vim.g.VM_leader = ";"
|
||||
vim.g.VM_maps = {
|
||||
["Find Under"] = "<C-d>",
|
||||
["Find Subword Under"] = "<C-d>",
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
-- 高亮相同单词
|
||||
{
|
||||
"RRethy/vim-illuminate",
|
||||
event = "BufReadPost",
|
||||
opts = {
|
||||
delay = 200,
|
||||
large_file_cutoff = 2000,
|
||||
large_file_overrides = {
|
||||
providers = { "lsp" },
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
require("illuminate").configure(opts)
|
||||
|
||||
local function map(key, dir, buffer)
|
||||
vim.keymap.set("n", key, function()
|
||||
require("illuminate")["goto_" .. dir .. "_reference"](false)
|
||||
end, { desc = dir:sub(1, 1):upper() .. dir:sub(2) .. " 引用", buffer = buffer })
|
||||
end
|
||||
|
||||
-- 下一个/上一个引用导航
|
||||
map("]]", "next")
|
||||
map("[[", "prev")
|
||||
|
||||
-- 同时也是 LSP 附加时设置键绑定
|
||||
vim.api.nvim_create_autocmd("LspAttach", {
|
||||
callback = function(args)
|
||||
local buffer = args.buf
|
||||
map("]]", "next", buffer)
|
||||
map("[[", "prev", buffer)
|
||||
end,
|
||||
})
|
||||
end,
|
||||
keys = {
|
||||
{ "]]", desc = "下一个引用" },
|
||||
{ "[[", desc = "上一个引用" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 缓冲区删除
|
||||
{
|
||||
"echasnovski/mini.bufremove",
|
||||
keys = {
|
||||
{ "<leader>bd", function() require("mini.bufremove").delete(0, false) end, desc = "删除缓冲区" },
|
||||
{ "<leader>bD", function() require("mini.bufremove").delete(0, true) end, desc = "强制删除缓冲区" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 括号高亮配对
|
||||
{
|
||||
"HiPhish/rainbow-delimiters.nvim",
|
||||
event = "BufReadPost",
|
||||
config = function()
|
||||
local rainbow_delimiters = require("rainbow-delimiters")
|
||||
|
||||
vim.g.rainbow_delimiters = {
|
||||
strategy = {
|
||||
[""] = rainbow_delimiters.strategy["global"],
|
||||
vim = rainbow_delimiters.strategy["local"],
|
||||
},
|
||||
query = {
|
||||
[""] = "rainbow-delimiters",
|
||||
lua = "rainbow-blocks",
|
||||
},
|
||||
highlight = {
|
||||
"RainbowDelimiterRed",
|
||||
"RainbowDelimiterYellow",
|
||||
"RainbowDelimiterBlue",
|
||||
"RainbowDelimiterOrange",
|
||||
"RainbowDelimiterGreen",
|
||||
"RainbowDelimiterViolet",
|
||||
"RainbowDelimiterCyan",
|
||||
},
|
||||
}
|
||||
end,
|
||||
},
|
||||
}
|
||||
@@ -1,197 +0,0 @@
|
||||
-- since this is just an example spec, don't actually load anything here and return an empty spec
|
||||
-- stylua: ignore
|
||||
if true then return {} end
|
||||
|
||||
-- every spec file under the "plugins" directory will be loaded automatically by lazy.nvim
|
||||
--
|
||||
-- In your plugin files, you can:
|
||||
-- * add extra plugins
|
||||
-- * disable/enabled LazyVim plugins
|
||||
-- * override the configuration of LazyVim plugins
|
||||
return {
|
||||
-- add gruvbox
|
||||
{ "ellisonleao/gruvbox.nvim" },
|
||||
|
||||
-- Configure LazyVim to load gruvbox
|
||||
{
|
||||
"LazyVim/LazyVim",
|
||||
opts = {
|
||||
colorscheme = "gruvbox",
|
||||
},
|
||||
},
|
||||
|
||||
-- change trouble config
|
||||
{
|
||||
"folke/trouble.nvim",
|
||||
-- opts will be merged with the parent spec
|
||||
opts = { use_diagnostic_signs = true },
|
||||
},
|
||||
|
||||
-- disable trouble
|
||||
{ "folke/trouble.nvim", enabled = false },
|
||||
|
||||
-- override nvim-cmp and add cmp-emoji
|
||||
{
|
||||
"hrsh7th/nvim-cmp",
|
||||
dependencies = { "hrsh7th/cmp-emoji" },
|
||||
---@param opts cmp.ConfigSchema
|
||||
opts = function(_, opts)
|
||||
table.insert(opts.sources, { name = "emoji" })
|
||||
end,
|
||||
},
|
||||
|
||||
-- change some telescope options and a keymap to browse plugin files
|
||||
{
|
||||
"nvim-telescope/telescope.nvim",
|
||||
keys = {
|
||||
-- add a keymap to browse plugin files
|
||||
-- stylua: ignore
|
||||
{
|
||||
"<leader>fp",
|
||||
function() require("telescope.builtin").find_files({ cwd = require("lazy.core.config").options.root }) end,
|
||||
desc = "Find Plugin File",
|
||||
},
|
||||
},
|
||||
-- change some options
|
||||
opts = {
|
||||
defaults = {
|
||||
layout_strategy = "horizontal",
|
||||
layout_config = { prompt_position = "top" },
|
||||
sorting_strategy = "ascending",
|
||||
winblend = 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- add pyright to lspconfig
|
||||
{
|
||||
"neovim/nvim-lspconfig",
|
||||
---@class PluginLspOpts
|
||||
opts = {
|
||||
---@type lspconfig.options
|
||||
servers = {
|
||||
-- pyright will be automatically installed with mason and loaded with lspconfig
|
||||
pyright = {},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- add tsserver and setup with typescript.nvim instead of lspconfig
|
||||
{
|
||||
"neovim/nvim-lspconfig",
|
||||
dependencies = {
|
||||
"jose-elias-alvarez/typescript.nvim",
|
||||
init = function()
|
||||
require("lazyvim.util").lsp.on_attach(function(_, buffer)
|
||||
-- stylua: ignore
|
||||
vim.keymap.set( "n", "<leader>co", "TypescriptOrganizeImports", { buffer = buffer, desc = "Organize Imports" })
|
||||
vim.keymap.set("n", "<leader>cR", "TypescriptRenameFile", { desc = "Rename File", buffer = buffer })
|
||||
end)
|
||||
end,
|
||||
},
|
||||
---@class PluginLspOpts
|
||||
opts = {
|
||||
---@type lspconfig.options
|
||||
servers = {
|
||||
-- tsserver will be automatically installed with mason and loaded with lspconfig
|
||||
tsserver = {},
|
||||
},
|
||||
-- you can do any additional lsp server setup here
|
||||
-- return true if you don't want this server to be setup with lspconfig
|
||||
---@type table<string, fun(server:string, opts:_.lspconfig.options):boolean?>
|
||||
setup = {
|
||||
-- example to setup with typescript.nvim
|
||||
tsserver = function(_, opts)
|
||||
require("typescript").setup({ server = opts })
|
||||
return true
|
||||
end,
|
||||
-- Specify * to use this function as a fallback for any server
|
||||
-- ["*"] = function(server, opts) end,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- for typescript, LazyVim also includes extra specs to properly setup lspconfig,
|
||||
-- treesitter, mason and typescript.nvim. So instead of the above, you can use:
|
||||
{ import = "lazyvim.plugins.extras.lang.typescript" },
|
||||
|
||||
-- add more treesitter parsers
|
||||
{
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
opts = {
|
||||
ensure_installed = {
|
||||
"bash",
|
||||
"html",
|
||||
"javascript",
|
||||
"json",
|
||||
"lua",
|
||||
"markdown",
|
||||
"markdown_inline",
|
||||
"python",
|
||||
"query",
|
||||
"regex",
|
||||
"tsx",
|
||||
"typescript",
|
||||
"vim",
|
||||
"yaml",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- since `vim.tbl_deep_extend`, can only merge tables and not lists, the code above
|
||||
-- would overwrite `ensure_installed` with the new value.
|
||||
-- If you'd rather extend the default config, use the code below instead:
|
||||
{
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
opts = function(_, opts)
|
||||
-- add tsx and treesitter
|
||||
vim.list_extend(opts.ensure_installed, {
|
||||
"tsx",
|
||||
"typescript",
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- the opts function can also be used to change the default opts:
|
||||
{
|
||||
"nvim-lualine/lualine.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = function(_, opts)
|
||||
table.insert(opts.sections.lualine_x, {
|
||||
function()
|
||||
return "😄"
|
||||
end,
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- or you can return new options to override all the defaults
|
||||
{
|
||||
"nvim-lualine/lualine.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = function()
|
||||
return {
|
||||
--[[add your custom lualine config here]]
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
-- use mini.starter instead of alpha
|
||||
{ import = "lazyvim.plugins.extras.ui.mini-starter" },
|
||||
|
||||
-- add jsonls and schemastore packages, and setup treesitter for json, json5 and jsonc
|
||||
{ import = "lazyvim.plugins.extras.lang.json" },
|
||||
|
||||
-- add any tools you want to have installed below
|
||||
{
|
||||
"williamboman/mason.nvim",
|
||||
opts = {
|
||||
ensure_installed = {
|
||||
"stylua",
|
||||
"shellcheck",
|
||||
"shfmt",
|
||||
"flake8",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
1
nvim/lua/plugins/flash.lua
Normal file
1
nvim/lua/plugins/flash.lua
Normal file
@@ -0,0 +1 @@
|
||||
return {"folke/flash.nvim", opts={}}
|
||||
285
nvim/lua/plugins/go.lua
Normal file
285
nvim/lua/plugins/go.lua
Normal file
@@ -0,0 +1,285 @@
|
||||
-- go.lua - Go 开发专用配置
|
||||
|
||||
return {
|
||||
-- Go 专用插件
|
||||
{
|
||||
"ray-x/go.nvim",
|
||||
dependencies = {
|
||||
"ray-x/guihua.lua",
|
||||
"neovim/nvim-lspconfig",
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
},
|
||||
ft = { "go", "gomod", "gowork", "gotmpl" },
|
||||
build = ':lua require("go.install").update_all_sync()', -- 同步更新所有解析器
|
||||
opts = {
|
||||
-- 日志级别: 可以是 'trace', 'debug', 'info', 'warn', 'error', 'fatal'
|
||||
lsp_cfg = {
|
||||
settings = {
|
||||
gopls = {
|
||||
gofumpt = true,
|
||||
codelenses = {
|
||||
gc_details = true,
|
||||
generate = true,
|
||||
regenerate_cgo = true,
|
||||
run_govulncheck = true,
|
||||
test = true,
|
||||
tidy = true,
|
||||
upgrade_dependency = true,
|
||||
vendor = true,
|
||||
},
|
||||
hints = {
|
||||
assignVariableTypes = true,
|
||||
compositeLiteralFields = true,
|
||||
constantValues = true,
|
||||
functionTypeParameters = true,
|
||||
parameterNames = true,
|
||||
rangeVariableTypes = true,
|
||||
},
|
||||
analyses = {
|
||||
fieldalignment = true,
|
||||
nilness = true,
|
||||
unusedparams = true,
|
||||
unusedwrite = true,
|
||||
useany = true,
|
||||
shadow = true,
|
||||
},
|
||||
usePlaceholders = true,
|
||||
completeUnimported = true,
|
||||
staticcheck = true,
|
||||
directoryFilters = { "-.git", "-.vscode", "-.idea", "-.vscode-test", "-node_modules" },
|
||||
semanticTokens = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
lsp_on_attach = function(client, bufnr)
|
||||
-- 启用自动格式化
|
||||
vim.api.nvim_buf_set_option(bufnr, "formatexpr", "v:lua.vim.lsp.formatexpr()")
|
||||
|
||||
-- 设置键映射
|
||||
local map = function(mode, lhs, rhs, desc)
|
||||
if desc then
|
||||
desc = desc
|
||||
end
|
||||
vim.keymap.set(mode, lhs, rhs, { silent = true, desc = desc, buffer = bufnr, noremap = true })
|
||||
end
|
||||
|
||||
-- Go 特定映射
|
||||
map("n", "<leader>gfs", "<cmd>GoFillStruct<cr>", "填充结构体")
|
||||
map("n", "<leader>gfa", "<cmd>GoAddTag<cr>", "添加标签")
|
||||
map("n", "<leader>gfr", "<cmd>GoRmTag<cr>", "移除标签")
|
||||
map("n", "<leader>gcl", "<cmd>GoClearTag<cr>", "清除标签")
|
||||
map("n", "<leader>ge", "<cmd>GoIfErr<cr>", "生成错误处理")
|
||||
|
||||
-- 代码生成
|
||||
map("n", "<leader>ggt", "<cmd>GoTest<cr>", "生成测试")
|
||||
map("n", "<leader>ggf", "<cmd>GoTestFunc<cr>", "生成函数测试")
|
||||
map("n", "<leader>ggc", "<cmd>GoCoverage<cr>", "显示测试覆盖率")
|
||||
map("n", "<leader>ggC", "<cmd>GoCoverageClear<cr>", "清除测试覆盖率")
|
||||
map("n", "<leader>ggb", "<cmd>GoBuild<cr>", "构建")
|
||||
map("n", "<leader>ggr", "<cmd>GoRun<cr>", "运行")
|
||||
|
||||
-- 代码操作
|
||||
map("n", "<leader>gil", "<cmd>GoImport<cr>", "导入包")
|
||||
map("n", "<leader>gia", "<cmd>GoImportAll<cr>", "导入所有")
|
||||
map("n", "<leader>gif", "<cmd>GoImpl<cr>", "实现接口")
|
||||
map("n", "<leader>gid", "<cmd>GoDoc<cr>", "查看文档")
|
||||
|
||||
-- 代码移动
|
||||
map("n", "<leader>gca", "<cmd>GoCodeAction<cr>", "代码操作")
|
||||
map("n", "<leader>gfd", "<cmd>GoFixDocumentation<cr>", "修复文档")
|
||||
map("n", "<leader>gsf", "<cmd>GoFillSwitch<cr>", "填充 switch")
|
||||
map("n", "<leader>gsj", "<cmd>GoAddErrCheck<cr>", "添加错误检查")
|
||||
|
||||
-- 调试和测试
|
||||
map("n", "<leader>gtc", "<cmd>GoCmt<cr>", "生成注释")
|
||||
map("n", "<leader>gts", "<cmd>GoAlt<cr>", "在实现和测试间切换")
|
||||
end,
|
||||
lsp_codelens = true,
|
||||
-- 控制 gopls 设置
|
||||
lsp_keymaps = false, -- 我们手动设置键映射
|
||||
lsp_diag_hdlr = true,
|
||||
lsp_diag_virtual_text = { space = 0, prefix = "" },
|
||||
lsp_diag_signs = true,
|
||||
lsp_diag_update_in_insert = false,
|
||||
lsp_document_formatting = true,
|
||||
-- 代码格式化设置
|
||||
formatter = "gofumpt", -- gofmt, gofumpt, golines
|
||||
formatter_extra_args = { "-s" },
|
||||
-- 测试设置
|
||||
test_runner = "go", -- richgo, go test, richgo, dlv, ginkgo
|
||||
run_in_floaterm = true,
|
||||
-- 调试设置
|
||||
dap_debug = true,
|
||||
dap_debug_gui = true,
|
||||
dap_debug_vt = true,
|
||||
dap_port = 38697,
|
||||
dap_timeout = 15,
|
||||
-- 其他设置
|
||||
textobjects = true,
|
||||
gofmt = true, -- 设置 gofmt 和 goimports
|
||||
goimport = "gopls", -- goimport, gopls
|
||||
diagnostic = {
|
||||
hdlr = true,
|
||||
underline = true,
|
||||
virtual_text = { space = 0, prefix = "" },
|
||||
signs = true,
|
||||
update_in_insert = false,
|
||||
},
|
||||
tag_transform = "snakecase",
|
||||
-- 路径设置
|
||||
verbose = false,
|
||||
trouble = true,
|
||||
lsp_inlay_hints = {
|
||||
enable = true,
|
||||
-- 使用 LSP 内联提示而不是 virtualtypes
|
||||
only_current_line = false,
|
||||
only_current_line_autocmd = "CursorHold",
|
||||
show_parameter_hints = true,
|
||||
show_variable_name = true,
|
||||
parameter_hints_prefix = " ",
|
||||
other_hints_prefix = " ",
|
||||
highlight = "LspInlayHint",
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
require("go").setup(opts)
|
||||
|
||||
-- 设置自动命令
|
||||
local gogroup = vim.api.nvim_create_augroup("GoGroup", { clear = true })
|
||||
|
||||
vim.api.nvim_create_autocmd("BufWritePre", {
|
||||
pattern = "*.go",
|
||||
group = gogroup,
|
||||
callback = function()
|
||||
require("go.format").goimport()
|
||||
end,
|
||||
})
|
||||
|
||||
vim.api.nvim_create_autocmd("FileType", {
|
||||
pattern = "go",
|
||||
group = gogroup,
|
||||
callback = function()
|
||||
-- 将 tab 宽度设置为 Go 的标准
|
||||
vim.bo.tabstop = 4
|
||||
vim.bo.shiftwidth = 4
|
||||
vim.bo.softtabstop = 4
|
||||
vim.bo.expandtab = false
|
||||
end,
|
||||
})
|
||||
end,
|
||||
keys = {
|
||||
-- 测试
|
||||
{ "<leader>gts", "<cmd>GoAlt<cr>", desc = "切换测试/实现文件" },
|
||||
{ "<leader>gtt", "<cmd>GoTest<cr>", desc = "运行包测试" },
|
||||
{ "<leader>gtf", "<cmd>GoTestFunc<cr>", desc = "测试函数" },
|
||||
{ "<leader>gtc", "<cmd>GoCoverage<cr>", desc = "测试覆盖率" },
|
||||
{ "<leader>gtC", "<cmd>GoCoverageClear<cr>", desc = "清除测试覆盖率" },
|
||||
|
||||
-- 格式化
|
||||
{ "<leader>gff", "<cmd>GoFormat<cr>", desc = "格式化" },
|
||||
{ "<leader>gfi", "<cmd>GoImport<cr>", desc = "导入" },
|
||||
{ "<leader>gfI", "<cmd>GoImportAll<cr>", desc = "导入所有" },
|
||||
|
||||
-- 模板
|
||||
{ "<leader>gge", "<cmd>GoIfErr<cr>", desc = "生成错误处理" },
|
||||
{ "<leader>ggf", "<cmd>GoFillStruct<cr>", desc = "填充结构体" },
|
||||
{ "<leader>ggs", "<cmd>GoFillSwitch<cr>", desc = "填充 switch" },
|
||||
|
||||
-- 标签
|
||||
{ "<leader>gta", "<cmd>GoAddTag<cr>", desc = "添加标签" },
|
||||
{ "<leader>gtr", "<cmd>GoRmTag<cr>", desc = "移除标签" },
|
||||
{ "<leader>gtc", "<cmd>GoClearTag<cr>", desc = "清除标签" },
|
||||
|
||||
-- 运行和构建
|
||||
{ "<leader>gr", "<cmd>GoRun<cr>", desc = "运行" },
|
||||
{ "<leader>gb", "<cmd>GoBuild<cr>", desc = "构建" },
|
||||
|
||||
-- 工具
|
||||
{ "<leader>gi", "<cmd>GoImpl<cr>", desc = "实现接口" },
|
||||
{ "<leader>gd", "<cmd>GoDoc<cr>", desc = "查看文档" },
|
||||
{ "<leader>gl", "<cmd>GoLint<cr>", desc = "运行 golint" },
|
||||
{ "<leader>gv", "<cmd>GoVet<cr>", desc = "运行 go vet" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 格式化集成
|
||||
{
|
||||
"stevearc/conform.nvim",
|
||||
optional = true,
|
||||
opts = {
|
||||
formatters_by_ft = {
|
||||
go = { "goimports", "gofumpt" },
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 调试支持
|
||||
{
|
||||
"mfussenegger/nvim-dap",
|
||||
optional = true,
|
||||
dependencies = {
|
||||
{
|
||||
"leoluz/nvim-dap-go",
|
||||
config = true,
|
||||
},
|
||||
},
|
||||
keys = {
|
||||
{ "<leader>dgr", function() require("dap-go").debug_test() end, desc = "调试当前测试" },
|
||||
{ "<leader>dgl", function() require("dap-go").debug_last_test() end, desc = "调试上一个测试" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 单元测试
|
||||
{
|
||||
"nvim-neotest/neotest",
|
||||
optional = true,
|
||||
dependencies = {
|
||||
"nvim-neotest/neotest-go",
|
||||
},
|
||||
opts = {
|
||||
adapters = {
|
||||
["neotest-go"] = {
|
||||
-- 使用 gotest 作为测试器
|
||||
args = { "-count=1", "-timeout=30s", "-v" },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 工具安装程序
|
||||
{
|
||||
"williamboman/mason.nvim",
|
||||
optional = true,
|
||||
opts = function(_, opts)
|
||||
-- 添加 Go 工具到确保安装列表
|
||||
if type(opts.ensure_installed) == "table" then
|
||||
vim.list_extend(opts.ensure_installed, {
|
||||
"gopls",
|
||||
"gofumpt",
|
||||
"goimports",
|
||||
"golangci-lint",
|
||||
"gomodifytags",
|
||||
"gotests",
|
||||
"impl",
|
||||
"delve",
|
||||
})
|
||||
end
|
||||
end,
|
||||
},
|
||||
|
||||
-- Treesitter 集成
|
||||
{
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
opts = function(_, opts)
|
||||
-- 添加 Go 相关的解析器
|
||||
if type(opts.ensure_installed) == "table" then
|
||||
vim.list_extend(opts.ensure_installed, {
|
||||
"go",
|
||||
"gomod",
|
||||
"gowork",
|
||||
"gosum",
|
||||
})
|
||||
end
|
||||
end,
|
||||
},
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
return {
|
||||
"williamboman/mason.nvim",
|
||||
opts = {
|
||||
ensure_installed = {
|
||||
"bash-language-server",
|
||||
"shfmt",
|
||||
"shellcheck",
|
||||
"emmet-ls",
|
||||
"eslint_d",
|
||||
"pyright",
|
||||
"html-lsp",
|
||||
"prettier",
|
||||
"autopep8",
|
||||
"stylua",
|
||||
"gopls",
|
||||
},
|
||||
},
|
||||
}
|
||||
19
nvim/lua/plugins/lspconfig.lua
Normal file
19
nvim/lua/plugins/lspconfig.lua
Normal file
@@ -0,0 +1,19 @@
|
||||
-- lspconfig.lua - LSP 配置
|
||||
return {
|
||||
{
|
||||
"neovim/nvim-lspconfig",
|
||||
event = { "BufReadPre", "BufNewFile" },
|
||||
dependencies = {
|
||||
"hrsh7th/cmp-nvim-lsp",
|
||||
"williamboman/mason-lspconfig.nvim",
|
||||
},
|
||||
config = function()
|
||||
local lspconfig = require("lspconfig")
|
||||
local capabilities = require("cmp_nvim_lsp").default_capabilities()
|
||||
-- Go
|
||||
lspconfig.gopls.setup({ capabilities = capabilities })
|
||||
-- Python
|
||||
lspconfig.pyright.setup({ capabilities = capabilities })
|
||||
end,
|
||||
},
|
||||
}
|
||||
0
nvim/lua/plugins/lua.lua
Normal file
0
nvim/lua/plugins/lua.lua
Normal file
23
nvim/lua/plugins/mason.lua
Normal file
23
nvim/lua/plugins/mason.lua
Normal file
@@ -0,0 +1,23 @@
|
||||
-- mason.lua - LSP/DAP/格式化工具自动安装
|
||||
return {
|
||||
{
|
||||
"williamboman/mason.nvim",
|
||||
build = ":MasonUpdate",
|
||||
config = true,
|
||||
},
|
||||
{
|
||||
"williamboman/mason-lspconfig.nvim",
|
||||
dependencies = { "williamboman/mason.nvim" },
|
||||
opts = {
|
||||
ensure_installed = { "gopls", "pyright" },
|
||||
},
|
||||
},
|
||||
{
|
||||
"jay-babu/mason-null-ls.nvim",
|
||||
dependencies = { "williamboman/mason.nvim", "nvimtools/none-ls.nvim" },
|
||||
opts = {
|
||||
ensure_installed = { "gofumpt", "golines", "black", "isort", "flake8" },
|
||||
automatic_installation = true,
|
||||
},
|
||||
},
|
||||
}
|
||||
1
nvim/lua/plugins/noice.lua
Normal file
1
nvim/lua/plugins/noice.lua
Normal file
@@ -0,0 +1 @@
|
||||
return {"folke/noice.nvim", opts={}}
|
||||
21
nvim/lua/plugins/null-ls.lua
Normal file
21
nvim/lua/plugins/null-ls.lua
Normal file
@@ -0,0 +1,21 @@
|
||||
-- null-ls.lua - 格式化与诊断
|
||||
return {
|
||||
{
|
||||
"nvimtools/none-ls.nvim",
|
||||
event = { "BufReadPre", "BufNewFile" },
|
||||
opts = function()
|
||||
local null_ls = require("null-ls")
|
||||
return {
|
||||
sources = {
|
||||
-- Go
|
||||
null_ls.builtins.formatting.gofumpt,
|
||||
null_ls.builtins.formatting.golines,
|
||||
-- Python
|
||||
null_ls.builtins.formatting.black,
|
||||
null_ls.builtins.formatting.isort,
|
||||
null_ls.builtins.diagnostics.ruff,
|
||||
},
|
||||
}
|
||||
end,
|
||||
},
|
||||
}
|
||||
213
nvim/lua/plugins/python.lua
Normal file
213
nvim/lua/plugins/python.lua
Normal file
@@ -0,0 +1,213 @@
|
||||
-- python.lua - Python 开发专用配置
|
||||
|
||||
return {
|
||||
-- Python 专用插件
|
||||
{
|
||||
"linux-cultist/venv-selector.nvim",
|
||||
cmd = "VenvSelect",
|
||||
keys = {
|
||||
{ "<leader>pv", "<cmd>VenvSelect<cr>", desc = "选择 Python 虚拟环境" },
|
||||
{ "<leader>pc", "<cmd>VenvSelectCached<cr>", desc = "选择缓存的虚拟环境" },
|
||||
},
|
||||
opts = {
|
||||
name = {
|
||||
"venv",
|
||||
".venv",
|
||||
"env",
|
||||
".env",
|
||||
"virtualenv",
|
||||
},
|
||||
auto_refresh = true,
|
||||
search_from = "root", -- 从项目根目录搜索
|
||||
},
|
||||
config = function(_, opts)
|
||||
require("venv-selector").setup(opts)
|
||||
|
||||
-- 自动激活虚拟环境
|
||||
vim.api.nvim_create_autocmd("BufEnter", {
|
||||
pattern = { "*.py" },
|
||||
callback = function()
|
||||
-- 使用缓存的 venv
|
||||
require("venv-selector").retrieve_from_cache()
|
||||
end,
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- Python 单元测试插件
|
||||
{
|
||||
"nvim-neotest/neotest",
|
||||
optional = true,
|
||||
dependencies = {
|
||||
"nvim-neotest/neotest-python",
|
||||
},
|
||||
opts = {
|
||||
adapters = {
|
||||
["neotest-python"] = {
|
||||
-- 使用项目根目录中的 pytest.ini
|
||||
runner = "pytest",
|
||||
-- 可以使用 pytest 或 unittest
|
||||
-- runner = function()
|
||||
-- if vim.fn.filereadable("pytest.ini") == 1 then
|
||||
-- return "pytest"
|
||||
-- else
|
||||
-- return "unittest"
|
||||
-- end
|
||||
-- end,
|
||||
|
||||
-- 额外的 pytest 参数
|
||||
args = {
|
||||
"--color=yes",
|
||||
"-v",
|
||||
},
|
||||
|
||||
-- Python 测试发现模式
|
||||
python = function()
|
||||
-- 如果激活了虚拟环境,使用它
|
||||
if vim.env.VIRTUAL_ENV then
|
||||
return vim.env.VIRTUAL_ENV .. "/bin/python"
|
||||
end
|
||||
|
||||
-- 否则使用系统的 Python
|
||||
return "python"
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
keys = {
|
||||
{ "<leader>pt", "<cmd>lua require('neotest').run.run()<cr>", desc = "运行最近的测试" },
|
||||
{ "<leader>pT", "<cmd>lua require('neotest').run.run(vim.fn.expand('%'))<cr>", desc = "运行文件中的测试" },
|
||||
{ "<leader>pd", "<cmd>lua require('neotest').run.run({strategy = 'dap'})<cr>", desc = "调试最近的测试" },
|
||||
{ "<leader>ps", "<cmd>lua require('neotest').run.stop()<cr>", desc = "停止测试" },
|
||||
{ "<leader>pa", "<cmd>lua require('neotest').run.attach()<cr>", desc = "附加到测试" },
|
||||
{ "<leader>po", "<cmd>lua require('neotest').output.open()<cr>", desc = "查看测试输出" },
|
||||
{ "<leader>pO", "<cmd>lua require('neotest').output_panel.toggle()<cr>", desc = "切换输出面板" },
|
||||
{ "<leader>pS", "<cmd>lua require('neotest').summary.toggle()<cr>", desc = "切换摘要窗口" },
|
||||
},
|
||||
},
|
||||
|
||||
-- Python 导入排序和格式化
|
||||
{
|
||||
"stevearc/conform.nvim",
|
||||
optional = true,
|
||||
opts = {
|
||||
formatters_by_ft = {
|
||||
python = { "isort", "black" },
|
||||
},
|
||||
formatters = {
|
||||
black = {
|
||||
args = { "--line-length", "88", "--fast", "-" },
|
||||
},
|
||||
isort = {
|
||||
args = { "--stdout", "--profile", "black", "--line-length", "88", "-" },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- Python 调试
|
||||
{
|
||||
"mfussenegger/nvim-dap",
|
||||
optional = true,
|
||||
dependencies = {
|
||||
"mfussenegger/nvim-dap-python",
|
||||
},
|
||||
opts = function()
|
||||
local path = require("mason-registry").get_package("debugpy"):get_install_path()
|
||||
require("dap-python").setup(path .. "/venv/bin/python")
|
||||
|
||||
-- 设置 pytest 调试
|
||||
require("dap-python").test_runner = "pytest"
|
||||
|
||||
-- 添加自定义配置
|
||||
table.insert(require("dap").configurations.python, {
|
||||
type = "python",
|
||||
request = "launch",
|
||||
name = "启动带参数的文件",
|
||||
program = "${file}",
|
||||
args = function()
|
||||
local args_string = vim.fn.input("命令行参数: ")
|
||||
return vim.split(args_string, " ")
|
||||
end,
|
||||
console = "integratedTerminal",
|
||||
})
|
||||
|
||||
-- 添加 FastAPI 配置
|
||||
table.insert(require("dap").configurations.python, {
|
||||
type = "python",
|
||||
request = "launch",
|
||||
name = "FastAPI",
|
||||
module = "uvicorn",
|
||||
args = function()
|
||||
local args = vim.fn.input("uvicorn 参数 (例如 main:app --reload): ")
|
||||
return vim.split(args, " ")
|
||||
end,
|
||||
console = "integratedTerminal",
|
||||
})
|
||||
end,
|
||||
keys = {
|
||||
-- Python 特定调试键
|
||||
{ "<leader>dpr", function() require("dap-python").test_method() end, desc = "调试当前方法" },
|
||||
{ "<leader>dpc", function() require("dap-python").test_class() end, desc = "调试当前类" },
|
||||
{ "<leader>dpf", function() require("dap-python").test_method() end, desc = "调试当前函数" },
|
||||
},
|
||||
},
|
||||
|
||||
-- Python 代码格式化和排序
|
||||
{
|
||||
"williamboman/mason.nvim",
|
||||
optional = true,
|
||||
opts = function(_, opts)
|
||||
-- 将额外的 Python 工具添加到确保安装列表中
|
||||
if type(opts.ensure_installed) == "table" then
|
||||
vim.list_extend(opts.ensure_installed, {
|
||||
"black",
|
||||
"isort",
|
||||
"mypy",
|
||||
"ruff",
|
||||
"ruff-lsp",
|
||||
"pyright",
|
||||
"debugpy",
|
||||
})
|
||||
end
|
||||
end,
|
||||
},
|
||||
|
||||
-- 代码折叠
|
||||
{
|
||||
"kevinhwang91/nvim-ufo",
|
||||
optional = true,
|
||||
opts = {
|
||||
close_fold_kinds_for_ft = {
|
||||
python = { "imports", "comment" },
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- REPL 集成
|
||||
{
|
||||
"michaelb/sniprun",
|
||||
build = "sh ./install.sh",
|
||||
cmd = { "SnipRun", "SnipInfo", "SnipReset", "SnipClose" },
|
||||
keys = {
|
||||
{ "<leader>pe", "<cmd>SnipRun<cr>", desc = "执行选中代码", mode = { "n", "v" } },
|
||||
{ "<leader>pE", "<cmd>SnipInfo<cr>", desc = "Sniprun 信息" },
|
||||
},
|
||||
opts = {
|
||||
display = { "NvimNotify" },
|
||||
interpreter_options = {
|
||||
Python3_fifo = {
|
||||
venv = function()
|
||||
return vim.env.VIRTUAL_ENV
|
||||
end,
|
||||
cwd = function()
|
||||
return vim.fn.getcwd()
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
require("sniprun").setup(opts)
|
||||
end,
|
||||
},
|
||||
}
|
||||
1
nvim/lua/plugins/snacks.lua
Normal file
1
nvim/lua/plugins/snacks.lua
Normal file
@@ -0,0 +1 @@
|
||||
return {"folke/snacks.nvim", opts={}}
|
||||
1
nvim/lua/plugins/todo-comment.lua
Normal file
1
nvim/lua/plugins/todo-comment.lua
Normal file
@@ -0,0 +1 @@
|
||||
return { "folke/todo-comments.nvim", opts = {} }
|
||||
13
nvim/lua/plugins/treesitter.lua
Normal file
13
nvim/lua/plugins/treesitter.lua
Normal file
@@ -0,0 +1,13 @@
|
||||
-- treesitter.lua - 语法高亮与代码结构
|
||||
return {
|
||||
{
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
build = ":TSUpdate",
|
||||
event = { "BufReadPost", "BufNewFile" },
|
||||
opts = {
|
||||
ensure_installed = { "go", "python", "lua", "json", "yaml", "markdown" },
|
||||
highlight = { enable = true },
|
||||
indent = { enable = true },
|
||||
},
|
||||
},
|
||||
}
|
||||
1
nvim/lua/plugins/trouble.lua
Normal file
1
nvim/lua/plugins/trouble.lua
Normal file
@@ -0,0 +1 @@
|
||||
return {"folke/trouble.nvim", opts={}}
|
||||
1
nvim/lua/plugins/ts-comments.lua
Normal file
1
nvim/lua/plugins/ts-comments.lua
Normal file
@@ -0,0 +1 @@
|
||||
return {"folke/ts-comments.nvim", opts={}}
|
||||
330
nvim/lua/plugins/ui.lua
Normal file
330
nvim/lua/plugins/ui.lua
Normal file
@@ -0,0 +1,330 @@
|
||||
-- ui.lua - UI 增强插件配置
|
||||
|
||||
return {
|
||||
-- 状态栏
|
||||
{
|
||||
"nvim-lualine/lualine.nvim",
|
||||
event = "VeryLazy",
|
||||
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||||
opts = {
|
||||
options = {
|
||||
theme = "auto", -- 自动匹配当前主题
|
||||
globalstatus = true, -- 全局状态栏
|
||||
component_separators = { left = "", right = "" },
|
||||
section_separators = { left = "", right = "" },
|
||||
disabled_filetypes = {
|
||||
statusline = { "dashboard", "alpha" },
|
||||
winbar = { "dashboard", "alpha" },
|
||||
},
|
||||
},
|
||||
sections = {
|
||||
lualine_a = { { "mode", icon = "" } },
|
||||
lualine_b = {
|
||||
{ "branch", icon = "" },
|
||||
{
|
||||
"diff",
|
||||
symbols = { added = " ", modified = " ", removed = " " },
|
||||
colored = true
|
||||
}
|
||||
},
|
||||
lualine_c = {
|
||||
{
|
||||
"diagnostics",
|
||||
sources = { "nvim_diagnostic" },
|
||||
symbols = {
|
||||
error = " ",
|
||||
warn = " ",
|
||||
info = " ",
|
||||
hint = " ",
|
||||
},
|
||||
},
|
||||
{ "filetype", icon_only = true, separator = "", padding = { left = 1, right = 0 } },
|
||||
{ "filename", path = 1, symbols = { modified = " ", readonly = " ", unnamed = " " } },
|
||||
},
|
||||
lualine_x = {
|
||||
-- Git 文件状态
|
||||
{
|
||||
function()
|
||||
local status = ""
|
||||
local ft = vim.bo.filetype
|
||||
|
||||
-- 检查 LSP 是否连接
|
||||
local clients = vim.lsp.get_active_clients({ bufnr = 0 })
|
||||
if #clients > 0 then
|
||||
status = status .. " LSP"
|
||||
end
|
||||
|
||||
return status
|
||||
end,
|
||||
},
|
||||
{ "encoding" },
|
||||
{ "fileformat" },
|
||||
{ "filetype" },
|
||||
},
|
||||
lualine_y = {
|
||||
{ "progress", separator = " ", padding = { left = 1, right = 1 } },
|
||||
{ "location", padding = { left = 1, right = 1 } },
|
||||
},
|
||||
lualine_z = {
|
||||
function()
|
||||
return " " .. os.date("%R")
|
||||
end,
|
||||
},
|
||||
},
|
||||
tabline = {},
|
||||
extensions = { "neo-tree", "lazy" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 缩进线
|
||||
{
|
||||
"lukas-reineke/indent-blankline.nvim",
|
||||
main = "ibl",
|
||||
event = "BufReadPost",
|
||||
opts = {
|
||||
indent = {
|
||||
char = "│", -- 缩进字符
|
||||
tab_char = "│", -- Tab 缩进字符
|
||||
},
|
||||
scope = { enabled = false }, -- 禁用范围高亮
|
||||
exclude = {
|
||||
filetypes = {
|
||||
"help",
|
||||
"alpha",
|
||||
"dashboard",
|
||||
"neo-tree",
|
||||
"Trouble",
|
||||
"lazy",
|
||||
"mason",
|
||||
"notify",
|
||||
"toggleterm",
|
||||
"lazyterm",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 文件树
|
||||
{
|
||||
"nvim-neo-tree/neo-tree.nvim",
|
||||
branch = "v3.x",
|
||||
cmd = "Neotree",
|
||||
dependencies = {
|
||||
"nvim-lua/plenary.nvim",
|
||||
"nvim-tree/nvim-web-devicons",
|
||||
"MunifTanjim/nui.nvim",
|
||||
},
|
||||
keys = {
|
||||
{ "<leader>e", "<cmd>Neotree toggle<cr>", desc = "切换文件浏览器" },
|
||||
{ "<leader>o", "<cmd>Neotree focus<cr>", desc = "聚焦文件浏览器" },
|
||||
},
|
||||
opts = {
|
||||
sources = { "filesystem", "buffers", "git_status", "document_symbols" },
|
||||
open_files_do_not_replace_types = { "terminal", "Trouble", "qf", "edgy" },
|
||||
filesystem = {
|
||||
bind_to_cwd = false,
|
||||
follow_current_file = { enabled = true },
|
||||
use_libuv_file_watcher = true,
|
||||
filtered_items = {
|
||||
visible = true, -- 显示被过滤的项目
|
||||
hide_dotfiles = false, -- 不隐藏点文件
|
||||
hide_gitignored = false, -- 不隐藏被 gitignore 的文件
|
||||
},
|
||||
},
|
||||
window = {
|
||||
position = "left",
|
||||
width = 30,
|
||||
mappings = {
|
||||
["<space>"] = "none",
|
||||
["o"] = "open",
|
||||
["h"] = "close_node",
|
||||
["l"] = "open",
|
||||
},
|
||||
},
|
||||
default_component_configs = {
|
||||
indent = {
|
||||
with_expanders = true, -- 启用展开图标
|
||||
expander_collapsed = "",
|
||||
expander_expanded = "",
|
||||
expander_highlight = "NeoTreeExpander",
|
||||
},
|
||||
git_status = {
|
||||
symbols = {
|
||||
-- 状态图标
|
||||
added = "✚", -- 或 "✚"
|
||||
modified = "", -- 或 ""
|
||||
deleted = "✖", -- 或 "✖"
|
||||
renamed = "", -- 或 ""
|
||||
untracked = "",
|
||||
ignored = "",
|
||||
unstaged = "",
|
||||
staged = "",
|
||||
conflict = "",
|
||||
},
|
||||
},
|
||||
},
|
||||
commands = {
|
||||
-- 添加自定义命令,如创建文件时创建路径
|
||||
parent_or_close = function(state)
|
||||
local node = state.tree:get_node()
|
||||
if (node.type == "directory" or node:has_children()) and node:is_expanded() then
|
||||
state.commands.toggle_node(state)
|
||||
else
|
||||
require("neo-tree.ui.renderer").focus_node(state, node:get_parent_id())
|
||||
end
|
||||
end,
|
||||
child_or_open = function(state)
|
||||
local node = state.tree:get_node()
|
||||
if node.type == "directory" or node:has_children() then
|
||||
if not node:is_expanded() then
|
||||
state.commands.toggle_node(state)
|
||||
else
|
||||
require("neo-tree.ui.renderer").focus_node(state, node:get_child_ids()[1])
|
||||
end
|
||||
else
|
||||
state.commands.open(state)
|
||||
end
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 顶部标签页
|
||||
{
|
||||
"akinsho/bufferline.nvim",
|
||||
event = "VeryLazy",
|
||||
keys = {
|
||||
{ "<leader>bp", "<Cmd>BufferLineTogglePin<CR>", desc = "标记/取消标记缓冲区" },
|
||||
{ "<leader>bP", "<Cmd>BufferLineGroupClose ungrouped<CR>", desc = "关闭未标记的缓冲区" },
|
||||
{ "<leader>bo", "<Cmd>BufferLineCloseOthers<CR>", desc = "关闭其他缓冲区" },
|
||||
{ "<leader>br", "<Cmd>BufferLineCloseRight<CR>", desc = "关闭右侧缓冲区" },
|
||||
{ "<leader>bl", "<Cmd>BufferLineCloseLeft<CR>", desc = "关闭左侧缓冲区" },
|
||||
{ "<S-h>", "<cmd>BufferLineCyclePrev<cr>", desc = "上一个缓冲区" },
|
||||
{ "<S-l>", "<cmd>BufferLineCycleNext<cr>", desc = "下一个缓冲区" },
|
||||
},
|
||||
opts = {
|
||||
options = {
|
||||
close_command = function(n) require("mini.bufremove").delete(n, false) end,
|
||||
right_mouse_command = function(n) require("mini.bufremove").delete(n, false) end,
|
||||
diagnostics = "nvim_lsp", -- 显示诊断
|
||||
always_show_bufferline = false,
|
||||
diagnostics_indicator = function(_, _, diag)
|
||||
local icons = {
|
||||
Error = " ",
|
||||
Warn = " ",
|
||||
Hint = " ",
|
||||
Info = " ",
|
||||
}
|
||||
local ret = (diag.error and icons.Error .. diag.error .. " " or "")
|
||||
.. (diag.warning and icons.Warn .. diag.warning or "")
|
||||
return vim.trim(ret)
|
||||
end,
|
||||
offsets = {
|
||||
{
|
||||
filetype = "neo-tree",
|
||||
text = "文件浏览器",
|
||||
highlight = "Directory",
|
||||
text_align = "left",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 通知系统
|
||||
{
|
||||
"rcarriga/nvim-notify",
|
||||
keys = {
|
||||
{
|
||||
"<leader>un",
|
||||
function()
|
||||
require("notify").dismiss({ silent = true, pending = true })
|
||||
end,
|
||||
desc = "清除所有通知",
|
||||
},
|
||||
},
|
||||
opts = {
|
||||
timeout = 3000,
|
||||
max_height = function()
|
||||
return math.floor(vim.o.lines * 0.75)
|
||||
end,
|
||||
max_width = function()
|
||||
return math.floor(vim.o.columns * 0.75)
|
||||
end,
|
||||
on_open = function(win)
|
||||
vim.api.nvim_win_set_config(win, { zindex = 100 })
|
||||
end,
|
||||
},
|
||||
init = function()
|
||||
-- 当 "notify" 可用时,将其替换为 vim.notify
|
||||
vim.notify = function(...)
|
||||
local loaded, notify = pcall(require, "notify")
|
||||
if loaded then
|
||||
vim.notify = notify
|
||||
return notify(...)
|
||||
else
|
||||
return vim.api.nvim_notify(...)
|
||||
end
|
||||
end
|
||||
end,
|
||||
},
|
||||
-- 快捷键提示
|
||||
{
|
||||
"folke/which-key.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = {
|
||||
plugins = {
|
||||
marks = true, -- 显示标记
|
||||
registers = true, -- 显示寄存器
|
||||
spelling = {
|
||||
enabled = true, -- 启用拼写建议
|
||||
suggestions = 20,
|
||||
},
|
||||
presets = {
|
||||
operators = true, -- 添加操作符帮助
|
||||
motions = true, -- 添加动作帮助
|
||||
text_objects = true, -- 添加文本对象帮助
|
||||
windows = true, -- 添加窗口帮助 (meta-w)
|
||||
nav = true, -- 添加导航帮助
|
||||
z = true, -- 添加折叠帮助
|
||||
g = true, -- 添加 g 命令帮助
|
||||
},
|
||||
},
|
||||
icons = {
|
||||
breadcrumb = "»", -- 面包屑分隔符
|
||||
separator = "➜", -- 键映射前缀和命令之间的分隔符
|
||||
group = "+", -- 组图标
|
||||
},
|
||||
window = {
|
||||
border = "rounded", -- 边框样式
|
||||
position = "bottom", -- 位置
|
||||
margin = { 1, 0, 1, 0 }, -- 边距
|
||||
padding = { 1, 1, 1, 1 }, -- 内边距
|
||||
},
|
||||
layout = {
|
||||
height = { min = 3, max = 25 }, -- 最小和最大高度
|
||||
width = { min = 20, max = 50 }, -- 最小和最大宽度
|
||||
spacing = 3, -- 间距
|
||||
align = "center", -- 对齐方式
|
||||
},
|
||||
ignore_missing = false, -- 不忽略缺少的键映射
|
||||
hidden = { "<silent>", "<cmd>", "<Cmd>", "<CR>", "^:", "^ ", "^call ", "^lua " }, -- 隐藏的命令前缀
|
||||
show_help = true, -- 显示帮助信息
|
||||
triggers = "auto", -- 触发自动显示
|
||||
triggers_nowait = { -- 不等待这些前缀的键映射
|
||||
-- 字符表示操作符等待模式
|
||||
"`",
|
||||
"'",
|
||||
"g`",
|
||||
"g'",
|
||||
'"',
|
||||
"<c-r>",
|
||||
"z=",
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
local wk = require("which-key")
|
||||
wk.setup(opts)
|
||||
end,
|
||||
},
|
||||
}
|
||||
337
nvim/lua/plugins/utils.lua
Normal file
337
nvim/lua/plugins/utils.lua
Normal file
@@ -0,0 +1,337 @@
|
||||
-- utils.lua - 实用工具插件配置
|
||||
|
||||
return {
|
||||
-- 启动界面
|
||||
{
|
||||
"goolord/alpha-nvim",
|
||||
event = "VimEnter",
|
||||
opts = function()
|
||||
local dashboard = require("alpha.themes.dashboard")
|
||||
local logo = [[
|
||||
███╗ ██╗███████╗ ██████╗ ██╗ ██╗██╗███╗ ███╗
|
||||
████╗ ██║██╔════╝██╔═══██╗██║ ██║██║████╗ ████║
|
||||
██╔██╗ ██║█████╗ ██║ ██║██║ ██║██║██╔████╔██║
|
||||
██║╚██╗██║██╔══╝ ██║ ██║╚██╗ ██╔╝██║██║╚██╔╝██║
|
||||
██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║
|
||||
╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═══╝ ╚═╝╚═╝ ╚═╝
|
||||
]]
|
||||
|
||||
dashboard.section.header.val = vim.split(logo, "\n")
|
||||
dashboard.section.buttons.val = {
|
||||
dashboard.button("f", " 查找文件", ":Telescope find_files <CR>"),
|
||||
dashboard.button("e", " 新文件", ":ene <BAR> startinsert <CR>"),
|
||||
dashboard.button("r", " 最近文件", ":Telescope oldfiles <CR>"),
|
||||
dashboard.button("g", " 查找文本", ":Telescope live_grep <CR>"),
|
||||
dashboard.button("c", " 配置", ":e $MYVIMRC <CR>"),
|
||||
dashboard.button("l", " 懒加载插件", ":Lazy<CR>"),
|
||||
dashboard.button("q", " 退出", ":qa<CR>"),
|
||||
}
|
||||
|
||||
dashboard.section.footer.val = "Neovim 配置 - 专注于 Python 和 Go 开发"
|
||||
|
||||
dashboard.section.header.opts.hl = "Type"
|
||||
dashboard.section.buttons.opts.hl = "Keyword"
|
||||
dashboard.section.footer.opts.hl = "Comment"
|
||||
|
||||
dashboard.opts.opts.noautocmd = true
|
||||
return dashboard
|
||||
end,
|
||||
config = function(_, dashboard)
|
||||
require("alpha").setup(dashboard.opts)
|
||||
|
||||
vim.api.nvim_create_autocmd("User", {
|
||||
pattern = "LazyVimStarted",
|
||||
callback = function()
|
||||
local stats = require("lazy").stats()
|
||||
local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100)
|
||||
local version = " v" .. vim.version().major .. "." .. vim.version().minor .. "." .. vim.version().patch
|
||||
local plugins = " " .. stats.count .. " 个插件加载完成,用时 " .. ms .. "ms"
|
||||
local footer = version .. "\n" .. plugins
|
||||
|
||||
pcall(function()
|
||||
local alpha = require("alpha")
|
||||
local dashboard = alpha.themes.dashboard
|
||||
dashboard.section.footer.val = footer
|
||||
alpha.redraw()
|
||||
end)
|
||||
end,
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- 查找器增强
|
||||
{
|
||||
"folke/flash.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = {
|
||||
search = {
|
||||
multi_window = false, -- 只在当前窗口搜索
|
||||
wrap = true, -- 循环搜索
|
||||
},
|
||||
modes = {
|
||||
char = {
|
||||
enabled = true,
|
||||
keys = { "f", "F", "t", "T", ";", "," },
|
||||
},
|
||||
},
|
||||
},
|
||||
keys = {
|
||||
{
|
||||
"s",
|
||||
mode = { "n", "x", "o" },
|
||||
function()
|
||||
require("flash").jump()
|
||||
end,
|
||||
desc = "闪烁跳转",
|
||||
},
|
||||
{
|
||||
"S",
|
||||
mode = { "n", "x", "o" },
|
||||
function()
|
||||
require("flash").treesitter()
|
||||
end,
|
||||
desc = "闪烁 Treesitter",
|
||||
},
|
||||
{
|
||||
"r",
|
||||
mode = "o",
|
||||
function()
|
||||
require("flash").remote()
|
||||
end,
|
||||
desc = "远程闪烁",
|
||||
},
|
||||
{
|
||||
"R",
|
||||
mode = { "o", "x" },
|
||||
function()
|
||||
require("flash").treesitter_search()
|
||||
end,
|
||||
desc = "Treesitter 搜索",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 项目管理
|
||||
{
|
||||
"ahmedkhalf/project.nvim",
|
||||
config = function()
|
||||
require("project_nvim").setup({
|
||||
patterns = { ".git", "_darcs", ".hg", ".bzr", ".svn", "Makefile", "package.json", "pyproject.toml", "go.mod" },
|
||||
detection_methods = { "pattern", "lsp" },
|
||||
show_hidden = true,
|
||||
silent_chdir = true,
|
||||
scope_chdir = "global",
|
||||
})
|
||||
|
||||
require("telescope").load_extension("projects")
|
||||
end,
|
||||
keys = {
|
||||
{ "<leader>fp", "<cmd>Telescope projects<cr>", desc = "项目" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 文件浏览器增强
|
||||
{
|
||||
"stevearc/oil.nvim",
|
||||
opts = {
|
||||
default_file_explorer = true,
|
||||
columns = {
|
||||
"icon",
|
||||
"permissions",
|
||||
"size",
|
||||
"mtime",
|
||||
},
|
||||
buf_options = {
|
||||
buflisted = false,
|
||||
bufhidden = "hide",
|
||||
},
|
||||
win_options = {
|
||||
wrap = false,
|
||||
signcolumn = "no",
|
||||
cursorcolumn = false,
|
||||
foldcolumn = "0",
|
||||
spell = false,
|
||||
list = false,
|
||||
conceallevel = 3,
|
||||
concealcursor = "n",
|
||||
},
|
||||
delete_to_trash = true,
|
||||
skip_confirm_for_simple_edits = false,
|
||||
prompt_save_on_select_new_entry = true,
|
||||
cleanup_delay_ms = 2000,
|
||||
keymaps = {
|
||||
["g?"] = "actions.show_help",
|
||||
["<CR>"] = "actions.select",
|
||||
["<C-s>"] = "actions.select_vsplit",
|
||||
["<C-h>"] = "actions.select_split",
|
||||
["<C-t>"] = "actions.select_tab",
|
||||
["<C-p>"] = "actions.preview",
|
||||
["<C-c>"] = "actions.close",
|
||||
["<C-l>"] = "actions.refresh",
|
||||
["-"] = "actions.parent",
|
||||
["_"] = "actions.open_cwd",
|
||||
["`"] = "actions.cd",
|
||||
["~"] = "actions.tcd",
|
||||
["gs"] = "actions.change_sort",
|
||||
["gx"] = "actions.open_external",
|
||||
["g."] = "actions.toggle_hidden",
|
||||
["g\\"] = "actions.toggle_trash",
|
||||
},
|
||||
use_default_keymaps = true,
|
||||
view_options = {
|
||||
show_hidden = true,
|
||||
is_hidden_file = function(name, bufnr)
|
||||
return vim.startswith(name, ".")
|
||||
end,
|
||||
is_always_hidden = function(name, bufnr)
|
||||
return false
|
||||
end,
|
||||
},
|
||||
float = {
|
||||
padding = 2,
|
||||
max_width = 0,
|
||||
max_height = 0,
|
||||
border = "rounded",
|
||||
win_options = {
|
||||
winblend = 0,
|
||||
},
|
||||
},
|
||||
preview = {
|
||||
max_width = 0.9,
|
||||
min_width = { 40, 0.4 },
|
||||
width = nil,
|
||||
max_height = 0.9,
|
||||
min_height = { 5, 0.1 },
|
||||
height = nil,
|
||||
border = "rounded",
|
||||
win_options = {
|
||||
winblend = 0,
|
||||
},
|
||||
},
|
||||
progress = {
|
||||
max_width = 0.9,
|
||||
min_width = { 40, 0.4 },
|
||||
width = nil,
|
||||
max_height = 0.9,
|
||||
min_height = { 5, 0.1 },
|
||||
height = nil,
|
||||
border = "rounded",
|
||||
minimized_border = "none",
|
||||
win_options = {
|
||||
winblend = 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
keys = {
|
||||
{ "-", "<cmd>Oil<cr>", desc = "打开父目录" },
|
||||
{ "<leader>fo", "<cmd>Oil<cr>", desc = "打开文件浏览器" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 自动调整窗口大小
|
||||
{
|
||||
"anuvyklack/windows.nvim",
|
||||
event = "WinNew",
|
||||
dependencies = {
|
||||
{ "anuvyklack/middleclass" },
|
||||
{ "anuvyklack/animation.nvim", enabled = true },
|
||||
},
|
||||
keys = {
|
||||
{ "<leader>wm", "<cmd>WindowsMaximize<cr>", desc = "最大化窗口" },
|
||||
{ "<leader>w=", "<cmd>WindowsEqualize<cr>", desc = "均分窗口" },
|
||||
},
|
||||
config = function()
|
||||
vim.o.winwidth = 10
|
||||
vim.o.winminwidth = 10
|
||||
vim.o.equalalways = false
|
||||
require("windows").setup({
|
||||
animation = { enable = true, duration = 150 },
|
||||
autowidth = { enable = true },
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- 会话管理
|
||||
{
|
||||
"folke/persistence.nvim",
|
||||
event = "BufReadPre",
|
||||
opts = {
|
||||
dir = vim.fn.expand(vim.fn.stdpath("state") .. "/sessions/"),
|
||||
options = { "buffers", "curdir", "tabpages", "winsize", "help", "globals", "skiprtp" },
|
||||
pre_save = nil,
|
||||
},
|
||||
keys = {
|
||||
{ "<leader>qs", function() require("persistence").load() end, desc = "恢复上次会话" },
|
||||
{ "<leader>ql", function() require("persistence").load({ last = true }) end, desc = "恢复最后会话" },
|
||||
{ "<leader>qd", function() require("persistence").stop() end, desc = "不保存当前会话" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 键位映射管理
|
||||
{
|
||||
"mrjones2014/legendary.nvim",
|
||||
keys = {
|
||||
{ "<leader>k", "<cmd>Legendary<cr>", desc = "键位映射查找器" },
|
||||
},
|
||||
opts = {
|
||||
include_builtin = true,
|
||||
include_legendary_cmds = true,
|
||||
extensions = {
|
||||
which_key = { auto_register = true },
|
||||
smart_splits = { auto_register = true },
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- AI 补全集成
|
||||
{
|
||||
"zbirenbaum/copilot.lua",
|
||||
cmd = "Copilot",
|
||||
event = "InsertEnter",
|
||||
config = function()
|
||||
require("copilot").setup({
|
||||
panel = {
|
||||
enabled = true,
|
||||
auto_refresh = true,
|
||||
keymap = {
|
||||
jump_prev = "[[",
|
||||
jump_next = "]]",
|
||||
accept = "<CR>",
|
||||
refresh = "gr",
|
||||
open = "<M-CR>"
|
||||
},
|
||||
layout = {
|
||||
position = "bottom", -- | top | left | right
|
||||
ratio = 0.4
|
||||
},
|
||||
},
|
||||
suggestion = {
|
||||
enabled = true,
|
||||
auto_trigger = true,
|
||||
debounce = 75,
|
||||
keymap = {
|
||||
accept = "<M-l>",
|
||||
accept_word = "<M-w>",
|
||||
accept_line = "<M-j>",
|
||||
next = "<M-]>",
|
||||
prev = "<M-[>",
|
||||
dismiss = "<C-]>",
|
||||
},
|
||||
},
|
||||
filetypes = {
|
||||
yaml = false,
|
||||
markdown = false,
|
||||
help = false,
|
||||
gitcommit = false,
|
||||
gitrebase = false,
|
||||
hgcommit = false,
|
||||
svn = false,
|
||||
cvs = false,
|
||||
["."] = false,
|
||||
},
|
||||
copilot_node_command = 'node', -- Node.js 版本
|
||||
server_opts_overrides = {},
|
||||
})
|
||||
end,
|
||||
},
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
return {
|
||||
"wakatime/vim-wakatime",
|
||||
event = "InsertEnter",
|
||||
}
|
||||
1
nvim/lua/plugins/which-key.lua
Normal file
1
nvim/lua/plugins/which-key.lua
Normal file
@@ -0,0 +1 @@
|
||||
return {"folke/which-key.nvim", opts={}}
|
||||
Reference in New Issue
Block a user