• Kate Highlighting Power

    by  • September 12, 2007 • Users

    Kate’s highlighting capabilities are amazing. If you want you can highlight really complex syntax, without having to hardcode rules in C++. As an example, we’ll take a look at how Lua comments can be realized:

    • –[=[ starts a multiline comment (the '=' chars are optional)
    • ]=] ends the multiline comment
    • the number of ‘=’ chars in ]=] must match the number of –[=[

    That means: When the highlighting processor matches the end of a multiline comment, it has to know how many '=' chars started the comment. Thanks to the concept of dynamic rules and contexts Kate is able to do that. The highlighting file looks like this. First comes the header

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE language SYSTEM "language.dtd" >
    <language name="Test" version="1.0" kateversion="2.4" section="Markup" extensions="" mimetype="">
      <highlighting>

    Then the body with the contexts. We start in the first context called "Normal Text". When the regular expression --[(=*)[ matches it switches to the context Comment.

        <contexts>
          <context attribute="Normal Text" lineEndContext="#stay" name="Normal">
            <RegExpr attribute="Comment" context="Comment" String="--\[(=*)\[" dynamic="true"/>
          </context>

    The part (=*) is now available as %1 in the rule below:

          <context name="Comment" attribute="Comment" lineEndContext="#stay" dynamic="true" >
            <RegExpr attribute="Comment" context="#pop" String="\]%1\]” dynamic=”true” />
          </context>
        </contexts>

    The last part is the footer:

        <itemDatas>
          <itemData name="Normal Text" defStyleNum="dsNormal" />
          <itemData name="Comment"     defStyleNum="dsComment" />
        </itemDatas>
      </highlighting>
    </language>

    If you want to know more about Kate's highlighting, have a look at the documentation :) There are also lots of bug reports, so if you want to contribute you can fix them!

    PS: As I don't know much about Lua, comments might work differently. That does not really matter, as the example still shows what you can do :)

    About

    Dominik is a PhD student at the Control Theory and Robotics Lab, TU Darmstadt, as part of the Research Training Group GKMM (GRK1362). My research focuses on state estimation in distributed systems. As hobby, I contribute to the KDE project and work on the Kate application and editor component.

    http://www.kate-editor.org