101 lines
3.0 KiB
Lua
101 lines
3.0 KiB
Lua
-- =============================================================================
|
||
-- Treesitter 配置 (lua/treesitter.lua)
|
||
-- =============================================================================
|
||
-- 本模块配置 Neovim 的 Treesitter 集成,提供语法树驱动的语法高亮、
|
||
-- 代码折叠和文本对象支持。
|
||
--
|
||
-- 加载方式:
|
||
-- 由 pack.lua 通过 lazy.on_event("treesitter", "VimEnter", "*", ...) 延迟加载。
|
||
--
|
||
-- 设计要点:
|
||
-- 1. Parser 安装延迟 100ms 执行,避免阻塞 startup
|
||
-- 2. 高亮按 buffer 动态附加(FileType autocmd),只安装需要的 parser
|
||
-- =============================================================================
|
||
|
||
local M = {}
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- 预安装的 parser 列表
|
||
-- ---------------------------------------------------------------------------
|
||
-- 这些 parser 会在首次启动后延迟安装。
|
||
-- 如果某个 parser 未在此列表中,打开对应文件类型时仍可通过 nvim-treesitter
|
||
-- 的 :TSInstall 手动安装。
|
||
local ensure_installed = {
|
||
"lua",
|
||
"vim",
|
||
"vimdoc",
|
||
-- Web 前端
|
||
"javascript",
|
||
"typescript",
|
||
"tsx", -- TypeScript JSX
|
||
"jsdoc", -- JSDoc 注释
|
||
"json",
|
||
"html",
|
||
"css",
|
||
"yaml",
|
||
"kotlin",
|
||
-- 后端
|
||
"c",
|
||
"rust",
|
||
"toml",
|
||
"go",
|
||
"gomod", -- Go Modules
|
||
"gosum", -- Go Sum
|
||
"gowork", -- Go Workspaces
|
||
-- 基础设施
|
||
"dockerfile",
|
||
"make",
|
||
"markdown",
|
||
"markdown_inline",
|
||
"git_config",
|
||
"git_rebase",
|
||
"gitattributes",
|
||
"gitcommit",
|
||
"gitignore",
|
||
}
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- 模块初始化
|
||
-- ---------------------------------------------------------------------------
|
||
M.setup = function()
|
||
-- 加载 nvim-treesitter(通过 packadd 激活 opt 插件)
|
||
vim.cmd.packadd("nvim-treesitter")
|
||
local treesitter = require("nvim-treesitter")
|
||
|
||
-- 延迟安装 parser:在 startup 完成 100ms 后后台安装,
|
||
-- 避免在安装过程中阻塞编辑器。
|
||
vim.defer_fn(function()
|
||
treesitter.install(ensure_installed)
|
||
end, 100)
|
||
|
||
-- 按文件类型动态启用 treesitter 高亮。
|
||
-- 当文件的 filetype 被设置时(BufRead、:setfiletype 等),
|
||
-- 尝试查找并加载对应的 parser,成功后启用高亮。
|
||
vim.api.nvim_create_autocmd("FileType", {
|
||
pattern = "*", -- 匹配所有文件类型
|
||
callback = function(args)
|
||
local buf = args.buf
|
||
local ft = vim.bo[buf].filetype
|
||
|
||
-- 将文件类型映射到 treesitter 语言名
|
||
-- 例如 "javascriptreact" → "javascript"
|
||
local lang = vim.treesitter.language.get_lang(ft)
|
||
if not lang then
|
||
return -- 无对应语言,跳过
|
||
end
|
||
|
||
-- 尝试注册语言(如果 parser 已安装)
|
||
-- pcall 用于安全调用:parser 未安装时不会报错
|
||
local ok_add = pcall(vim.treesitter.language.add, lang)
|
||
if not ok_add then
|
||
return -- parser 未安装,跳过
|
||
end
|
||
|
||
-- 启用 treesitter 高亮
|
||
pcall(vim.treesitter.start, buf, lang)
|
||
end,
|
||
})
|
||
end
|
||
|
||
return M
|