2

我正在尝试复制此处显示的 Lua 语法突出显示样式:

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

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

现在的问题是,我无法将注释样式更改为斜体,或对 Scintilla 的 Lua 词法分析器中的条件语句(if、else、then、while 等)进行着色条件语句(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),我会得到以下信息:

关键词
基本功能
字符串、(表格)和数学函数
(协程)、I/O 和系统设施
用户1
用户2
用户3
用户4
4

2 回答 2

1

如果问题仅在于关键字和变量名,则似乎归结为两件事:

  1. 您需要使用call 将您拥有的任何关键字分配给与和组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))正确设置颜色只使用了变量。
于 2013-05-26T20:38:37.957 回答
0

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

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

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

所以现在唯一的问题是关键字变量名(图片中的紫色)

@Edited: 这是现在的样子: 在此处输入图像描述

这是我使用的代码:

  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;
于 2013-05-26T18:42:53.240 回答