我从RedditVim论坛的Reddit用户那里得到了这个问题的答案。
https://www.reddit.com/r/vim/comments/91qz90/search_a_pattern_and_fold_the_matching_lines_in/
function! FoldSearchPattern() abort
if !exists('w:foldpatterns')
let w:foldpatterns=[]
setlocal foldmethod=expr foldlevel=0 foldcolumn=2
endif
if index(w:foldpatterns, @/) == -1
call add(w:foldpatterns, @/)
setlocal foldexpr=SetFolds(v:lnum)
endif
endfunction
function! SetFolds(lnum) abort
for pattern in w:foldpatterns
if getline(a:lnum) =~ pattern
if getline(a:lnum + 1) !~ pattern
return 's1'
else
return 1
endif
endif
endfor
endfunction
nnoremap \z :call FoldSearchPattern()<CR>
希望能有所帮助。