有没有办法可以同时使用多种 vim 折叠方法?

有没有办法可以同时使用多种 vim 折叠方法?

我已经foldmethod=indent在我的中设置了~/.vimrc,并且通常这对我有用并且我想保留它。

但是,我有一些经常编辑的文件(并且这些文件完全由我控制),我想在其中添加基于标记的系统,特别是当我打开文件时,我很少查看的一大块(已经通过缩进“分隔”)会被预折叠。它看起来foldmethod=marker允许我这样做(如果需要,我不介意在文件中添加一些奇怪的注释来指示这些“预折叠”),但我仍然希望foldmethod=indent设置,以便我可以使用zczo等按缩进折叠或展开部分。据我所知,我无法将 foldmethod 设置为多个值。

还有其他方法可以实现这一点吗(最好使用文件本身中嵌入的东西)?

答案1

每个窗户可以有自己的本地值'foldmethod';您设置的~/.vimrc只是全局默认值。有多种方法可以为特定缓冲

  1. 手动:setlocal foldmethod=marker
  2. 对于特定文件类型(例如 Java 文件):(:autocmd FileType java setlocal foldmethod=marker或在~/.vim/after/ftplugin/java.vim
  3. 对于特定文件::autocmd BufRead /path/to/file setlocal foldmethod=marker
  4. 在文件本身中通过模式行(因为无论如何你都必须添加标记,所以我更喜欢这样):

/* vim: set fdm=manual : */

仍然只能有一种折叠方法里面单个窗口。如果您想采用不同的策略,您必须选择一种更灵活的方法(例如expr),并在其中重新实现“其他”方法(例如,通过考虑'foldexpr'缩进)。或者,您可以对同一缓冲区使用两个窗口拆分,并为每个拆分设置不同的折叠方法。

由于这可能不是您想听到的,因此您可以将某些内容与:autocmd CursorMoved根据当前行切换折叠方法的内容结合起来:

" Use markers when in the first 100 lines, else use indent.
:autocmd CursorMoved,CursorMovedI <buffer> let &l:foldmethod = (line('.') <= 100 ? 'manual' : 'indent')

相关内容