【问题标题】:QScintilla autocomplete on custom lexer in pythonpython中自定义词法分析器上的QScintilla自动完成功能
【发布时间】:2014-04-10 22:14:15
【问题描述】:

全部,

我正在使用 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 ['.']

【问题讨论】:

  • 这没有回答问题,但我已经在 QScintilla 中为自定义词法分析器实现了自动完成功能,但我还必须创建一个自定义解析器来查找代码中的类和函数定义。使用 SendScintilla(),您可以轻松地通过 QScintilla 使用低级 Scintilla api 调用来显示自动完成框,但是填充它需要自定义解析器。
  • 这也可能有帮助:qscintilla.com

标签: autocomplete lexer qscintilla


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-23
    • 2015-04-24
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2021-06-24
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多