有没有办法阻止vim自动更新折叠?我真的很喜欢vim的折叠,我更喜欢在语法模式下使用它,以便在我输入时创建折叠。但是,例如当我编写C ++并编写一个括号{它会自动关闭所有后续折叠,然后当我再次使用}关闭括号时,vim会自动扩展所有后续折叠,这意味着我必须重新折叠所有内容。
另一个相关的问题,如果我在不同的缓冲区中打开相同的文档,说我已经运行“:split”,然后写一个开括号{将所有折叠嵌套在我打开支架的折叠下的缓冲区中关闭它将取消嵌套折叠,但也关闭所有折叠。如果我使用“。”或“ - >”要访问成员函数/变量,它会将缓冲区中的所有折叠重置为当前折叠级别,无论我自己打开/关闭哪个折叠。
当我在两个缓冲区中打开相同的文档时,这有点令人沮丧,因此我可以在写另一个函数时读取一个函数的内容,因为我经常不得不切换缓冲区并重新打开我的折叠。
在我的.vimrc中我有
set foldmethod=syntax
就是这样。对于自动完成,我使用clang-complete和supertab:
let g:SuperTabDefaultCompletionType = "<c-x><c-u><c-p>"
我认为这就是影响这一点的一切。
编辑:
答案 0 :(得分:5)
这两个问题都可以通过以下两个autocmd
来解决:
autocmd InsertLeave,WinEnter * setlocal foldmethod=syntax
autocmd InsertEnter,WinLeave * setlocal foldmethod=manual
当输入插入模式或其窗口(缓冲区显示)保留时,将缓冲区本地'foldmethod'
设置为manual
,并在插入模式时将其设置为syntax
或它的窗口进入。
这是有效的,因为将'foldmethod'
设置为manual
将保留由syntax
自动创建的折叠,就像您自己设置(手动)一样,并且不会根据语法更新手动折叠该文件。
我发现这个解决方案有两个错误:
在插入模式下切换窗口时,autocmd
会为新窗口设置'foldmethod'
到syntax
,即使它处于插入模式且应设置为manual
。
这对我来说并不是一个问题,因为我像文明人一样使用Vim,默认情况下以正常模式运行。
当
'foldlevel'
为0
o
或O
命令用于首次在该缓冲区中输入插入模式 (执行i<esc>o
不会复制该错误) ,然后将打开光标下方的所有折叠。
我在测试上述解决方案时偶然发现了这一点,现在回头看,我惊讶地发现了它;它几乎不值得一提。我并不打算尝试编写一个具有复制错误所需的确切语法的测试文件,因此这可能会被另一个eon忽略。
几个月前我实际上发现了这个问题并且使用了解{Ben} {{}}}一段时间,然后最终厌倦了多个窗口的一个缓冲区问题(第二个问题)来修复它。
感谢Ben的解决方案,以及你提出这个问题的答案!
答案 1 :(得分:3)
我对user4830797的回答做了一些修改,这有助于处理您正在编辑的文件没有使用foldmethod=syntax
的情况(例如,.vimrc文件)可能使用foldmethod=marker
):
autocmd InsertLeave,WinEnter * let &l:foldmethod=g:oldfoldmethod
autocmd InsertEnter,WinLeave * let g:oldfoldmethod=&l:foldmethod | setlocal foldmethod=manual
答案 2 :(得分:0)
我认为你需要检查:h 'foldlevel
。您也可以使用:mkview
,可能在autocmd
中恢复手动打开和关闭折叠。
除此之外,您应该在不同的文件类型上设置不同的折叠方法(例如在C上,您可以将其设置为手动或标记)
答案 3 :(得分:0)
如果您暂时将foldmethod设置为手动,那么Vim将保留当前由语法定义的所有折叠,并将它们保持在您现在拥有的完全打开/关闭状态。这可以使用InsertEnter autocmd自动完成,并在InsertLeave上恢复,以在单个窗口中保护折叠状态。不幸的是,我还没有花时间尝试让它在分割窗口中工作,但是使用窗口局部变量很容易甚至考虑用户切换窗口或其他东西而不离开插入模式。有关详细信息和讨论,请参阅http://vim.wikia.com/wiki/Keep_folds_closed_while_inserting_text。