在不应用foldlevel的情况下重新计算vim中的折叠

在不应用foldlevel的情况下重新计算vim中的折叠,vim,neovim,folding,Vim,Neovim,Folding,我正在尝试将neovim设置为python IDE,但在使折叠按我所希望的方式工作时遇到了一些问题 我的设置: NVIM 0.4.3 插入“Konfekt/FastFold” 插入“tmhedberg/SimpylFold” nnoremap za使用空格键切换折叠 我的问题是,当我在insert模式下编辑文件时,SimpylFold似乎不会重新计算折叠。因此,我使用插入模式添加到文件中的任何函数或类都只会说E490:No fold found。奇怪的是,如果我选择我添加的线,删除它们并撤消,那

我正在尝试将neovim设置为python IDE,但在使折叠按我所希望的方式工作时遇到了一些问题

我的设置:
NVIM 0.4.3
插入“Konfekt/FastFold”

插入“tmhedberg/SimpylFold”

nnoremap za
使用空格键切换折叠

我的问题是,当我在
insert
模式下编辑文件时,SimpylFold似乎不会重新计算折叠。因此,我使用插入模式添加到文件中的任何函数或类都只会说
E490:No fold found
。奇怪的是,如果我选择我添加的线,删除它们并撤消,那么折叠就可以正确识别。在
normal
模式下粘贴功能也能正确检测新折叠。因此,该问题似乎仅在
insert
模式下添加行时出现

以下是我目前所知道的:

  • 我尝试过
    :set foldmethod=indent
    ,但它没有达到我想要的功能

  • zx
    强制重新计算褶皱。这确实有效,但问题是它将
    foldlevel
    重新应用到整个缓冲区,这将撤消我使用空格所做的所有手动折叠切换。在文档中找不到任何关于重新计算折叠而不重新应用
    foldlevel

据我所知,vim中的每一行都有一个
foldlevel
,它决定了该行所属的折叠级别。。例如,python中所有未缩进的行都具有
foldlevel=0
,那么整个缓冲区也具有一个foldlevel,它确定了实际折叠的级别。。因此,如果缓冲区的
foldlevel
设置为1,则
foldlevel
为1或更多的所有行都将被折叠。
我用来手动切换特定折叠的
za
命令似乎在一个与所有这些
foldlevel
内容分离的层上运行,当使用
zx
重新计算折叠时,所有从
za
手动折叠/展开的内容都会丢失


不管怎样,请纠正我,如果我错了,几周前我就切换到Linux(和它,vim),所以我离你认为的专家很远。

我也有这个问题,你找到了解决方法吗?不,我只是在我的工作流程中减少了对折叠的依赖,每当一些VIM用户说“VIM能做任何事情”时,我就默默地喃喃自语。我已经找到了解决办法。这是一种黑客行为,但它是有效的。将其放入.vimrc(或init.vim):
au InsertLeave,TextChanged*.py set foldmethod=expr
。它只是在您每次离开插入模式或在正常模式下更改文本(使用dd、yy p等)时设置折叠方法,这也会迫使它重新计算折叠。它的效果比人们推荐的要好得多,它只是在运行:e!每一次,或者zx,它重新应用foldleve,正如你所说的。在退出插入模式时可能会导致一些延迟,但我没有注意到任何延迟。这对您有用吗?如果有,我可以添加它作为答案。FastFold在插入模式下禁用折叠的重新计算。特别是,它将覆盖所有手动折叠。因此,不加载FastFold应该可以解决您的问题。我也有这个问题,您找到解决方案了吗?没有,我已经开始在我的工作流程中减少对Fold的依赖,每当有vim用户说“vim可以做任何事情”时,我都会悄悄地自言自语,我实际上已经找到了解决方案。这是一种黑客行为,但它是有效的。将其放入.vimrc(或init.vim):
au InsertLeave,TextChanged*.py set foldmethod=expr
。它只是在您每次离开插入模式或在正常模式下更改文本(使用dd、yy p等)时设置折叠方法,这也会迫使它重新计算折叠。它的效果比人们推荐的要好得多,它只是在运行:e!每一次,或者zx,它重新应用foldleve,正如你所说的。在退出插入模式时可能会导致一些延迟,但我没有注意到任何延迟。这对您有用吗?如果有,我可以添加它作为答案。FastFold在插入模式下禁用折叠的重新计算。特别是,它将覆盖所有手动折叠。因此,不加载FastFold应该可以解决您的问题。