所有
我正在使用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'))
现在,如何选择颜色以突出显示我新创建的关键字?
非常感谢!
答案 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/