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


14

我已经foldmethod=indent设置好了~/.vimrc,并且总的来说对我有用,我想保留它。

但是,我有一些文件要定期编辑(并由我独占控制),我想在其中添加基于标记的系统,尤其是当我打开文件时,很少看(已经用缩进来“定界”)是预先折叠的。看起来foldmethod=marker我可以这样做(如果需要的话,我不介意文件中的奇数注释来指示这些“预折叠”),但是我仍然想进行foldmethod=indent设置以便可以使用zczo等等。通过缩进折叠或展开部分。据我所知,我不能将foldmethod设置为多个值。

有没有其他方法可以实现此目的(理想情况下,是使用文件本身中嵌入的内容)?


我也试图同时使标记和缩进的折叠方法同时工作。我也相信使用fold表达式是最好的选择。您是否找到同时匹配缩进和标记的表达式?
Jp_

1
@Jp_不,'不害怕。
安德鲁·费里尔

Answers:


10

每个窗口可以具有自己的局部值'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. 通过modeline在文件本身内部(因为无论如何您都必须添加标记,所以我更愿意这样做):

/* vim: set fdm=manual : */

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

由于这可能不是您想要听到的,因此您可以与hack一起,:autocmd CursorMoved根据当前行切换foldmethod:

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

1
谢谢。因此,这告诉我可以将foldmethod设置为该缓冲区内的标记。但是我正在寻找的东西,仍然允许我使用缩进使用foldmethod,而有一些部分(这由缩进分隔)预折叠。如果我按照上述(4)进行操作,则zczo等等将不再能在该缓冲区中正常工作。我已经澄清了我的问题。
安德鲁·费里尔

在此方面,您的问题尚不清楚,谢谢您的澄清。我已经修改了答案。
Ingo Karkat 2013年

是的,如果我不清楚的话,我们深表歉意。foldexpr听起来是最好的方法,但也很复杂。不过,我会尝试一下。+1为指针。
安德鲁·费里尔

再次感谢。我一直在尝试写foldexpr并开通此相关的Q可能会感兴趣:superuser.com/questions/560167/...
安德鲁·费里尔

@IngoKarkat:在该行下面的第一段中,您写道,每个缓冲区只能有一个fold方法。我认为应该按窗口显示
garyjohn 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.