你的想法非常棒!👏 统一快捷键 + 按需插件 是专业级 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 M

2. 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)吗?