0

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 (Tip 282) 中找到了我想实现的以下“简单折叠”(在提示页面的底部):

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

我怎样才能让它们在我的 .vimrc 中和平共存?

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

谢谢你的帮助

4

1 回答 1

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

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

于 2013-08-31T12:09:14.790 回答