Difference between revisions of "Creating a custom lexer for Code::Blocks editor"

From Code::Blocks
Line 13: Line 13:
 
* '''filemasks''' is a comma separated list of the extensions that this lexer should be used for. This is case-insensitive.
 
* '''filemasks''' is a comma separated list of the extensions that this lexer should be used for. This is case-insensitive.
  
* '''index''' corresponds with the <tt>wxSTC_LEX_*</tt> constants, found in <tt>sdk/wxscintilla/include/wx/wxscintilla.h</tt>. In this example, if you look in <tt>sdk/wxscintilla/include/wx/wxscintilla.h</tt>, you'll see that ''index 3'' matches <tt>wxSTC_LEX_CPP</tt>. The lexer id for C/C++ syntax highlighting.
+
* '''index''' corresponds with the <tt>wxSCI_LEX_*</tt> constants, found in <tt>sdk/wxscintilla/include/wx/wxscintilla.h</tt>. In this example, if you look in <tt>sdk/wxscintilla/include/wx/wxscintilla.h</tt>, you'll see that ''index 3'' matches <tt>wxSCI_LEX_CPP</tt>. The lexer id for C/C++ syntax highlighting.
  
If we were building a lexer configuration for let's say, XML (random choice) we would look up the constant <tt>wxSTC_LEX_XML</tt> which is defined to be number ''5''. So ''index=5''. Simple.
+
If we were building a lexer configuration for let's say, XML (random choice) we would look up the constant <tt>wxSCI_LEX_XML</tt> which is defined to be number ''5''. So ''index=5''. Simple.
  
 
Next follows many <tt><Style></tt> tags defining the different styles:
 
Next follows many <tt><Style></tt> tags defining the different styles:
Line 36: Line 36:
 
You don't have to define all of these attributes. It's good to define them all for the <tt>"default"</tt> style (all lexers have a default style), but only the attributes needed should be defined for the rest of the styles.
 
You don't have to define all of these attributes. It's good to define them all for the <tt>"default"</tt> style (all lexers have a default style), but only the attributes needed should be defined for the rest of the styles.
  
* The '''index''' number in the <tt><Style></tt> tags, comes from a different set of constants defined in <tt>wx/stc/stc.h</tt>. For each language supported by scintilla, there is a set of styles defined (these are what we're trying to configure with these files). For example, for C/C++ files (<tt>wxSTC_LEX_CPP</tt>, remember?) the styles are defined as <tt>wxSTC_C_*</tt>.
+
* The '''index''' number in the <tt><Style></tt> tags, comes from a different set of constants defined in <tt>sdk/wxscintilla/include/wx/wxscintilla.h</tt>. For each language supported by scintilla, there is a set of styles ''(lexical states)'' defined (these are what we're trying to configure with these files).  
  
For the <tt>"default"</tt> style shown above, this would be <tt>wxSTC_C_DEFAULT</tt> which is defined to be ''0''. Hence ''index=0'' for <tt>"default"</tt>.
+
For example, for C/C++ files (<tt>wxSCI_LEX_CPP</tt>, remember?) the styles are defined as <tt>wxSCI_C_*</tt>.
 +
 
 +
For the <tt>"default"</tt> style shown above, this would be <tt>wxSCI_C_DEFAULT</tt> which is defined to be ''0''. Hence ''index=0'' for <tt>"default"</tt>.
  
  
Line 48: Line 50:
 
This is the style definition for normal comments. As you can see you can define a single style for more than one style index, in this case two: ''1'' and ''2'' (always comma separated).
 
This is the style definition for normal comments. As you can see you can define a single style for more than one style index, in this case two: ''1'' and ''2'' (always comma separated).
  
''1'' is for <tt>wxSTC_C_COMMENT</tt> (the C comment <tt>/* */</tt>) and ''2'' is for <tt>wxSTC_C_COMMENTLINE</tt> (the C++ comment to end of line <tt>// </tt>).
+
''1'' is for <tt>wxSCI_C_COMMENT</tt> (the C comment <tt>/* */</tt>) and ''2'' is for <tt>wxSCI_C_COMMENTLINE</tt> (the C++ comment to end of line <tt>// </tt>).
  
 
I just want to add that there are some special styles defined by Code::Blocks and are available to all lexers:
 
I just want to add that there are some special styles defined by Code::Blocks and are available to all lexers:
Line 54: Line 56:
 
* Index -99: the selected text style
 
* Index -99: the selected text style
 
* Index -98: the active line style (the line the caret is on)
 
* Index -98: the active line style (the line the caret is on)
* Index -2 : the breakpoint line style
+
* Index -2: the breakpoint line style
* Index -3 : the debugger active line style (while stepping the debugger)
+
* Index -3: the debugger active line style (while stepping the debugger)
* Index -4 : the compiler warning/error line style
+
* Index -4: the compiler warning/error line style
  
  

Revision as of 05:53, 22 January 2006

The files that add syntax highlighting support for specific files are found under sdk/resources/lexers. They're simple XML files named as lexer_*.xml.

Let's take lexer_cpp.xml as an example and disect it.

<Lexer name="C/C++"
       index="3"
       filemasks="*.c,*.cpp,*.cc,*.cxx,*.h,*.hpp,*.hh,*.hxx,*.inl">

Pretty much self explanatory, except for the "magic" index number (we 'll come to it in a sec).

  • name is the lexer's configuration name. This will appear in the editor's configuration dialog, in the languages drop down box (in colors editing page).
  • filemasks is a comma separated list of the extensions that this lexer should be used for. This is case-insensitive.
  • index corresponds with the wxSCI_LEX_* constants, found in sdk/wxscintilla/include/wx/wxscintilla.h. In this example, if you look in sdk/wxscintilla/include/wx/wxscintilla.h, you'll see that index 3 matches wxSCI_LEX_CPP. The lexer id for C/C++ syntax highlighting.

If we were building a lexer configuration for let's say, XML (random choice) we would look up the constant wxSCI_LEX_XML which is defined to be number 5. So index=5. Simple.

Next follows many <Style> tags defining the different styles:

<Style name="Default"
       index="0"
       fg="0,0,0"
       bg="255,255,255"
       bold="0"
       italics="0"
       underlined="0"/>
  • name is the style's name. It appears in the editor's configuration dialog, in the colors editing page.
  • fg is the foreground color. Comma separated list of three numbers from 0 to 255. In order: red, green and blue (RGB).
  • bg is the background color.

bold is "0" for disabled, "1" for enabled. Same goes for italics and underlined.

You don't have to define all of these attributes. It's good to define them all for the "default" style (all lexers have a default style), but only the attributes needed should be defined for the rest of the styles.

  • The index number in the <Style> tags, comes from a different set of constants defined in sdk/wxscintilla/include/wx/wxscintilla.h. For each language supported by scintilla, there is a set of styles (lexical states) defined (these are what we're trying to configure with these files).

For example, for C/C++ files (wxSCI_LEX_CPP, remember?) the styles are defined as wxSCI_C_*.

For the "default" style shown above, this would be wxSCI_C_DEFAULT which is defined to be 0. Hence index=0 for "default".


<Style name="Comment (normal)"
       index="1,2"
       fg="160,160,160"/>


This is the style definition for normal comments. As you can see you can define a single style for more than one style index, in this case two: 1 and 2 (always comma separated).

1 is for wxSCI_C_COMMENT (the C comment /* */) and 2 is for wxSCI_C_COMMENTLINE (the C++ comment to end of line // ).

I just want to add that there are some special styles defined by Code::Blocks and are available to all lexers:

  • Index -99: the selected text style
  • Index -98: the active line style (the line the caret is on)
  • Index -2: the breakpoint line style
  • Index -3: the debugger active line style (while stepping the debugger)
  • Index -4: the compiler warning/error line style


Now on to the keywords. If the language you're defining a lexer configuration for, has keywords they should be added in the <Keywords> tag. This tag can contain the following tags:

<Language>, <User> and <Documentation>.

  • Language contains the language keywords. These are usually at index 0.
  • User is not used right now but might be in the future.
  • Documentation contains the documentation keywords (if any). If you look at the lexer_cpp.xml file, you'll see that the documentation keywords defined are those of doxygen.