On 5/4/06, Jack Donohue <[EMAIL PROTECTED]> wrote:
> :v (and :g) made my day..!

Yes, I use this a lot if I just want to filter out a set of lines, or see
only lines containing some text (like the old XEDIT command).  But what I'd
really like to to is continue editing in this view and not lose all the
hidden lines, more like folding.  I expect folding can do this, but I've
never gotten it to work and it seems pretty cumbersome.  I'm looking for a
simple solution involving maybe a couple of command I can make a map for.

I guess I'm looking for a g or v command that folds the lines instead of
actually deleting them.

I guess the mappings below are simple enough. If you prefer
to keep it to just couple of lines, you can remove mapping for <F5>
and whole function TogglePatternBasedFolding(). What remains is
just 3 lines (maps for f2, f3, and f3). But I find tri-state toggle
(f5) also useful.

" Simple pattern-based folding.
" How to use: (1) perform searh (so that vim remebers search pattern),
"           (2) press f2, f3 f4, or press f5 repeatedly.
"
" F2 - fold lines that match current-search-pattern (cf :v//p)
" F3 - fold lines that do not match current-search-pattern (cf :g//p)
" F4 - open all folds
" F5 - tri-state toggle between f2-f3-f4

map <silent><F2> :set foldexpr=getline(v:lnum)=~@/ foldmethod=expr
foldenable<cr>zM
map <silent><F3> :set foldexpr=!(getline(v:lnum)=~@/) foldmethod=expr
foldenable<cr>zM
map <silent><f4> :set nofoldenable<cr>
map <silent><f5> :call TogglePatternBasedFolding()<cr>

function! TogglePatternBasedFolding()
   if &foldenable && &foldmethod=='expr' && &foldexpr[0] == '!'
       :set nofoldenable | redraw | echo "all folds opened"
   elseif &foldenable && &foldmethod=='expr' && &foldexpr[0] == 'g'
       :set foldexpr=!(getline(v:lnum)=~@/) foldmethod=expr foldenable
       normal zM
       redraw | echo "lines not matching /".@/."/ folded"
   else " &foldenable && &foldmethod=='expr' && &foldexpr[0] == 'g'
       :set foldexpr=getline(v:lnum)=~@/ foldmethod=expr foldenable
       normal zM
       redraw | echo "lines matching /".@/."/ folded"
   endif
endfun


Yakov

Reply via email to