vim script to fold code blocks using regexp
if you like my work, check here for a list of my vim plugins, or buy me a coffee
-
see all virtual functions
:ZFFoldBlock //virtual/
-
filter out all comments
:ZFFoldBlock /^[ \t]*#//
-
fold by xml tags
:ZFFoldBlock /<([a-z0-9_:\.]+)/<\/\l1>|\/>/
(withothree/eregex.vim
)
-
use Vundle or any other plugin manager is recommended
Plugin 'ZSaberLv0/ZFVimFoldBlock'
when
othree/eregex.vim
installed (recommended), perl style regexp would be used instead of vim stylePlugin 'othree/eregex.vim'
-
foldmethod
must be set tomanual
set foldmethod = manual
by default,
foldmethod
would be set tomanual
whenZFFoldBlock
called, you may disable it bylet g:ZFVimFoldBlock_resetFoldmethodWhenUse=0
-
foldminlines
recommended set to0
, which allow fold even for single lineset foldminlines=0
by default,
foldminlines
would be set to0
whenZFFoldBlock
called, you may disable it bylet g:ZFVimFoldBlock_resetFoldminlinesWhenUse=0
-
recommended to have these key map:
nnoremap ZB q::call ZF_FoldBlockTemplate()<cr> nnoremap ZF :ZFFoldBlock //<left>
-
or, use the functions directly:
" fold by begin and end regexp :ZFFoldBlock /begin_regexp/end_regexp/ " same as :ZFFoldBlock /regexp// :ZFFoldIfMatch regexp " same as :ZFFoldBlock //regexp/ :ZFFoldIfNotMatch regexp
you may :call ZF_FoldBlockHelp()
to show sample at any time
-
/{/}/
: normal block mode{ in fold 1 { in fold 2 } in fold 1 }
-
/rem//
: fold if matchrem in fold rem in fold
-
//rem/
: fold if not matchin fold in fold rem not in fold rem not in fold
-
/tag/tag/
: single tag modetag in fold 1 tag not in fold tag in fold 2 tag
use vim's regexp by default, see :h magic
if you have othree/eregex.vim installed, then perl style regexp would be used instead
you may force disable it by let g:ZFVimFoldBlock_disableE2v = 1
-
typical advanced usage:
" fold comments accorrding to file type function! ZF_Plugin_ZFVimFoldBlock_comment() let expr='\(^\s*\/\/\)' if &filetype=='vim' let expr.='\|\(^\s*"\)' endif if &filetype=='c' || &filetype=='cpp' let expr.='\|\(^\s*\(\(\/\*\)\|\(\*\)\)\)' endif if &filetype=='make' let expr.='\|\(^\s*#\)' endif let disableE2vSaved = g:ZFVimFoldBlock_disableE2v let g:ZFVimFoldBlock_disableE2v = 1 call ZF_FoldBlock("/" . expr . "//") let g:ZFVimFoldBlock_disableE2v = disableE2vSaved echo "comments folded" endfunction nnoremap ZC :call ZF_Plugin_ZFVimFoldBlock_comment()<cr>
-
calling
ZFFoldBlock
would append fold instead of replace, before using the function, you may want to remove all fold byzE
orzD
manually -
when fold with
/expr_l/expr_r/
format, there's a special pattern forexpr_r
to reference submatches inexpr_l
(similar to:h /\1
), the pattern format is\lN
, whereN
is1~9
for example,
/<([a-z]+)>/</\l1>/
would result:xxx // not in fold <aa> // in fold xxx // in fold </aa> // in fold xxx // not in fold