首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止vim动态更新折叠

停止vim动态更新折叠
EN

Stack Overflow用户
提问于 2014-01-22 10:36:12
回答 3查看 2.6K关注 0票数 9

有没有办法阻止vim在飞行中自动更新褶皱?我真的很喜欢vim的折叠,我更喜欢使用语法模式,这样就可以在我输入时创建折叠。但是,例如,当我编码C++并编写一个括号{它会自动关闭所有后续的折叠,当我再次用}关闭括号时,vim会自动展开所有后续的折叠,这意味着我必须重新修改所有的内容。

另一个相关的问题是,如果我在一个不同的缓冲区中打开同一个文档,比如我已经运行了":split",那么编写一个打开的括号{将所有的折叠嵌套在我打开括号的折叠下面,然后关闭它将取消嵌套,但也关闭所有的折叠。如果我用“。”或者"->“来访问一个成员函数/变量,它将缓冲区中的所有折叠重置为无论当前折叠级别是什么,而不管我自己打开/关闭了哪些折叠。

当我在两个缓冲区中打开同一个文档时,这样我就可以在编写另一个函数时读取另一个函数的内容,这有点令人沮丧,因为我必须不断地切换缓冲区并重新打开我的折叠。

在我的.vimrc里

代码语言:javascript
复制
set foldmethod=syntax

仅此而已。对于自动完成,我使用clang-complete和supertab与:

代码语言:javascript
复制
let g:SuperTabDefaultCompletionType = "<c-x><c-u><c-p>"

我认为这是影响这一切的一切。

编辑:

添加了一些图片来说明这个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-03 11:13:51

这两个问题都可以通过以下两个autocmd来解决:

代码语言:javascript
复制
autocmd InsertLeave,WinEnter * setlocal foldmethod=syntax
autocmd InsertEnter,WinLeave * setlocal foldmethod=manual

这将在输入插入模式或其窗口(缓冲区显示)离开时将缓冲区本地'foldmethod'设置为manual,并在保留插入模式或输入其窗口时将其设置为syntax

这是因为将'foldmethod'设置为manual将保持syntax自动创建的折叠,就像您自己设置它们一样(手动),并且手动折叠不会根据文件的语法进行更新。

我在这个解决方案中发现了两个bug:

  1. 在插入模式下切换窗口时,autocmd将为新窗口将'foldmethod'设置为syntax,即使它处于插入模式,并且应该设置为manual。 这对我来说并不是什么问题,因为我像一个文明人一样使用Vim,默认情况下在正常模式下工作。
  2. 什么时候
代码语言:javascript
复制
- a new buffer is created (e.g. by reading a file)
- and `'foldlevel'` is `0`
- and a particular syntax is used (I'm able to duplicate the issue with a C file)
- and the `o` or `O` command is used to enter insert mode **for the first time in that buffer** (doing `i<esc>o` does not duplicate the bug),

然后,光标下方的所有折叠都将被打开。

在测试上述解决方案时,我意外地发现了这一点,现在回头看,我发现了它,这一点几乎不值得提及。我不打算尝试编写一个具有复制错误所需的确切语法的测试文件,因此对于另一个eon来说,这一点可能会被忽略。

实际上,我在几个月前发现了这个问题,并使用了一段时间的解决方案Ben 连在一起,直到最终对一个缓冲区问题(您的第二个问题)的多个窗口感到非常恼火。

所以感谢本的解决方案,感谢你问这个问题!

票数 5
EN

Stack Overflow用户

发布于 2017-02-17 00:55:41

我对user4830797的答案做了一些修改,这有助于处理您正在编辑的文件不使用foldmethod=syntax的情况(例如,可能使用foldmethod=marker的.vimrc文件):

代码语言:javascript
复制
autocmd InsertLeave,WinEnter * let &l:foldmethod=g:oldfoldmethod
autocmd InsertEnter,WinLeave * let g:oldfoldmethod=&l:foldmethod | setlocal foldmethod=manual
票数 3
EN

Stack Overflow用户

发布于 2014-01-23 03:56:36

如果您暂时将foldmethod设置为手动,那么Vim将保持当前由语法定义的所有折叠,并将它们保持在当前所处的完全打开/关闭状态。这可以使用InsertEnter自动can自动完成,并在InsertLeave上恢复,以保护单个窗口中的折叠状态。不幸的是,我还没有花时间让它在拆分窗口中工作,但是使用窗口局部变量可以很容易地计算出用户切换窗口或其他东西而不离开插入模式。有关详细信息和讨论,请参见文本

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21280457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档