Code folding example

Hi, I am new to CodeMirror and its “functional” structure is really confusing.
So far I only managed to setup things using examples.
The problem is that I can’t find any examples of code folding for v6.

I want to automatically fold object with key toFold on top level of JSON object after some event, let’s say after document change event:

{
    "toFold": { /* Everything here should be folded */ },
    "foo": 5
    "bar": {
        "baz": true
    }
}

So I setup my editor like this:

const editor = new EditorView({
    doc: myInitialJsonString,
    parent: myElem,
    extensions: [
        basicSetup,
        json(),
        EditorView.updateListener.of(e => {
            if (!e.docChanged) return;
            
            editor.dispatch({ /* How to fold? */ });
        })
    ]
});

And I am stuck here…
I think I need to somehow get fold range (for example by using regexp) and dispatch fold effect on that range but I have no idea of how this should look in code.

Ok, I figured out I can fold lines with foldEffect like this:

import { foldEffect } from '@codemirror/language';

editor.dispatch({
    effects: foldEffect.of({ from: 0, to: 3 })
});

Now the only problem is to somehow find out the lines to fold.
For that I guess I need to find foldable range connected to toFold syntax node but still no idea where to begin…

1 Like

You can pass in any range that you want to fold (if you’re doing your own textual scan for this), or use foldable to ask the built-in fold logic.

Well to check whether lines are foldable() I need to somehow get these lines connected to the node I want to fold… :slight_smile:

While manual search can be an option I think maybe there is a more convinient way to search for JSON node. But I am not familiar with Syntax Trees and related stuff at all.