【问题标题】:wxStyledTextCtrl how to style keywordswxStyledTextCtrl 如何给关键字设置样式
【发布时间】:2019-05-10 08:53:30
【问题描述】:

让 wxStyledTextCtrl 为我的单词列表着色时遇到了一些麻烦。

x->m_ctlEdit->SetKeyWords(0,"true false");
x->SetWordChars(wxT("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMONPQRSTUVWXYZ._") );
x->StyleSetForeground(wxSTC_HPHP_WORD, wxColour(0x67,0xa6,0xff));

true 和 false 以这种方式不接受着色,我在许多其他定义中使用了 StyleSetForeground,一切正常,只是单词列表有问题。

作为第二个问题,我如何为不同的单词列表区分颜色?我知道我可以使用数字标识符设置不同的关键字列表,但是由于该函数不接受标识符,我该如何应用每个关键字列表的样式?

注意: 使用作为 wxStyledTextCtrl 的默认选项的 HTML/PHP 词法分析器

【问题讨论】:

    标签: c++ wxwidgets scintilla wxstyledtextctrl


    【解决方案1】:

    对于wxSTC_LEX_HTML html 词法分析器或wxSTC_LEX_PHPSCRIPT php 词法分析器,您需要指定关键字集4。例如:

    x->m_ctlEdit->SetKeyWords(4,"true false");
    

    如果您使用的是 html 词法分析器,您可以通过调用 x->m_ctlEdit->DescribeKeyWordSets(); 来了解这一点,这将返回以下列表:

    • HTML 元素和属性
    • JavaScript 关键字
    • VBScript 关键字
    • Python 关键字
    • PHP 关键字
    • SGML 和 DTD 关键字

    在这种情况下,PHP 关键字的从 0 开始的索引是 4,因此这将是传递给 SetKeyWords 方法的数字。

    但是,这种检查方式在使用 PHP 词法分析器时会失败,因为调用 DescribeKeyWordSets 只会返回“PHP 关键字”。所以你会认为你应该用 0 调用SetKeyWords,但实际上你仍然需要使用 4,因为 php 脚本词法分析器与 html 词法分析器相同。这似乎是 Scintilla 的一个奇怪之处。

    在不相关的说明中,我认为对SetWordChars 的调用是不必要的。根据文档,这是按单词而不是关键字搜索。

    作为第二个问题,我如何为不同的单词列表区分颜色?

    这取决于词法分析器。例如,C 词法分析器提供以下关键字集

    • 主要关键字和标识符
    • 辅助关键字和标识符
    • 文档注释关键字
    • 全局类和类型定义
    • 预处理器定义

    对应于词法​​分析器状态wxSTC_C_WORDwxSTC_C_WORD2wxSTC_C_COMMENTDOCKEYWORD

    不幸的是,如上所述,html 词法分析器只为 PHP 提供了 1 个关键字集。

    【讨论】:

    • 感谢精心设计的答案,是否可以扩展 HTML 词法分析器的键集或覆盖现有定义?例如,如果我用 (true false null) 填充关键字集 7,那么在样式设置时,这个或关键字集 4 会优先吗?
    • 在发布此答案之前,我确实尝试查看是否可以使用 JavaScript 和 Python,但看起来词法分析器不会将它们与 PHP 代码一起使用。如果您设置关键字集 6 或 7,词法分析器根本不会使用它们。所以我不会覆盖或扩展会工作。
    • 如果真的需要使用多个关键字集,我唯一能想到的就是把现有的scintillahtml lexer,转换成外部词法分析器,修改为使用关键字集6和 7 用于附加 PHP 关键字集。 Here's 一个如何将现有 python 词法分析器转换为外部词法分析器的示例。查看 html 词法分析器的代码,看起来应该不会太难。
    • 您也可以尝试在 scintilla-interest 邮件列表中询问是否有办法在 PHP 中使用多个关键字集。
    • 这是我无法帮助您的一个领域。如果您无法更新到更高的 wxWidgets 版本并打算尝试修改 wxSTC 源,我认为您将有更好的运气添加让 wxSTC 使用外部词法分析器的changes,然后尝试使用 JSON 词法分析器作为外部的。
    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多