有没有办法一次使用多种 vim 折叠方法?

And*_*ier 16 vim

我已经foldmethod=indent设置了我的~/.vimrc,一般来说这对我有用,我想保留它。

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

有没有另一种方法可以实现这一点(理想情况下使用嵌入在文件本身中的东西)?

Ing*_*kat 12

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

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

/* vim: set fdm=manual : */
Run Code Online (Sandbox Code Playgroud)

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

由于这可能不是您想听到的,您可以将一些内容与:autocmd CursorMoved根据当前行切换折叠方法的hack 一起使用:

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