Search code examples
regexvimregex-negationfolding

Vim folding every line ending in { but not classes


I intend to fold all the lines ending in { but not classes. So far I have came up with this command :

:%g/.\{-}\(class\)\@!.*{$/normal! zf%

But this would match also the lines containing class.


Solution

  • There are several problems:

    1. From :help /\@!: "You can't use "\@!" to look for a non-match before the matching position". Use \@<!, include the possible characters in between in there, and drop the useless (because it's not anchored) non-greedy first match.
    2. The :global command places the cursor on the first column of matching lines, so add a $ to make the % work all the time.
    3. Subsequent inner folds must be defined with the outer fold open: zv.

    Ergo:

    :%g/\%(class.*\)\@<!{$/normal! $zvzf%