如何配置DScintilla以突出显示某些样式属性的Lua?

时间:2013-05-24 19:41:35

标签: delphi colors lua scintilla

我正在尝试复制Lua的语法高亮样式:

http://oi55.tinypic.com/2h3youe.jpg

我正在使用DScintilla,VLC组件来支持Delphi中的Scintilla。我阅读了Dscintilla的每个模块以查看功能并获得我想要的内容,并且我已经完成了以下操作:

  • 边距(颜色,数量,宽度等)
  • colorize =,>,<,etc
  • 着色数字
  • 着色评论
  • 使用'...'
  • 为字符串着色

现在的问题是我无法将评论样式更改为斜体,或者将the lexer of Lua that Scintilla has中的条件(if,else,then,while等)着色, 或着色变量。

我当前的代码,有效的代码是:

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;
什么不起作用?这样:

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

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);

如果我致电ShowMessage(EditScript.DescribeKeyWordSets),我会收到以下信息:

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

2 个答案:

答案 0 :(得分:1)

如果问题只出现在关键字和变量名称上,那么它似乎归结为两件事:

  1. 您需要使用SetKeyWords来将您拥有的任何关键字分配给与SCE_LUA_WORDSCE_LUA_WORD#群组相对应的群组。例如,editor:SetKeyWords(0,"if then else")
  2. 对于变量名称,您似乎可能需要使用SCE_LUA_IDENTIFIER并以其他颜色为其他所有颜色着色。在我的例子中,设置editor:StyleSetForeground(wxstc.wxSTC_LUA_IDENTIFIER, wx.wxColour(127, 0, 0))正确地仅为使用的变量着色。

答案 1 :(得分:0)

好的,我已经尝试了很多组合,最终得到了这个“半”工作。 在编写setItalic之前,如果我为该样式编写SetFont,它在大多数情况下都会起作用,如下所示:

  StyleSetFont(SCE_LUA_COMMENTLINE, 'Courier New');
  StyleSetSize(SCE_LUA_COMMENTLINE,10);

  StyleSetItalic(SCE_LUA_COMMENTLINE,true);  // "--..."

所以现在 ONLY 问题是关键字变量名称(图中紫色)

<强> @Edited: 这是现在的样子: enter image description here

这是我使用的代码:

  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;