On 5/6/06, Bill Pursell <[EMAIL PROTECTED]> wrote:
Yakov Lerner wrote:
> 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
> map <silent><F3> :set foldexpr=!(getline(v:lnum)=~@/) foldmethod=expr
> map <silent><f4> :set nofoldenable<cr>
> map <silent><f5> :call TogglePatternBasedFolding()<cr>
> function! TogglePatternBasedFolding()
> if &foldenable && &foldmethod=='expr' && &foldexpr == '!'
> :set nofoldenable | redraw | echo "all folds opened"
> elseif &foldenable && &foldmethod=='expr' && &foldexpr == 'g'
> :set foldexpr=!(getline(v:lnum)=~@/) foldmethod=expr foldenable
> normal zM
> redraw | echo "lines not matching /".@/."/ folded"
> else " &foldenable && &foldmethod=='expr' && &foldexpr == 'g'
> :set foldexpr=getline(v:lnum)=~@/ foldmethod=expr foldenable
> normal zM
> redraw | echo "lines matching /".@/."/ folded"
That type of thing works nicely, except for the fact that as
soon as you set foldmethod=expr, you lose any other syntax based
folding that's in place. Is it possible to do something like
foldmethod+=expr, so that the syntax based folding remains in
effect? I don't believe that can be done, but I'd love to
hear suggestions for a work-around.
I originally was hoping to do what Jack was asking for, which is
to hide the lines and continue working in the buffer, but in
retrospect, that may not be particularly safe. Filtering to
a temporary buffer will probably satisfy me.
Thanks for all the suggestions.
It's easy to add saving of preexisting fold-rules in the
mappings. In the toggle mapping, the 3rd state would
be restoration of old mappings instead of disabled folding.
You can do it yourself.
It's easy. Just assign &foldmethod, &foldexpr &foldenable
etc to global variables, and make a mapping to restore it.