阻止vim动态更新折叠

Jon*_*aen 8 vim

有没有办法阻止vim自动更新折叠?我真的很喜欢vim的折叠,我更喜欢在语法模式下使用它,以便在我输入时创建折叠.但是,例如当我编写C++并编写一个括号{它会自动关闭所有后续折叠,然后当我再次使用}关闭括号时,vim会自动扩展所有后续折叠,这意味着我必须重新折叠所有内容.

另一个相关的问题,如果我在不同的缓冲区打开相同的文档,说我已经运行":split",然后写一个开括号{将所有折叠嵌套在我打开括号的折叠下的缓冲区中,并关闭它会解开折叠,但也会关闭所有折叠.如果我使用"." 或者" - >"访问成员函数/变量,它将缓冲区中的所有折叠重置为当前折叠级别,无论我自己打开/关闭哪个折叠.

当我在两个缓冲区中打开相同的文档时,这有点令人沮丧,因此我可以在写另一个函数时读取一个函数的内容,因为我经常不得不切换缓冲区并重新打开我的折叠.

在我的.vimrc中我有

set foldmethod=syntax
Run Code Online (Sandbox Code Playgroud)

这就是它.对于自动完成,我使用clang-complete和supertab:

let g:SuperTabDefaultCompletionType = "<c-x><c-u><c-p>"
Run Code Online (Sandbox Code Playgroud)

我认为这就是影响这一点的一切.

编辑:

添加了一些图片来帮助说明问题

小智 5

以下两个问题可以解决这两个问题autocmd:

autocmd InsertLeave,WinEnter * setlocal foldmethod=syntax
autocmd InsertEnter,WinLeave * setlocal foldmethod=manual
Run Code Online (Sandbox Code Playgroud)

这将设置缓冲器本地'foldmethod'manual当输入或它的窗口(缓冲显示)被留下插入模式,并将其设置为syntax当插入模式是左或输入其窗口.

这是有效的,因为设置'foldmethod'manual将自动创建折叠,syntax就好像您自己设置(手动),并且不会根据文件的语法更新手动折叠.

我发现这个解决方案有两个错误:

  1. 当切换窗口,同时在插入模式中,autocmd将设置'foldmethod'syntax新的窗口,即使它是在插入模式和应设置为manual.

    这对我来说不是一个问题,因为我像文明人一样使用Vim,默认情况下以正常模式运行.

  2. 什么时候

    • 创建一个新缓冲区(例如通过读取文件)
    • 并且'foldlevel'0
    • 并使用特定的语法(我能够用C文件复制问题)
    • 并且oor O命令用于在该缓冲区中第一次进入插入模式(执行i<esc>o不复制错误),

    然后将打开光标下方的所有折叠.

    我在测试上面的解决方案时偶然发现了这个,现在回头看,我很惊讶我找到了它; 它几乎不值得一提.我不打算尝试编写一个具有复制错误所需的确切语法的测试文件,因此这可能会被另一个eon忽略.


几个月前我实际上发现了这个问题并使用了Ben 链接的解决方案一段时间,然后最终厌倦了多个窗口的一个缓冲区问题(第二个问题)来修复它.

所以感谢Ben的解决方案,以及你提出这个问题!