【问题标题】:Creating and colorizing new constructs on a existing Scintilla lexer在现有的 Scintilla 词法分析器上创建和着色新结构
【发布时间】:2014-03-28 02:16:47
【问题描述】:

全部,

我正在使用 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'))

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

非常感谢!

【问题讨论】:

    标签: python qt scintilla qscintilla


    【解决方案1】:

    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范围内的字符)

    【讨论】:

      【解决方案2】:

      为了获得更大的灵活性,您可以考虑构建自己的自定义词法分析器,而不是从现有的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/

      【讨论】:

      • 请注意,我从给定的网站上复制了一些文字。我可以这样做,因为我自己建立了那个网站 ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 2011-03-18
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 2021-11-23
      相关资源
      最近更新 更多