Loading ...
Sorry, an error occurred while loading the content.

Re: syntax bug. extend inside normal inside keepend

Expand Messages
  • Bram Moolenaar
    ... Complicated stuff. I m glad you managed to find a solution. But we need to check for side effects. I ll include it and try it out for a while before
    Message 1 of 2 , Sep 26, 2006
    • 0 Attachment
      Ilya Bobir wrote:

      > I've already posted about this bug in syntax matching code. But now I
      > have a fix.
      >
      > Test case
      > =========
      > Having following syntax rules
      >
      > :syn cluster Top contains=Block,String,Identifier
      > :syn region Block start=+{+ end=+}+ keepend extend contains=@Top
      > :syn region String start=+"+ end=+"+ contains=Identifier
      > :syn region Identifier start=+\${+ end=+}+ extend
      >
      > and the following buffer is matched incorrectly
      >
      > { "string ${var} string" }
      >
      > on current vim version (7.0.109) I'm getting following syntax groups:
      >
      > { "string ${var} string" }
      > BBBBBBBBBBBBBBBBBBBBBBBBBB
      > SSSSSSSSSSSSSS SS
      > IIIIII
      >
      > Where B means Block region, S - String region and I - Identifier region.
      >
      > While I'm expecting to see the following picture:
      >
      > { "string ${var} string" }
      > BBBBBBBBBBBBBBBBBBBBBBBBBB
      > SSSSSSSSSSSSSSSSSSSSSS
      > IIIIII
      >
      > Bug description
      > ===============
      > Bug appears, when one have an extend region inside a normal region
      > inside a keepend region. Currently, when any extend region ends vim
      > checks all the outer keepend regions to see, if theirs ends should be
      > "extended", but it does not checks intermediate normal (non keepend)
      > regions and theirs ends should also be checked otherwise one could end
      > up with a normal region been forcefully ended by enclosing keepend
      > region and this keepend region later be extended by a containing extend
      > region.
      >
      > Just as it is seen in the first picture in the test case. Block region
      > ends String region on a first '}'. But later when Identifier region
      > consumes that first '}' Block region is extended, while String region is
      > not.
      >
      > Solution
      > ========
      > Test intermediate normal region ends along with keepend region ends when
      > an extend region ends.
      >
      > Here is a patch for syntax.c that does this check. I'm getting correct
      > behavior with this patch for my test case.

      Complicated stuff. I'm glad you managed to find a solution. But we
      need to check for side effects. I'll include it and try it out for a
      while before sending out an official patch.

      --
      SOLDIER: What? Ridden on a horse?
      ARTHUR: Yes!
      SOLDIER: You're using coconuts!
      "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

      /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
      /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
      \\\ download, build and distribute -- http://www.A-A-P.org ///
      \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
    Your message has been successfully submitted and would be delivered to recipients shortly.