mirror of
https://github.com/d0zingcat/dotfiles.git
synced 2026-05-13 15:09:34 +00:00
- 架构重构:新增 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>
154 lines
4.0 KiB
Lua
154 lines
4.0 KiB
Lua
-- 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,
|
||
})
|