Python 在现有闪烁lexer上创建和着色新结构

Python 在现有闪烁lexer上创建和着色新结构,python,qt,scintilla,qscintilla,Python,Qt,Scintilla,Qscintilla,全部, 我正在使用QSCINTILA语法突出显示我的领域特定语言(DSL) 因为我的DSL是基于python的,所以我使用现有的用于QSCINTILA的python Lexer。 我设法创建新的关键字,如下所示: self.text = Qscintilla(self) pythonLexer = QsciLexerPython(self.text) self.text.setLexer(pythonLexer) self.text.SendScintilla(QsciScintilla.SCI

全部,

我正在使用QSCINTILA语法突出显示我的领域特定语言(DSL)

因为我的DSL是基于python的,所以我使用现有的用于QSCINTILA的python Lexer。 我设法创建新的关键字,如下所示:

self.text = Qscintilla(self)
pythonLexer = QsciLexerPython(self.text)
self.text.setLexer(pythonLexer)
self.text.SendScintilla(QsciScintilla.SCI_SETKEYWORDS,1,bytes('WARNING', 'utf-8'))
现在,如何选择颜色来突出显示新创建的关键字


非常感谢

Python在突出显示一组关键字时非常有限,因为它只提供两个关键字供您使用。这个限制是由底层的
scatinlla
库中的Python Lexer类强加的,因此对此没有什么可以做的(除非您想要创建补丁)

但是,如果您只需要突出显示一组额外的关键字,那么您可以将
qscilepython
子类化并重新实现其方法:

在适当的情况下,您可以为样式执行以下操作:

    pythonLexer = CustomLexer(self.text)
    pythonLexer.setColor(
        QColor('purple'), QsciLexerPython.HighlightedIdentifier)
    ...

(PS:注意关键字在0~255范围内仅包含单字节字符)

,以获得更大的灵活性,可以考虑建立自己的自定义词表,而不是从现有的<代码> QSLILLYPYPOTHON</代码>中派生出来的。小心,这将是更多的工作

QSCINTILA为此目的提供了
QSCIlCustom
类。您必须将其子类化,如下所示:

class MyLexer(QsciLexerCustom):

    def __init__(self, parent):
        super(MyLexer, self).__init__(parent)
        [...]
    ''''''

    def language(self):
        [...]
    ''''''

    def description(self, style):
        [...]
    ''''''

    def styleText(self, start, end):
        # Called everytime the editors text has changed
        [...]
    ''''''

'''--- end class ---'''
请注意以下部分:

  • \uuuuu init\uuuuuuu(self,parent)
    :构造函数通常是创建样式对象的地方

  • 语言(self)
    :此方法必须返回语言的名称。你必须实现它,但我不清楚它的实际用途

  • description(self,style\u nr)
    :返回给定样式的描述性名称

  • 样式文本(self、start、end)
    :每次更改文本时都会调用。在这里,您可以实现语法高亮显示


有关更多详细信息,您可以访问以下网站:

请注意,我从给定网站上随意复制了一些文本。我可以这样做,因为我自己建立了那个网站;-)
class MyLexer(QsciLexerCustom):

    def __init__(self, parent):
        super(MyLexer, self).__init__(parent)
        [...]
    ''''''

    def language(self):
        [...]
    ''''''

    def description(self, style):
        [...]
    ''''''

    def styleText(self, start, end):
        # Called everytime the editors text has changed
        [...]
    ''''''

'''--- end class ---'''