Brett Stahlman wrote:

> The syntax documentation suggests that the 'keepend' argument applies
> only to syntax regions, not syntax matches. But if I highlight a
> buffer containing only the following line...
> 
> ABCDE
> 
> ...with the following syntax definitions...
> 
> syn match A /A/
> syn match Inside /[A-Z]\+/ transparent contained containedin=A
> hi A guifg=blue
> 
> ...the match group "A" extends (apparently incorrectly) from A through
> E, though its pattern matches only the "A".

This is correct, the inner match continues, causing the outer match not
to end.  :syn match does not have "keepend" but that doesn't mean it
always keeps its end.

> Stranger still, one
> additional nested "Inside" group is recognized in each successive
> letter. I.e., "Inside" is contained within "Inside", in spite of the
> `containedin=A'. Thus, running synstack on successive characters, I
> see...
> 
> -- cursor on A --
> A
> Inside
> -- cursor on B --
> A
> Inside
> Inside
> -- cursor on C --
> A
> Inside
> Inside
> Inside

That looks like a bug.

> I can fix the problem by adding the 'keepend' argument to the
> definition for match group "A", but the "keepend" is highlighted as an
> error by the vim syntax, and the help on :syn-match gives me no reason
> to believe the argument should be supported.
> 
> Here are the results of synstack() with the following, "fixed" definition for 
> A:
> syn match A /A/ keepend
> 
> -- cursor on A --
> A
> Inside
> -- cursor on B --
> -- cursor on C --
> 
> Is 'keepend' meant to be supported for syn-match? The purpose of
> 'keepend' is to prevent a nested group from obscuring a match with a
> containing group's "end pattern". Although a match group has no
> explicit end pattern, the principle of checking for the end of the
> match pattern certainly still applies, so I suppose it makes sense
> that 'keepend' would be accepted for both syn-match and syn-region. If
> that is the intent, then the documentation needs fixing.
> 
> As for the infinitely nested "Inside" groups, I can't account for
> that, and suspect it's a bug, but perhaps I'm misunderstanding
> something about contained and containedin?

Something seems wrong.  Also try this:

syn match A /A/
syn match Inside /[A-Z]/ transparent contained containedin=A
hi A guifg=green ctermfg=green

Now every fourth character is highlighted.  Hmm.


-- 
Facepalm statement #8: "Drive faster, the petrol is running out"

 /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
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

--- 
You received this message because you are subscribed to the Google Groups 
"vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_use+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to