Folding with Regular Expression (转载)

<!-- start content -->


From: http://vim.wikia.com/wiki/VimTip282

created  2002 · complexity  basic · author  Chris Butler · version  6.0


When searching with / , it would sometimes be nice to fold everything except for matches to your search. The following code does this, providing two levels of folding to allow you to show some context around each search match as well.

Contents

[show ]

<script type="text/javascript">wgAfterContentAndJS.push(function() { if (window.showTocToggle) { window.tocShowText = &quot;show&quot;; window.tocHideText = &quot;hide&quot;; showTocToggle();}});</script>

[edit ] Using a '/' search and key mapping

Add the following to your vimrc to provide a mapping to fold on an already-performed search:

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>
  • The foldexpr is an extension of foldexpr=(getline(v:lnum)=~@/)?0:1
  • The following options set the foldmethod to use the fold expression, and some other convenient values.

First search for a pattern, then fold everything else with \z
Use zr to display more context, or zm to display less context.

[edit ] Using a user-defined command

If you want to search and fold with a single command, either add the following as well:

command! -nargs=+ Foldsearch exe "normal /".<q-args>."^M\z"

Or get rid of the \z entirely:

command! -nargs=+ Foldsearch exe "normal /".<q-args>."^M" | setlocal foldexpr=
(getline(v:lnum)=~@/)?0:(getline(v:lnum-1)=~@/)\|\|(getline(v:lnum+1)=~@/)?1:2 foldmethod=
expr foldlevel=0 foldcolumn=2

In these last two code segments, be sure to replace the "^M" with an actual CTRL-M (carriage return) character. Type :Folds[earch] <search string>[ENTER] to use this command. Use zr to display more context, use zm to display less context as before.

[edit ] Customizing

To add a second level of context, you could add this to the end of foldexpr:

(getline(v:lnum-2)=~@/)\|\|(getline(v:lnum+2)=~@/)?2:3

but it will take longer as folded lines (the majority) evaluate the full expression.

If no context is desired at all, you can do the following instead:

foldexpr=(getline(v:lnum)=~@/)?0:(getline(v:lnum)=~@/)\|\|(getline(v:lnum)=~@/)?0:1

[edit ] Uses

Aside from the possible convenience of seeing only the search terms and their immediate context, this method of folding can be used for practical purposes as well. For example, viewing a "quick and dirty" api of a source code file.

To make a command to do a quick Java API for example, use:

" View the methods and variables in a java source file."
command! Japi Foldsearch public\s\|protected\s\|private\s

Note that a better way to do this for languages that support it would be to use syntax highlighting. Check the syntax file for the language in question to determine if this is an option. Many syntax files such as those for C, Perl, and VimL all define rules for at least some syntax-based folding, using :set foldmethod=syntax . Other languages such as Java do not currently have this functionality built in, so keep this idea around just in case you need it!

edit See also

edit Comments

 TO DO 

  • Explain better how the foldexpr string works.
    Convert it into a function?
    An excellent idea, or use line continuations. The current state is very hard to read (especially in IE where the scroll bar obscures part of the text).
  • Check if the comments in the original tip should be added (have they been taken into account?).
    Yes, they have, though the link to the script should probably be moved to a more prominent place.
  • A quick test suggests that "\<CR>" can be used instead of an actual ^M (so we should probably edit the tip in due course, although "\<CR>" possibly relies on some non-compatibility setting).
    I think if people are using a crazy setting that breaks things like "\<CR>" they should figure out how to fix the consequences on their own. No harm in mentioning it though, I guess.
  • Link to Folding for Quickfix .
  • Perhaps add following section (merged in from VimTip1022 ). A very quick test suggests it's ok.
    I like it. Probably add it as part of the explanation, though. Maybe build up to the final expression gradually.

edit Simple folding

After executing the following, you can search for a pattern then press F8 to fold misses.

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

<!-- NewPP limit report Preprocessor node count: 115/1000000 Post-expand include size: 1028/2097152 bytes Template argument size: 108/2097152 bytes Expensive parser function count: 0/100 --><!-- Saved in parser cache with key vim:pcache:idhash:2275-0!1!0!!en!2 and timestamp 20100412041912 -->

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值