Is it possible to display nested sections in a col

2019-07-21 20:58发布

When a fold is collapsed in vim, all of the nested headings are hidden away so that you can't see what's inside. I'm curious if anyone knows if it's possible or has a solution for foldtext function (or through another method) that can display the sections inside a fold when a fold is collapsed.

I'm looking for something that would display folds more like this:

+ --   2000 TopSection1                                    " Fold Level 1
+ ---   500 TopSection1 : ChildSection1                    " Fold Level 2
+ ----   50 TopSection1 : ChildSection1 : BottomSection1   " Fold Level 3
+ ---   100 TopSection1 : ChildSection2 : BottomSection1   " Fold Level 2
+ --    500 TopSection2                                    " Fold Level 1
+ ---    25 TopSection2 : ChildSection1                    " Fold Level 2

I've been digging around, but have not figured out a method to make this work (or if it's possible). Any suggestions?

3条回答
叼着烟拽天下
2楼-- · 2019-07-21 21:19

the following command gets all folding lines without the body texts in between :

:g/{{{/

It works for this example below that contains multiple nested folds with foldmethod=marker and default ({{{) mark :

Text 1/*{{{*/
some text here
subtext 1.1/*{{{*/
some text here
subsubtext 1.1.1/*{{{*/
some text here/*}}}*/
subsubtext 1.1.2/*{{{*/
some text here/*}}}*//*}}}*/
subtext 1.2/*{{{*/
some text here
subsubtext 1.2.1/*{{{*/
some text here/*}}}*/
subsubtext 1.2.2/*{{{*/
some text here/*}}}*//*}}}*//*}}}*/
Text 2/*{{{*/
some text here
subtext 2.1/*{{{*/
some text here
subsubtext 2.1.1/*{{{*/
some text here/*}}}*/
subsubtext 2.1.2/*{{{*/
some text here/*}}}*//*}}}*/
subtext 2.2/*{{{*/
some text here
subsubtext 2.2.1/*{{{*/
some text here/*}}}*/
subsubtext 2.2.2/*{{{*/
some text here/*}}}*//*}}}*//*}}}*/

After you run the :g/{{{/ command, you get this :

Text 1/*{{{*/
subtext 1.1/*{{{*/
subsubtext 1.1.1/*{{{*/
subsubtext 1.1.2/*{{{*/
subtext 1.2/*{{{*/
subsubtext 1.2.1/*{{{*/
subsubtext 1.2.2/*{{{*/
Text 2/*{{{*/
subtext 2.1/*{{{*/
subsubtext 2.1.1/*{{{*/
subsubtext 2.1.2/*{{{*/
subtext 2.2/*{{{*/
subsubtext 2.2.1/*{{{*/
subsubtext 2.2.2/*{{{*/

If you want to redirect the result to a new buffer, then you can run :

:let @a='' | execute 'g/{{{/y A' | new | setlocal bt=nofile | put! a

It yanks the {{{ pattern to register "a", opens a new buffer and pastes the reg. You may then need to expand the result with zR if your default is 'collapse folds'.

查看更多
【Aperson】
3楼-- · 2019-07-21 21:21

I use zr and zm normal commands to open and close another folding level. I agree that zr will also show text between a folding level and a sub-level ; hence it does not fully address your question. It's seems that a better way would be to use foldmethod=syntax and then filter all folding lines with a global (g) command based on the regex of the foldmethod syntax.

查看更多
时光不老,我们不散
4楼-- · 2019-07-21 21:36

You will have to play with foldtext but also to parse the content of the section to fetch what you want to display.

查看更多
登录 后发表回答