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

Posted

技术标签:

【中文标题】如何配置 DScintilla 以突出显示具有某些样式属性的 Lua?【英文标题】:How do I configure DScintilla to highlight Lua with certain style attributes? 【发布时间】:2013-05-24 19:41:34 【问题描述】:

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

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

边距(颜色、数字、宽度等) 着色 =、>、 为数字着色 为 cmets 着色 使用“...”为字符串着色

现在的问题是我无法将注释样式更改为斜体,或对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),我会得到以下信息:

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

【问题讨论】:

我刚刚使用 wxlua 进行了尝试,并且设置样式颜色和设置斜体属性都可以工作。您使用的是哪个版本的 Scintilla?您是否收到任何错误或没有明显差异? 我没有收到任何错误,因为 Scintilla 有一个很好的“如果值无效,则结束时没有错误”,但我看不到明显的差异。我正在使用来自code.google.com/p/dscintilla 的最新 DScintilla 和最后一个 SciLexer.dll(版本 3.3.2) 这是最近的。我已经看到一些绑定采用 1/0 而不是真/假。此外,如果您无法使用 Italic 属性,您始终可以将 StyleSetFont 与具有 Italic 样式的字体一起使用。 虽然我可以做到,但我无法用这些特殊的词“while,else,if,begin,end,etc.”来解决词法分析器的问题。在我发布的链接中(在 Scintilla 内) @PaulKulchenko 【参考方案1】:

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

    您需要使用SetKeyWords 调用将您拥有的任何关键字分配给与SCE_LUA_WORDSCE_LUA_WORD# 组相对应的组。例如,editor:SetKeyWords(0,"if then else")。 对于变量名称,您可能需要使用SCE_LUA_IDENTIFIER 并将其他所有内容都涂上不同的颜色。在我的情况下,正确设置 editor:StyleSetForeground(wxstc.wxSTC_LUA_IDENTIFIER, wx.wxColour(127, 0, 0)) 只为使用的变量着色。

【讨论】:

你在开玩笑吗?即使在 Scintilla 中编写,我是否必须编写每个关键字? (@ 987654321@)... w/e,无论如何感谢一切,我会将我的答案设置为已接受,并为您的答案+1,因为它也是解决问题的方法(但不是最终的)。你同意吗? @user2308704,是的,请参阅scintilla.org/ScintillaDoc.html#SCI_SETKEYWORDS。那是你的问题,所以不管对你有用;)【参考方案2】:

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

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

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

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

@已编辑: 这是现在的样子:

这是我使用的代码:

  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;

【讨论】:

以上是关于如何配置 DScintilla 以突出显示具有某些样式属性的 Lua?的主要内容,如果未能解决你的问题,请参考以下文章

C#/.NET 如何突出显示 DataGridView 中的某些行

如何在鼠标悬停时突出显示图像地图的某些部分?

更改 UITableViewCell 中某些子视图的突出显示

在 textarea Reactjs 中键入时突出显示文本

Swift 如何在另一个 UITextField 突出显示或具有值时禁用 TextField

Solr 不突出显示某些单词