两个foldexpr可以在我的.vimrc中共存吗?

时间:2013-08-31 10:33:32

标签: vim folding

1)我在我的.vimrc中有一个fold expr(参见:help fold-expr部分下的第三个例子),它将段落的折叠用空行分隔:

set foldmethod=expr
set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1

我的大部分文件都是包含段落的文件(以我的.vimrc开头)

2)但是我有两个或三个文本文件,它们只是没有段落的列表,我希望能够将除匹配之外的所有内容折叠到我的搜索中。我在Vim Wikia(提示282)中找到了我想要实现的以下“简单折叠”(在提示页面的底部):

:set foldexpr=getline(v:lnum)!~@/
:nnoremap <F8> :set foldmethod=expr<CR><Bar>zM

我怎么能在我的.vimrc中和平共存?

  • 是setlocal(第二个foldexpr)解决方案吗?试过,失败了......
  • 是否可以将折叠表达式(第二个)仅应用于两个文件(file1.txt,file2.txt)?
  • 是否可以将2个foldexpr合并为一个?

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

选项foldexpr是窗口的本地,所以:

  • :set将建立全球和本地价值观。全局值将用作未指定本地值的后续窗口的默认值。
  • :setlocal将仅确定本地值。

我不清楚合并两个表达式是什么意思,但当然你可以创建一个包含你想要的所有复杂逻辑的折叠函数。

根据文件(或文件类型),为foldexpr设置不同的值非常简单。为此使用自动命令。

所以,整个事情可能就是你的.vimrc:

" Default: for all files
set foldmethod=expr
set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
nnoremap <F8> :setlocal foldmethod=expr<CR><Bar>zM

" Only for specific files
augroup NonDefaultFoldMethod
    autocmd!
    autocmd BufNewFile,BufRead file1.txt,file2.txt setlocal foldexpr=getline(v:lnum)!~@/
augroup end

augroup/autocmd!成语只是为了避免重复自动命令,如果您重复使用.vimrc。这是建立自动命令时的最佳实践。