有没有办法阻止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就好像您自己设置(手动),并且不会根据文件的语法更新手动折叠.
我发现这个解决方案有两个错误:
当切换窗口,同时在插入模式中,autocmd将设置'foldmethod'到syntax新的窗口,即使它是在插入模式和应设置为manual.
这对我来说不是一个问题,因为我像文明人一样使用Vim,默认情况下以正常模式运行.
什么时候
'foldlevel'是0oor O命令用于在该缓冲区中第一次进入插入模式(执行i<esc>o不复制错误),然后将打开光标下方的所有折叠.
我在测试上面的解决方案时偶然发现了这个,现在回头看,我很惊讶我找到了它; 它几乎不值得一提.我不打算尝试编写一个具有复制错误所需的确切语法的测试文件,因此这可能会被另一个eon忽略.
几个月前我实际上发现了这个问题并使用了Ben 链接的解决方案一段时间,然后最终厌倦了多个窗口的一个缓冲区问题(第二个问题)来修复它.
所以感谢Ben的解决方案,以及你提出这个问题!