阻止绝地在 space 之后完成所有事情
Preventing jedi to complete everything after space
我正在尝试使用 jedi 来完成 PyQt 应用程序中的 python 代码,使用 QCompleter
和 QStringListModel
来存储可能的完成。
这是一个简单的工作演示:
#!/usr/bin/env python3
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import jedi
import sys
class JediEdit(QLineEdit):
def __init__(self, parent=None):
super().__init__(parent)
self._model = QStringListModel()
self._compl = QCompleter()
self._compl.setModel(self._model)
self.setCompleter(self._compl)
self.textEdited.connect(self.update_model)
def update_model(self, cur_text):
script = jedi.Script(cur_text)
compl = script.completions()
strings = list(cur_text + c.complete for c in compl)
self._model.setStringList(strings)
if __name__ == '__main__':
app = QApplication(sys.argv)
line = JediEdit()
line.show()
sys.exit(app.exec_())
如果您 运行 应用程序并编写了未完成任何内容的代码(例如 </code> 或 <code>foo =
),完成实际上会显示所有可以进入该位置的可能标记。
所以,如果我 运行 并在该字段中写一个 space,就会弹出很多东西,从 abs
到 __version__
。
我想避免这种情况:是否可以查询 jedi.Script
以了解令牌是否正在完成或是否正在启动一个全新的令牌?
编辑:另一个小问题:假设我运行宁是一个脱离绝地当前状态的解释器。我如何向 jedi.Script
提供局部和全局变量,以便它考虑这些变量,而不是它自己的补全?
自动补全
Jedi 的自动完成功能将始终在一个地方显示所有可能的标记。这就是自动补全的重点。
如果您不希望出现这种情况,只需扫描最后几个字符中的空格和某些其他字符,如 =
或 :
,这将是一个非常简单的正则表达式命令。 (您也可以尝试查找 Jedi 的内部结构并使用 Jedi 了解此上下文的方式。但是我不会告诉您,因为它不是 public API 并且恕我直言,正则表达式调用就足够了.)
将来可能会发生类似的事情。 (参见 https://github.com/davidhalter/jedi/issues/253)。
现在我想到了,您可能还有另一种方法可以对此进行试验:您可以尝试使用 Completion.name
和 Completion.complete
。后者只为您提供当前令牌之后可能出现的内容,而名称将是完整的内容。所以你可以比较,如果它们相等,你可能不想显示任何东西。
玩得开心 API :-)
口译员
如果您是 运行 解释器,则可以使用 jedi.Interpreter
将代码与实际的 Python 对象结合起来。它非常灵活。但请注意,当前的解释器 (0.8.1) 有很多错误。请使用 Github (0.9.0) 的主分支。
我正在尝试使用 jedi 来完成 PyQt 应用程序中的 python 代码,使用 QCompleter
和 QStringListModel
来存储可能的完成。
这是一个简单的工作演示:
#!/usr/bin/env python3
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import jedi
import sys
class JediEdit(QLineEdit):
def __init__(self, parent=None):
super().__init__(parent)
self._model = QStringListModel()
self._compl = QCompleter()
self._compl.setModel(self._model)
self.setCompleter(self._compl)
self.textEdited.connect(self.update_model)
def update_model(self, cur_text):
script = jedi.Script(cur_text)
compl = script.completions()
strings = list(cur_text + c.complete for c in compl)
self._model.setStringList(strings)
if __name__ == '__main__':
app = QApplication(sys.argv)
line = JediEdit()
line.show()
sys.exit(app.exec_())
如果您 运行 应用程序并编写了未完成任何内容的代码(例如 </code> 或 <code>foo =
),完成实际上会显示所有可以进入该位置的可能标记。
所以,如果我 运行 并在该字段中写一个 space,就会弹出很多东西,从 abs
到 __version__
。
我想避免这种情况:是否可以查询 jedi.Script
以了解令牌是否正在完成或是否正在启动一个全新的令牌?
编辑:另一个小问题:假设我运行宁是一个脱离绝地当前状态的解释器。我如何向 jedi.Script
提供局部和全局变量,以便它考虑这些变量,而不是它自己的补全?
自动补全
Jedi 的自动完成功能将始终在一个地方显示所有可能的标记。这就是自动补全的重点。
如果您不希望出现这种情况,只需扫描最后几个字符中的空格和某些其他字符,如 =
或 :
,这将是一个非常简单的正则表达式命令。 (您也可以尝试查找 Jedi 的内部结构并使用 Jedi 了解此上下文的方式。但是我不会告诉您,因为它不是 public API 并且恕我直言,正则表达式调用就足够了.)
将来可能会发生类似的事情。 (参见 https://github.com/davidhalter/jedi/issues/253)。
现在我想到了,您可能还有另一种方法可以对此进行试验:您可以尝试使用 Completion.name
和 Completion.complete
。后者只为您提供当前令牌之后可能出现的内容,而名称将是完整的内容。所以你可以比较,如果它们相等,你可能不想显示任何东西。
玩得开心 API :-)
口译员
如果您是 运行 解释器,则可以使用 jedi.Interpreter
将代码与实际的 Python 对象结合起来。它非常灵活。但请注意,当前的解释器 (0.8.1) 有很多错误。请使用 Github (0.9.0) 的主分支。