3

全部,

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

由于我的 DSL 基于 python,因此我将现有的 Python Lexer 用于 QScintilla。我设法创建新的关键字如下:

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

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

非常感谢!

4

2 回答 2

0

QsciLexerPython突出显示关键字集方面非常有限,因为它只给你两个玩。此限制是由底层Scintilla库中的 Python Lexer 类强加的,因此对此无能为力(除非您想创建补丁)。

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

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

有了它,您就可以为样式设置颜色、字体等

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

(PS:注意关键字只能包含0-255范围内的单字节字符)

于 2014-02-25T19:07:34.370 回答
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/

于 2017-05-13T18:02:22.067 回答