如何配置 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)
,我会得到以下信息:
【问题讨论】:
我刚刚使用 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_WORD
和SCE_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 中某些子视图的突出显示