Ben,

On 2012-11-21 13:40, Ben Fritz wrote:
On Tuesday, November 20, 2012 4:31:27 PM UTC-6, Philip Rhoades wrote:

> fun! MyFoldBlocks()
>   if getline(v:lnum)=~'\v^(if|(\S&.*\{)|SomeOtherBlockBeginning)'
>     return ">1"
>   elseif getline(v:lnum)=~'\v^(end|\}|SomeOtherBlockEnding)'
>     return "<1"
>   else
>     return "="
>   endif
> endfun

> setl foldexpr=MyFoldBlocks() fdm=expr


This nearly does what I want but I want the first (and maybe the last
line?) of the block visible eg:

if (..)
folded
end

since the actual blocks can get quite large and I just want to see the
overall logic.  I guess that means doing something with lnum?


Sure, you can get the previous line with getline(v:lnum-1) or the
next line with getline(v:lnum+1).

Or you could mess with the 'foldtext' option to adjust what gets
displayed when you fold stuff away.


It took me a while to work out how to use foldtext (I have found this problem in the past - the Vim docs are good but are like "man" pages - short on examples). So I now have:

fun! MyFoldBlocks()
if getline(v:lnum)=~'\v^(class|for|if|while|([a-z0-9][a-b0-9\ _].*\{))' "inc escaped space + tab
    return ">1"
  elseif getline(v:lnum)=~'\v^(end|\}|SomeOtherBlockEnding)'
    return "<1"
  else
    return "="
  endif
endfun

set foldtext=getline(v:foldstart)
setl foldexpr=MyFoldBlocks() fdm=expr

- my change to prevent folding on comments with '#' in col 1 worked but is not so elegant?

I didn't have much success with getline(v:lnum+1) but foldtextresult({lnum}) also looks like it might offer some possibilities?

Anyway, everything is working exactly how I want it to now so thanks very much!

Regards,

Phil.
--
Philip Rhoades

GPO Box 3411
Sydney NSW      2001
Australia
E-mail:  [email protected]

--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Reply via email to