搜索模式并在gvim中折叠匹配的行

时间:2018-07-23 17:49:19

标签: search vim collapse code-folding


嗨,

我想在搜索后折叠行集,如下所示,

  

还可以通过以下步骤使用鼠标打开和关闭折痕:

     
      
  • 单击'+'打开此行的闭合折页。

  •   
  • 单击任何其他非空白字符以关闭此行的打开折页

  •   

我要搜索点击并折叠所有匹配的行。

  

还可以通过以下步骤使用鼠标打开和关闭折痕:

     

+-

有一种方法可以折叠vim中不匹配的模式,在搜索了一个模式后,我们可以使用“ \ z”键折叠不匹配的模式。

nnoremap \z :setlocal foldexpr=(getline(v:lnum)=~@/)?0:(getline(v:lnum-1)=~@/)\\|\\|(getline(v:lnum+1)=~@/)?1:2 foldmethod=expr foldlevel=0 foldcolumn=2<CR> 是否有相反的选择?只是找到一个模式而崩溃?

2 个答案:

答案 0 :(得分:1)

我正在对neovim使用以下配置,我认为也应与常规vim一起使用:

nnoremap \Z :setlocal foldexpr=(getline(v:lnum)=~@/)?0:1 foldmethod=expr foldlevel=0 foldcolumn=2 foldminlines=0<CR><CR>
nnoremap \z :setlocal foldexpr=(getline(v:lnum)=~@/)?1:0 foldmethod=expr foldlevel=0 foldcolumn=2 foldminlines=0<CR><CR>

\z:根据上一次搜索折叠匹配表达式
\Z:折叠与上次搜索匹配的NOT的任何内容

当我想查看所有评论或根本不评论时,这很有用, 首先执行\并搜索^#(如果这是您的语言的注释开始符号),请按回车键,然后按上述进行折叠。

编辑:如果需要,您可能需要添加以下内容以将折页重置为手动:
nnoremap \F :setlocal foldmethod=manual<CR><CR>

答案 1 :(得分:0)

我在reddit vim论坛上从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>

希望这会有所帮助。