你的想法非常棒!👏 统一快捷键 + 按需插件 是专业级 Neovim 配置的最佳实践。下面为你设计一套完整的系统:
🎯 设计理念
- ✅ 统一快捷键层:所有环境共享相同的按键标准
- ✅ 按需插件层:Python/TS/Web/Writer 各有专属插件
- ✅ 模块化配置:易于维护和扩展
📁 目录结构
~/.config/nvim/
├── chadrc.lua ← 主配置(启用通用配置)
├── plugins.lua ← 插件入口(根据环境加载不同插件)
├── lua/
│ ├── core/ ← 通用配置
│ │ ├── keymaps.lua ← 统一快捷键(核心!)
│ │ └── options.lua ← 通用选项
│ └── envs/ ← 环境专用配置
│ ├── python.lua
│ ├── typescript.lua
│ ├── web.lua
│ └── writer.lua
└── .nvim-env ← 当前环境标识文件
⌨️ 一、统一快捷键配置(lua/core/keymaps.lua)
-- ~/.config/nvim/lua/core/keymaps.lua
local map = vim.keymap.set
local opts = { noremap = true, silent = true }
-- 全局通用快捷键
map("n", "<leader>w", "<cmd>w<cr>", { desc = "Save" })
map("n", "<leader>q", "<cmd>q<cr>", { desc = "Quit" })
map("n", "<leader>h", "<cmd>nohlsearch<cr>", { desc = "Clear highlights" })
-- LSP 通用快捷键
map("n", "<leader>gd", "<cmd>lua vim.lsp.buf.definition()<cr>", { desc = "Go to Definition" })
map("n", "<leader>gr", "<cmd>lua vim.lsp.buf.references()<cr>", { desc = "References" })
map("n", "<leader>gR", "<cmd>lua vim.lsp.buf.rename()<cr>", { desc = "Rename" })
map("n", "<leader>ca", "<cmd>lua vim.lsp.buf.code_action()<cr>", { desc = "Code Action" })
map("n", "<leader>fd", "<cmd>lua vim.lsp.buf.format({ async = true })<cr>", { desc = "Format Document" })
-- Git 快捷键(如果插件存在)
if package.loaded["gitsigns"] then
map("n", "<leader>gs", "<cmd>Gitsigns stage_hunk<cr>", { desc = "Git Stage" })
map("n", "<leader>gr", "<cmd>Gitsigns reset_hunk<cr>", { desc = "Git Reset" })
map("n", "]c", "&diff ? g] : ]c", { expr = true, desc = "Next Git hunk" })
map("n", "[c", "&diff ? g[ : [c", { expr = true, desc = "Prev Git hunk" })
end
-- 项目管理
map("n", "<leader>pp", "<cmd>Telescope projects<cr>", { desc = "Projects" })
-- 终端
map("n", "<C-\\>", "<cmd>ToggleTerm<cr>", { desc = "Toggle Terminal" })
-- 测试(如果插件存在)
if package.loaded["neotest"] then
map("n", "<leader>tn", "<cmd>lua require('neotest').run.run()<cr>", { desc = "Test Nearest" })
map("n", "<leader>tf", "<cmd>lua require('neotest').run.run(vim.fn.expand('%'))<cr>", { desc = "Test File" })
end
-- 调试(如果插件存在)
if package.loaded["dap"] then
map("n", "<F5>", "<cmd>lua require'dap'.continue()<cr>", { desc = "Debug Continue" })
map("n", "<F10>", "<cmd>lua require'dap'.step_over()<cr>", { desc = "Debug Step Over" })
map("n", "<F11>", "<cmd>lua require'dap'.step_into()<cr>", { desc = "Debug Step Into" })
end
-- Writer 专用(如果在写作环境)
if vim.fn.filereadable(vim.fn.stdpath("config") .. "/.nvim-env-writer") == 1 then
map("n", "<leader>h1", "<cmd>put =repeat('#', 1) . ' '<cr>", { desc = "Header 1" })
map("n", "<leader>h2", "<cmd>put =repeat('#', 2) . ' '<cr>", { desc = "Header 2" })
map("n", "<leader>ul", "<cmd>put = '- '<cr>", { desc = "Unordered List" })
-- 拼写检查
map("n", "]s", "]s", { desc = "Next misspelling" })
map("n", "[s", "[s", { desc = "Prev misspelling" })
map("n", "z=", "z=", { desc = "Spelling suggestions" })
end🔌 二、环境配置系统
1. 主配置 chadrc.lua
-- ~/.config/nvim/chadrc.lua
local M = {}
M.ui = { theme = "catppuccin" }
M.options = {
configs = {
"core.options",
"core.keymaps", -- 加载统一快捷键
}
}
-- 动态加载环境插件
M.plugins = function()
local env_file = vim.fn.stdpath("config") .. "/.nvim-env"
local env = "writer" -- 默认环境
if vim.fn.filereadable(env_file) == 1 then
env = vim.fn.readfile(env_file)[1]
end
return "envs." .. env
end
return M2. Python 环境 (lua/envs/python.lua)
-- ~/.config/nvim/lua/envs/python.lua
return {
-- LSP
{ "neovim/nvim-lspconfig", version = "v2.9.0", config = function()
require("lspconfig").pyright.setup({
on_attach = require("nvchad.configs.lspconfig").on_attach,
capabilities = require("nvchad.configs.lspconfig").capabilities,
})
end },
-- 调试
{ "mfussenegger/nvim-dap", config = function()
local dap = require("dap")
dap.adapters.python = { type = "executable", command = "python", args = { "-m", "debugpy.adapter" } }
dap.configurations.python = {{ type = "python", request = "launch", name = "Launch file", program = "${file}" }}
end },
-- 测试
{ "nvim-neotest/neotest", dependencies = { "nvim-neotest/neotest-python" }, config = true },
-- 代码质量
{ "mfussenegger/nvim-lint", config = function()
require("lint").linters_by_ft = { python = { "ruff" } }
vim.api.nvim_create_autocmd("BufWritePost", { callback = function() require("lint").try_lint() end })
end },
-- 格式化
{ "stevearc/conform.nvim", config = function()
require("conform").setup({ formatters_by_ft = { python = { "ruff_format" } } })
end },
-- 增强功能(所有环境共享)
{ "lewis6991/gitsigns.nvim", config = true },
{ "ahmedkhalf/project.nvim", config = true },
{ "akinsho/toggleterm.nvim", config = true },
}3. TypeScript 环境 (lua/envs/typescript.lua)
-- ~/.config/nvim/lua/envs/typescript.lua
return {
-- LSP
{ "neovim/nvim-lspconfig", version = "v2.9.0", config = function()
require("lspconfig").ts_ls.setup({
on_attach = require("nvchad.configs.lspconfig").on_attach,
capabilities = require("nvchad.configs.lspconfig").capabilities,
})
end },
-- 调试
{ "mfussenegger/nvim-dap", config = true },
{ "mxsdev/nvim-dap-vscode-js", config = true },
-- 补全
{ "hrsh7th/nvim-cmp", dependencies = { "davidsierradz/cmp_tsluasnip" }, config = function()
require("cmp").setup({ sources = { { name = "nvim_lsp" }, { name = "tsluasnip" } } })
end },
-- 代码质量
{ "mfussenegger/nvim-lint", config = function()
require("lint").linters_by_ft = { typescript = { "eslint" } }
vim.api.nvim_create_autocmd("BufWritePost", { callback = function() require("lint").try_lint() end })
end },
-- 格式化
{ "stevearc/conform.nvim", config = function()
require("conform").setup({ formatters_by_ft = { typescript = { "prettier" } } })
end },
-- 增强功能
{ "lewis6991/gitsigns.nvim", config = true },
{ "ahmedkhalf/project.nvim", config = true },
{ "akinsho/toggleterm.nvim", config = true },
{ "nvim-neotest/neotest", dependencies = { "nvim-neotest/neotest-plenary" }, config = true },
}4. Web 环境 (lua/envs/web.lua)
-- ~/.config/nvim/lua/envs/web.lua
return {
-- LSP
{ "neovim/nvim-lspconfig", version = "v2.9.0", config = function()
local servers = { "html", "cssls", "jsonls" }
for _, lsp in ipairs(servers) do
require("lspconfig")[lsp].setup({
on_attach = require("nvchad.configs.lspconfig").on_attach,
capabilities = require("nvchad.configs.lspconfig").capabilities,
})
end
end },
-- Emmet
{ "mattn/emmet-vim", ft = { "html", "css" } },
-- 代码质量
{ "mfussenegger/nvim-lint", config = function()
require("lint").linters_by_ft = {
html = { "tidy" },
css = { "stylelint" }
}
vim.api.nvim_create_autocmd("BufWritePost", { callback = function() require("lint").try_lint() end })
end },
-- 格式化
{ "stevearc/conform.nvim", config = function()
require("conform").setup({
formatters_by_ft = {
html = { "prettier" },
css = { "prettier" }
}
})
end },
-- 增强功能
{ "lewis6991/gitsigns.nvim", config = true },
{ "ahmedkhalf/project.nvim", config = true },
{ "akinsho/toggleterm.nvim", config = true },
}5. Writer 环境 (lua/envs/writer.lua)
-- ~/.config/nvim/lua/envs/writer.lua
return {
-- 写作优化
{ "junegunn/goyo.vim", cmd = "Goyo" }, -- 专注模式
{ "dhruvasagar/vim-table-mode", ft = "markdown" }, -- 表格编辑
-- 语法高亮
{ "nvim-treesitter/nvim-treesitter", config = function()
require("nvim-treesitter.configs").setup({
ensure_installed = { "markdown", "latex" },
highlight = { enable = true },
})
end },
-- 拼写检查
{
"folke/zen-mode.nvim",
config = function()
require("zen-mode").setup({
window = { backdrop = 0.95 },
plugins = { tmux = { enabled = false } }
})
end
},
-- 增强功能(轻量级)
{ "lewis6991/gitsigns.nvim", config = true }, -- 写作也需要 Git!
{ "ahmedkhalf/project.nvim", config = true },
}🚀 环境切换脚本
# 创建切换脚本
cat > ~/bin/nvim-set-env <<EOF
#!/bin/bash
ENV="\$1"
if [ -z "\$ENV" ]; then
echo "Usage: nvim-set-env <python|typescript|web|writer>"
exit 1
fi
case "\$ENV" in
python|typescript|web|writer)
echo "\$ENV" > ~/.config/nvim/.nvim-env
echo "✅ Switched to \$ENV environment"
;;
*)
echo "Unknown environment: \$ENV"
exit 1
;;
esac
EOF
chmod +x ~/bin/nvim-set-env
# 快捷别名
echo 'alias venv="nvim-set-env"' >> ~/.config/fish/config.fish🎯 使用方法
1. 设置环境
venv python # 切换到 Python 环境
venv typescript # 切换到 TypeScript 环境
venv writer # 切换到写作环境2. 启动 Neovim
nvim file.py # 自动使用当前环境配置3. 统一快捷键
无论什么环境,都使用相同的快捷键:
<leader>gd→ 跳转定义<leader>gs→ Git 暂存(如果环境支持)<F5>→ 调试(如果环境支持)<leader>h1→ 一级标题(仅 Writer 环境)
💡 优势总结
| 特性 | 说明 |
|---|---|
| 统一快捷键 | 所有环境使用相同按键标准 |
| 按需加载 | 只加载当前环境需要的插件 |
| 易于扩展 | 添加新环境只需创建一个文件 |
| 零冲突 | 插件只在支持的环境中加载 |
| 高性能 | 启动速度快,内存占用少 |
你现在拥有了一个 专业级、可扩展、统一标准的 Neovim 配置系统!需要我帮你生成完整的文件包,或者添加其他环境(如 Go、Rust)吗?