nvim-treesitter/nvim-treesitter

GitHub: nvim-treesitter/nvim-treesitter

Neovim 的 Tree-sitter 配置插件,通过语法树解析提供精准的代码高亮、折叠与缩进等编辑功能。

Stars: 13628 | Forks: 1241

nvim-treesitter

`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, 云安全监控, 代码折叠, 代码解析, 代码高亮, 增量解析, 开发工具, 开源项目, 插件, 文本编辑器, 编辑器, 缩进, 语法树, 语法高亮, 语言支持, 静态分析