nvim-treesitter/nvim-treesitter
GitHub: nvim-treesitter/nvim-treesitter
Neovim 的 Tree-sitter 配置插件,通过语法树解析提供精准的代码高亮、折叠与缩进等编辑功能。
Stars: 13628 | Forks: 1241
`nvim-treesitter` 插件提供
1. 用于安装、更新和移除 [**tree-sitter parsers**](SUPPORTED_LANGUAGES.md) 的函数;
2. 一组 **queries**,用于为这些语言启用 Neovim 内置的 tree-sitter 功能;
3. 一个 [基于 treesitter 的功能](#Supported-features) 的试验场,这些功能正考虑向上游合并到 Neovim。
有关这些功能的详细信息以及如何帮助改进它们,请参阅 [CONTRIBUTING.md](./CONTRIBUTING.md)。
# 快速开始
## 需求
- Neovim 0.12.0 或更高版本(nightly)
- 路径中有 `tar` 和 `curl`
- [`tree-sitter-cli`](https://github.com/tree-sitter/tree-sitter/blob/master/crates/cli/README.md)(0.26.1 或更高版本,通过你的包管理器安装,**不要使用 npm**)
- 路径中有 C 编译器(参见
)
## 安装
你可以使用你喜欢的包管理器安装 `nvim-treesitter`(或者使用 vim 原生的 `package` 功能,参见 `:h packages`)。
此插件仅保证与特定版本的语言解析器**(在 `parser.lua` 表中指定)**一起工作。**升级插件时,你必须确保所有已安装的解析器通过 `:TSUpdate` 更新到最新版本**。
强烈建议将此自动化;例如,使用以下 [lazy.nvim](https://github.com/folke/lazy.nvim) 配置:
```
{
'nvim-treesitter/nvim-treesitter',
lazy = false,
build = ':TSUpdate'
}
```
## 配置
可以通过调用 `setup` 来配置 `nvim-treesitter`。**`nvim-treesitter` 使用默认值工作,你不需要调用 `setup`。**
```
require('nvim-treesitter').setup {
-- Directory to install parsers and queries to (prepended to `runtimepath` to have priority)
install_dir = vim.fn.stdpath('data') .. '/site'
}
```
然后可以安装解析器和查询:
```
require('nvim-treesitter').install { 'rust', 'javascript', 'zig' }
```
(如果解析器已经安装,这是一个空操作)。请注意,此函数是异步运行的;要在脚本上下文(“引导”)中进行同步安装,你需要 `wait()` 等待它完成:
```
require('nvim-treesitter').install({ 'rust', 'javascript', 'zig' }):wait(300000) -- wait max. 5 minutes
```
查看 [`:h nvim-treesitter-commands`](doc/nvim-treesitter.txt) 获取所有可用命令的列表。
# 支持的语言
要使 `nvim-treesitter` 支持特定语言的特定功能,需要该语言的解析器以及该功能相应的特定语言查询文件。
当前支持的语言列表可以在 [此页面](SUPPORTED_LANGUAGES.md) 找到。如果你希望添加新语言或改进现有语言的查询,请参阅我们的 [贡献指南](CONTRIBUTING.md)。
# 支持的功能
`nvim-treesitter` 为以下功能提供查询。**这些功能不会自动启用。**
## 高亮
Treesitter 高亮由 Neovim 提供,参见 `:h treesitter-highlight`。要为某个文件类型启用它,请将 `vim.treesitter.start()` 放在配置目录中的 `ftplugin/.lua` 里,或者将以下内容放入你的 `init.lua`:
```
vim.api.nvim_create_autocmd('FileType', {
pattern = { '' },
callback = function() vim.treesitter.start() end,
})
```
## 折叠
基于 Treesitter 的折叠由 Neovim 提供。要启用它,请将以下内容放入你的 `ftplugin` 或 `FileType` 自动命令中:
```
vim.wo[0][0].foldexpr = 'v:lua.vim.treesitter.foldexpr()'
vim.wo[0][0].foldmethod = 'expr'
```
## 缩进
基于 Treesitter 的缩进由此插件提供,但被视为**实验性**功能。要启用它,请将以下内容放入你的 `ftplugin` 或 `FileType` 自动命令中:
```
vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
```
(注意使用的特定引号。)
## 注入
注入用于多语言文档,参见 `:h treesitter-language-injections`。无需设置。
## 局部变量
这些查询可用于查找给定范围内标识符的定义和引用。它们不在此插件中使用,提供是为了(有限的)向后兼容性。
# 高级配置
## 添加自定义语言
如果你有一个不在支持语言列表中的解析器(无论是作为 Github 上的仓库还是本地目录),你可以按如下方式手动添加它以供 `nvim-treesitter` 使用:
1. 在 `User TSUpdate` 自动命令中添加以下代码片段:
```
vim.api.nvim_create_autocmd('User', { pattern = 'TSUpdate',
callback = function()
require('nvim-treesitter.parsers').zimbu = {
install_info = {
url = 'https://github.com/zimbulang/tree-sitter-zimbu',
revision = , -- commit hash for revision to check out; HEAD if missing
-- optional entries:
branch = 'develop', -- only needed if different from default branch
location = 'parser', -- only needed if the parser is in subdirectory of a "monorepo"
generate = true, -- only needed if repo does not contain pre-generated `src/parser.c`
generate_from_json = false, -- only needed if repo does not contain `src/grammar.json` either
queries = 'queries/neovim', -- also install queries from given directory
},
}
end})
```
或者,如果你有本地检出版本,你可以改用
```
install_info = {
path = '~/parsers/tree-sitter-zimbu',
-- optional entries
location = 'parser',
generate = true,
generate_from_json = false,
queries = 'queries/neovim', -- symlink queries from given directory
},
```
这将始终按原样使用目录的状态(即,将忽略 `branch` 和 `revision`)。
2. 如果解析器名称与 Neovim 使用的文件类型不同,你需要通过以下方式注册解析器:
```
vim.treesitter.language.register('zimbu', { 'zu' })
```
如果 Neovim 默认未检测到你语言的文件类型,你可以使用 [Neovim 的 `vim.filetype.add()`]() 添加自定义检测规则。
3. 启动 `nvim` 并运行 `:TSInstall zimbu`。
### 修改解析器
你可以使用相同的方法来覆盖解析器信息。例如,如果你总是想从 grammar 生成 `lua` 解析器,请添加
```
vim.api.nvim_create_autocmd('User', { pattern = 'TSUpdate',
callback = function()
require('nvim-treesitter.parsers').lua.install_info.generate = true
end})
```
## 添加查询
查询可以放置在 `runtimepath` 中任何位置的 `queries/` 下,除非查询标记了 `; extends`,否则前面的目录优先;参见 [`:h treesitter-query-modelines`](https://neovim.io/doc/user/treesitter.html#treesitter-query-modeline)。标签:DNS解析, LSP, Lua, Neovim, Nvim, rizin, SOC Prime, Tree-sitter, Vim, 云安全监控, 代码折叠, 代码解析, 代码高亮, 增量解析, 开发工具, 开源项目, 插件, 文本编辑器, 编辑器, 缩进, 语法树, 语法高亮, 语言支持, 静态分析