I would find this feature very useful as well. +1 regards, Peter
--- Nikolai Weibull <[EMAIL PROTECTED]> wrote: > I'm a firm believer in the nextgroup directive for defining syntaxes. > It allows you to define grammars, which I really enjoy doing. > However, one problem is that many languages allow things to appear in > their input that's not part of the language's grammar. For example, > many languages allow comments to appear almost anywhere in the input, > which are stripped out of the input while lexing the input into tokens > that are then fed to the actual parser. Now comments could be a part > of the grammar, simply being thrown away at that point in the process, > but it forces you to provide for the possibility of a comment > appearing basically anywhere between terminals/non-terminals. > > Anyway, what I'm actually suggesting is a way to get around this issue > by adding a new directive to the :syntax command that can be used > alongside nextgroup to skip certain syntax groups before trying the > groups defined by nextgroup. This is much like skipwhite, skipnl, and > skipempty, but for arbitrary syntax groups. > > Here's an example of what I intend for it to do: > > syn keyword tocTodo > \ contained > \ TODO > \ FIXME > \ XXX > \ NOTE > > syn match tocComment > \ contains=tocTodo,@Spell > \ '//.*$' > > syn keyword tocHeaderKeyword > \ nextgroup=tocCatalogNumber > \ skip=tocComment > \ skipwhite > \ skipempty > \ CATALOG > > syn match tocCatalogNumber > \ contained > \ '"\d\{13\}"' > > This is a partial grammar that matches comments and the CATALOG > keyword in the header part of a cdrdao(1) TOC file (yes, I'm writing a > grammar for such files). Comments begin with a set of slashes and can > appear anywhere in the file. The CATALOG keyword is followed by a > (optional, but let's keep it simple for this example) catalog number. > The idea here is that the skip=tocComment directive to > tocHeaderKeyword will tell the syntax highlighting engine that it > should skip any matches to tocComment that follow tocHeaderKeyword, > just as the skipwhite and skipempty pair tells it to skip whitespace > and empty lines (before and after any tocComments) before it tries to > match a tocCatalogNumber. > > I have no idea how hard this would be to implement, but I'm thinking > that it can't be too difficult. It should "only" be to add some > handling around the code that handles skipwhite/skipnl/skipempty to go > through a list of syntax groups and try to match them, highlighting > them, and then trying to highlight whatever is in nextgroup > afterwards. > > I'm sure there are edge cases to consider, but I can't think that it > should be impossible. I sadly don't have any understanding of the Vim > syntax highlighter, so someone with more knowledge will have to help > me out. > > Comments? Patches? Complaints? > > nikolai > > P.S. > Yes, I know that this can be solved by keeping track of the context by > adding a tocXComment for each and every :syntax ... X ... definition > (production) that keeps track of what the nextgroup of the production > in question was and adding the tocXComment production to that > productions nextgroup, but that doubles the number of productions and > makes it a lot harder to change it later on. > > Here's an example of what that looks like for the grammar above: > > syn keyword tocTodo > \ contained > \ TODO > \ FIXME > \ XXX > \ NOTE > > syn match tocComment > \ contains=tocTodo,@Spell > \ '//.*$' > > syn keyword tocHeaderKeyword > \ nextgroup= > \ tocCatalogNumberComment, > \ tocCatalogNumber > \ skipwhite > \ skipempty > \ CATALOG > > syn match tocCatalogNumberComment > \ nextgroup=tocCatalogNumber > \ skipwhite > \ skipempty > \ contains=tocTodo,@Spell > \ contained > \ '//.*$' > > syn match tocCatalogNumber > \ contained > \ '"\d\{13\}"' > > Of course, all those additional groups can be automatically generated, > given a grammar, but again, it makes it harder to follow, harder to > change, and more memory-hungry than what a grammar using the (still > fictional) skip directive. > D.S. > Send instant messages to your online friends http://au.messenger.yahoo.com