QScintilla自动完成python中的自定义词法分析器

时间:2014-03-07 16:36:19

标签: autocomplete lexer qscintilla

所有

我正在使用QScintilla语法高亮并自动填充我的域特定语言(DSL)。

我通过重新实现(QsciLexerCustom)编写了一个自定义词法分析器,我正在尝试使用自动完成功能。 我的问题是自动完成不能像我想的那样工作。 我希望我的自定义词法分析器像QsciLexerPython一样工作。也就是说,如果我将'toto.titi.tata'添加到api,当我输入'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 ['.']

1 个答案:

答案 0 :(得分:2)

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

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

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

解决此问题的唯一方法是自己实现自动完成(这是可行的,但很多的工作),或者在Qscintilla mailing list上发出功能请求获取必要的虚拟方法添加到QsciLexerCustom的公共API。

有问题的方法是listed here(名称以粗体黑色显示,而不是作为链接显示。)