Treesitter 和语法折叠

问题描述 投票:0回答:1

不确定这是否众所周知,但我花了几个小时搜索文档、堆栈溢出和 Reddit,但从未找到明确的解释。所以我将其发布在这里,以防其他人面临同样的问题。

情况:我同时使用vim和neovim,配置基本相同,只是我在neovim中使用tree sitter来突出显示。我主要用 C 编程。

问题:我正在研究代码折叠,注意到语法折叠在 vim 中有效,但在 neovim 中无效。我在任何地方都找不到明确的描述。也许我没有使用正确的搜索词。但是关于语法折叠的每个问题都可以通过在 ftplugin 或其他文件中添加一些行来回答。所有解决方案都不适合我。

我将我的解决方案记录在下面作为答案,并希望其他人有更优雅的解决方案。

neovim folding treesitter
1个回答
0
投票

分析:原来,问题就隐藏在tree Sitter neovim文档中的这些句子中

-- Setting this to true will run `:h syntax` and tree-sitter at the same time. 
-- Set this to `true` if you depend on 'syntax' being enabled (like for indentation). 
-- Using this option may slow down your editor, and you may see some duplicate highlights. 
-- Instead of true it can also be a list of languages     
additional_vim_regex_highlighting = false,

这意味着,即使你正确配置了语法代码折叠,即

filetype plugin indent on 
syntax on

并执行各种堆栈溢出答案所建议的所有奇怪的其他内容,当您搜索“c的语法折叠无法工作vim”或类似内容时,一旦您启用treesitter,打开突出显示并设置

additional_vim_regex_highlighting = false
,部分语法已关闭。现在代码折叠不起作用。

这里让我困扰的是,从选项名称(仅意味着禁用正则表达式突出显示)中并不清楚它也会影响折叠!

棘手的解决方案 1: 好吧,也许简单的解决方案是将附加的正则表达式突出显示为 true。但这是低效的,并且肯定会减慢一切。那该怎么办?

棘手的解决方案2:我们可以使用treesitter折叠来代替。我们开始吧,来自文档

set foldmethod=expr
set foldexpr=nvim_treesitter#foldexpr()
set nofoldenable                     " Disable folding at startup.

问题解决了,对吧?错了!

这只会启用 Treesitter 支持的语言的折叠。 支持对于护树人意味着什么?再次来自文档:

让 nvim-treesitter 支持特定的特定功能 语言需要该语言的解析器和适当的 该功能的特定于语言的查询文件。

这意味着,您必须安装所有可能的解析器并在树管理员设置中启用它,以便为 vim 默认支持的每种语言启用语法折叠。

可接受的解决方案号 3: 所以我们想要的是,对那些启用了 treesitter 的语言使用 treesitter 折叠,并对所有其他语言使用 vims 语法折叠。这可以通过以下方式实现

autocmd Filetype c,cpp,rust,python setlocal foldmethod=expr
autocmd Filetype c,cpp,rust,python setlocal foldexpr=nvim_treesitter#foldexpr()

filetype plugin indent on 
syntax on

lua <<EOF
require'nvim-treesitter.configs'.setup {
  highlight = {
    enable = true,
    additional_vim_regex_highlighting = false,
  },
}

并安装 c、cpp、rust 和 python 的解析器。这个解决方案对我有用,我想是可以接受的。如果有人有更优雅的解决方案,请随时将其作为另一个答案发布。

© www.soinside.com 2019 - 2024. All rights reserved.