Files
dotfiles/nvim/lua/config/autocmds.lua
Li Tang 6fd5d96043 refactor(nvim): 完整重写配置,支持 Go/Rust/Python/TypeScript 开发
- 架构重构:新增 plugins/lang/ 子目录,按语言拆分配置
- 补全引擎:nvim-cmp → blink.cmp + LuaSnip
- 文件浏览:新增 neo-tree(<Space>e)
- 语言支持:
  - Go: ray-x/go.nvim + dap-go + neotest-go
  - Rust: rustaceanvim + crates.nvim
  - Python: venv-selector + dap-python + neotest-python
  - TypeScript: typescript-tools.nvim(替换 ts_ls)
- LSP: lazydev + mason + mason-lspconfig + fidget + inc-rename
- 格式化: conform.nvim(lsp_format fallback,保存时自动格式化)
- Lint: nvim-lint(selene 替换 luacheck,Mason 可直接安装)
- UI: snacks.nvim(dashboard+notifier+picker)+ noice + lualine + bufferline
- 编辑增强: mini.ai + mini.surround + grug-far + flash + ufo + trouble v3
- 删除废弃文件: cmp/coding/null-ls/mason/lspconfig/go/python 等旧文件
- 修复: Neovim 0.12 treesitter query 校验报错(noice routes 过滤)
- 新增: NVIM_GUIDE.md 快捷键使用手册

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-07 16:55:07 +08:00

154 lines
4.0 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- autocmds.lua - 自动命令配置
local augroup = vim.api.nvim_create_augroup("MyCustomGroup", { clear = true })
-- 插入模式进出切换光标行高亮
vim.api.nvim_create_autocmd({ "InsertLeave", "WinEnter" }, {
pattern = "*",
group = augroup,
callback = function()
if vim.bo.buftype ~= "terminal" then
vim.opt_local.cursorline = true
end
end,
})
vim.api.nvim_create_autocmd({ "InsertEnter", "WinLeave" }, {
pattern = "*",
group = augroup,
callback = function()
if vim.bo.buftype ~= "terminal" then
vim.opt_local.cursorline = false
end
end,
})
-- 高亮复制文本
vim.api.nvim_create_autocmd("TextYankPost", {
pattern = "*",
group = augroup,
callback = function()
vim.highlight.on_yank({ higroup = "IncSearch", timeout = 200 })
end,
})
-- 恢复光标位置
vim.api.nvim_create_autocmd("BufReadPost", {
group = augroup,
desc = "恢复光标位置",
callback = function()
local mark = vim.api.nvim_buf_get_mark(0, '"')
local lcount = vim.api.nvim_buf_line_count(0)
if mark[1] > 0 and mark[1] <= lcount then
pcall(vim.api.nvim_win_set_cursor, 0, mark)
end
end,
})
-- 特定文件类型用 q 关闭
vim.api.nvim_create_autocmd("FileType", {
pattern = {
"qf", "help", "man", "notify", "lspinfo", "startuptime",
"tsplayground", "spectre_panel", "PlenaryTestPopup",
"checkhealth", "neotest-output", "neotest-summary",
},
group = augroup,
callback = function(event)
vim.bo[event.buf].buflisted = false
vim.keymap.set("n", "q", "<cmd>close<cr>", { buffer = event.buf, silent = true })
end,
})
-- 保存时删除行尾空白markdown 使用尾部空格表示换行,需跳过)
vim.api.nvim_create_autocmd("BufWritePre", {
pattern = "*",
group = augroup,
desc = "删除行尾空白",
callback = function()
local ft = vim.bo.filetype
if ft == "markdown" or ft == "text" or ft == "diff" then return end
local cursor_pos = vim.api.nvim_win_get_cursor(0)
local search = vim.fn.getreg("/")
vim.cmd([[%s/\s\+$//e]])
vim.fn.setreg("/", search)
vim.api.nvim_win_set_cursor(0, cursor_pos)
end,
})
-- 在外部更改时自动重新加载文件
vim.api.nvim_create_autocmd({ "FocusGained", "BufEnter", "CursorHold", "CursorHoldI" }, {
pattern = "*",
group = augroup,
callback = function()
if vim.fn.mode() ~= "c" and not vim.bo.readonly then
vim.cmd("checktime")
end
end,
})
vim.api.nvim_create_autocmd("FileChangedShellPost", {
pattern = "*",
group = augroup,
callback = function()
vim.notify("文件已被外部修改,缓冲区已重新加载", vim.log.levels.WARN)
end,
})
-- ========== 语言专用设置 ==========
vim.api.nvim_create_autocmd("FileType", {
pattern = "python",
group = augroup,
callback = function()
vim.opt_local.expandtab = true
vim.opt_local.shiftwidth = 4
vim.opt_local.tabstop = 4
vim.opt_local.softtabstop = 4
vim.opt_local.textwidth = 88
vim.opt_local.colorcolumn = "88"
end,
})
vim.api.nvim_create_autocmd("FileType", {
pattern = "go",
group = augroup,
callback = function()
vim.opt_local.expandtab = false
vim.opt_local.shiftwidth = 4
vim.opt_local.tabstop = 4
vim.opt_local.softtabstop = 4
end,
})
vim.api.nvim_create_autocmd("FileType", {
pattern = "rust",
group = augroup,
callback = function()
vim.opt_local.expandtab = true
vim.opt_local.shiftwidth = 4
vim.opt_local.tabstop = 4
vim.opt_local.softtabstop = 4
vim.opt_local.textwidth = 100
vim.opt_local.colorcolumn = "100"
end,
})
vim.api.nvim_create_autocmd("FileType", {
pattern = { "javascript", "typescript", "javascriptreact", "typescriptreact", "json", "jsonc", "html", "css", "scss", "yaml", "markdown" },
group = augroup,
callback = function()
vim.opt_local.expandtab = true
vim.opt_local.shiftwidth = 2
vim.opt_local.tabstop = 2
vim.opt_local.softtabstop = 2
end,
})
vim.api.nvim_create_autocmd("FileType", {
pattern = "make",
group = augroup,
callback = function()
vim.opt_local.expandtab = false
end,
})