在现有的Scintilla词法分析器上创建和着色新构造

时间:2014-02-25 17:09:41

标签: python qt scintilla qscintilla

所有

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

由于我的DSL基于python,我使用现有的Python Lexer for QScintilla。 我设法创建以下新关键字:

self.text = Qscintilla(self)
pythonLexer = QsciLexerPython(self.text)
self.text.setLexer(pythonLexer)
self.text.SendScintilla(QsciScintilla.SCI_SETKEYWORDS,1,bytes('WARNING', 'utf-8'))

现在,如何选择颜色以突出显示我新创建的关键字?

非常感谢!

2 个答案:

答案 0 :(得分:0)

在突出显示关键字集时,QsciLexerPython非常有限,因为它只会让你玩两个。这个限制是由基础Scintilla库中的Python Lexer类强加的,所以关于它的可行性不大(除非你想创建一个补丁)。

但是,如果您只需要突出显示一组额外的关键字,那么您可以继承QsciLexerPython并重新实现其keywords方法:

class CustomLexer(QsciLexerPython):
    def keywords(self, keyset):
        if keyset == QsciLexerPython.HighlightedIdentifier:
            return b'WARNING'
        return QsciLexerPython.keywords(self, keyset)

有了这个,你可以set the color, font, etc获得风格:

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

(PS:请注意,关键字只能包含单字节字符,范围为​​0-255)

答案 1 :(得分:0)

为了获得更大的灵活性,您可以考虑构建自己的自定义词法分析器,而不是从现有的QsciLexerPython派生词。小心 - 这将是更多的工作。

QScintilla为此目的提供QsciLexerCustom类。你必须像这样继承它:

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 ---'''

请注意以下部分:

  • __init__(self, parent):构造函数通常是创建样式对象的位置。

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

  • description(self, style_nr):返回给定样式的描述性名称。

  • styleText(self, start, end):每当编辑器文本发生变化时都会调用。在这里实现语法高亮!

有关详情,请访问以下网站:https://qscintilla.com/subclass-qscilexercustom/