4

全部,

我正在使用 QScintilla 来语法高亮并自动完成我的领域特定语言 (DSL)。

我通过重新实现(QsciLexerCustom)编写了一个自定义词法分析器,并且我正在尝试使用自动完成功能。我的问题是自动完成功能不像我想要的那样工作。我希望我的自定义词法分析器像 QsciLexerPython 一样工作。也就是说,如果我在 api 中添加“toto.titi.tata”,当我输入“toto”时。在我的 qscintilla 编辑器中,它建议我使用“titi.tata”。截至目前,它建议我 toto.titi.tata。:(

我试图将“autoCompletionWordSeparators”添加到我的词法分析器中,但它不起作用。如何让我的自定义词法分析器像 QsciLexerPython 一样自动完成工作?非常感谢 !

Lexer = customlexer(self.text)
api = QsciAPIs(Lexer)
api.add('toto.titi.tata')
api.prepare()
Lexer.setAPIs(api)
self.text.setLexer(Lexer)

class lexer(QsciLexerCustom):
    def __init__(self, parent):
        QsciLexerCustom.__init__(self, parent)

    def autoCompletionWordSeparators(self):
        return ['.']
4

1 回答 1

2

当前的 QScintilla API 无法做到这一点。

主要障碍是您需要在QsciLexerCustom子类中重新实现的许多虚拟方法不是公共的。这就是为什么您的示例中的代码不起作用的原因 -autoCompletionWordSeparators设置词法分析器时忽略您的方法,而是调用基类方法QsciLexer(它返回一个空列表)。

您可能还认为您可以使用QsciScintilla.setAutoCompletionWordSeparators来解决这个问题,但是,这只有在没有设置词法分析器的情况下才有效!

解决此问题的唯一方法是自己实现自动完成(这是可行的,但需要做很多工作),或者在Qscintilla 邮件列表上提出功能请求,以将必要的虚拟方法添加到QsciLexerCustom.

此处列出了有问题的方法(名称以黑色粗体显示,而不是链接)。

于 2014-03-07T20:59:40.950 回答