delphicolorsluascintilla

How do I configure DScintilla to highlight Lua with certain style attributes?


I'm trying to replicate the syntax highlighting style for Lua shown here:

I'm using DScintilla, the VLC component to support Scintilla in Delphi. I read every single module of Dscintilla to see the functions and get what I was looking for, and I have already done the following:

The problem now is that I can't change the comment style to italic, or colorize conditionals (if, else, then, while, etc.) from the lexer of Lua that Scintilla has, or colorize variables.

My current code, the one which works, is this:

with EditScript do
begin
  SetScrollWidth(430); //so we don't see it
  Margins.Right := 1;
  Margins.Left := 0;
  Margins.Top := 0;
  Margins.Bottom := 0;
  SetMarginLeft(5);
  SetMarginWidthN(0, 40);
  SetMarginWidthN(1, 0);
  SetExtraAscent(4); //space between lines

  //-----------------------margin line numbers
  StyleSetFont(STYLE_LINENUMBER, 'Default');
  StyleSetBold(STYLE_LINENUMBER, true);
  StyleSetBack(STYLE_LINENUMBER, gray);
  StyleSetFore(STYLE_LINENUMBER, clWebBlack);

  //-----------------------Text
  StyleSetFont(STYLE_DEFAULT, 'Courier New'); 
  //TO DO: variables and comments in cursive
  SetLexerLanguage('Lua');
  SetLexer(SCLEX_LUA);
  SetCodePage(CP_UTF8);

  //-----------------------Colours
  StyleSetFore(SCE_LUA_COMMENTLINE, green_comments);
  StyleSetFore(SCE_LUA_NUMBER, blue_numbers);
  StyleSetFore(SCE_LUA_CHARACTER, red_strings);
  StyleSetFore(SCE_LUA_OPERATOR, green_conditionals);
end;

what doesn't work? this:

//-----------------------Italics
StyleSetItalic(SCE_LUA_DEFAULT, true);
StyleSetItalic(SCE_LUA_COMMENTLINE, true);
StyleSetItalic(SCE_LUA_COMMENTDOC, true);

or

StyleSetFore(SCE_LUA_COMMENT, clGreen);
StyleSetFore(SCE_LUA_COMMENTDOC, clGreen);
StyleSetFore(SCE_LUA_STRING, clGreen);
StyleSetFore(SCE_LUA_LITERALSTRING, clGreen);
StyleSetFore(SCE_LUA_PREPROCESSOR, clGreen);
// StyleSetFore(SCE_LUA_IDENTIFIER, clGreen); //it highlights everything, wtf?
StyleSetFore(SCE_LUA_STRINGEOL, clGreen);
StyleSetFore(SCE_LUA_WORD, clGreen);
StyleSetFore(SCE_LUA_WORD2, clGreen);
StyleSetFore(SCE_LUA_WORD3, clGreen);
StyleSetFore(SCE_LUA_WORD4, clGreen);
StyleSetFore(SCE_LUA_WORD5, clGreen);
StyleSetFore(SCE_LUA_WORD6, clGreen);
StyleSetFore(SCE_LUA_WORD7, clGreen);
StyleSetFore(SCE_LUA_WORD8, clGreen);
StyleSetFore(SCE_LUA_LABEL, clGreen);

If I call ShowMessage(EditScript.DescribeKeyWordSets), I get the following:

Keywords
Basic functions
String, (table) & math functions
(coroutines), I/O & system facilities
user1
user2
user3
user4

Solution

  • Ok, I have tried a lot of combinations and ended up with this one "semi"-working. Before writing the setItalic if I write the SetFont for that style it will work in most cases, something like this:

      StyleSetFont(SCE_LUA_COMMENTLINE, 'Courier New');
      StyleSetSize(SCE_LUA_COMMENTLINE,10);
    
      StyleSetItalic(SCE_LUA_COMMENTLINE,true);  // "--..."
    

    So now the ONLY problem would be keywords and variable names (in purple in the picture)

    @Edited: here is how it looks like now: enter image description here

    and here is the code I used:

      with EditScript do
      begin
        SetScrollWidth(430); //so we don't see it
        Margins.Right:=1;
        Margins.Left:=0;
        Margins.Top:=0;
        Margins.Bottom:=0;
        SetMarginLeft(5);
        SetMarginWidthN(0,40);
        SetMarginWidthN(1,0);
        SetExtraAscent(4); //space between lines
    
        //-----------------------margin line numbers
        StyleSetFont(STYLE_LINENUMBER, 'Default');
        StyleSetBold(STYLE_LINENUMBER, true);
        StyleSetBack(STYLE_LINENUMBER, gray);
        StyleSetFore(STYLE_LINENUMBER,clWebBlack);
    
        //-----------------------Text
        SetLexerLanguage('Lua');  //don't work
          SetLexer(SCLEX_LUA);
          SetCodePage(CP_UTF8);
          StyleSetFont(SCE_LUA_DEFAULT, 'Courier New');
          StyleSetSize(SCE_LUA_DEFAULT,10);
          StyleSetFont(SCE_LUA_IDENTIFIER, 'Courier New');
          StyleSetSize(SCE_LUA_IDENTIFIER,10);
          StyleSetFont(SCE_LUA_COMMENTLINE, 'Courier New');
          StyleSetSize(SCE_LUA_COMMENTLINE,10);
          StyleSetFont(SCE_LUA_WORD, 'Courier New');
          StyleSetSize(SCE_LUA_WORD,10);
          StyleSetFont(SCE_LUA_LITERALSTRING, 'Courier New');
          StyleSetSize(SCE_LUA_LITERALSTRING,10);
          StyleSetFont(SCE_LUA_COMMENTDOC, 'Courier New');
    
         //-----------------------Italics
          StyleSetItalic(SCE_LUA_COMMENTLINE,true);  // "--..."
          StyleSetItalic(SCE_LUA_LITERALSTRING,true);   // "[[...]]"
          StyleSetItalic(SCE_LUA_IDENTIFIER,true);   // "variables"
          StyleSetBold(SCE_LUA_IDENTIFIER,true);
          StyleSetBold(SCE_LUA_WORD,true);   //init start/end true false
          StyleSetItalic(SCE_LUA_COMMENTDOC,true); //don't work
    
         //-----------------------KeyWords
          SetKeyWords(0, 'if then else init start end true false');
    
         //-----------------------Colours
          StyleSetFore(SCE_LUA_COMMENTLINE, green_comments);
          StyleSetFore(SCE_LUA_COMMENTDOC, green_comments);
          StyleSetFore(SCE_LUA_NUMBER, blue_numbers);
          StyleSetFore(SCE_LUA_CHARACTER, red_strings);
          StyleSetFore(SCE_LUA_OPERATOR, green_conditionals);
          StyleSetFore(SCE_LUA_LITERALSTRING, green_comments);
          StyleSetFore(SCE_LUA_IDENTIFIER, purple);
          StyleSetFore(SCE_LUA_WORD, blue_strings);
        end;