如何在 prompt_toolkit 中重用 PathCompleter 的补全
How to reuse completions from PathCompleter in prompt_toolkit
我正在为我的项目创建一个 REPL 工具(为清楚起见进行了简化)直接执行输入的命令或(如果输入命令“.x some/path/to/file”)从文件中读取并执行它们。我的问题与自动完成用户输入有关(使用 prompt_toolkit)。
我有类似的东西(最小可执行示例):
import prompt_toolkit
from prompt_toolkit.completion import Completer, Completion
from prompt_toolkit.document import Document
from prompt_toolkit.contrib.completers import PathCompleter
class CommandCompleter(Completer):
def __init__(self):
self.path_completer = PathCompleter()
self.commands = [".x", "command1", "command2"]
def get_completions(self, document, complete_event):
if document.text.startswith(".x "):
sub_doc = Document(document.text[3:])
yield from (Completion(cmd.text, -document.cursor_position)
# ???????? ?????????????????????????
for cmd
in self.path_completer.get_completions(sub_doc, complete_event))
# ???????
else:
yield from (Completion(cmd, -document.cursor_position)
for cmd in self.commands
if cmd.startswith(document.text))
if __name__ == "__main__":
while True:
other_args = {}
input = prompt_toolkit.prompt(">>> ", completer=CommandCompleter(), **other_args)
# Do something with input (omitted)
第二个 if 分支(用于命令)工作正常,但我不知道如何正确调用 PathCompleter.get_completions()
方法并从其结果重建 Completion
对象(其中 ?? ?'s are) 在第一个分支中。诀窍是我只对输入的一部分使用完成,各种子字符串、位置计算等(还)没有导致令人满意的行为(即提供路径和构建正确的输入行)。
我一定会继续搜索,但如果有人知道如何重写它,那将非常有用。
注意:如果整个输入只是路径(这可以正常工作),则将使用 yield from self.path_completer.get_completions(document, complete_event)
。
可能应该通过以下方式解决它:
sub_doc = Document(document.text[3:])
yield from (Completion(completion.text, completion.start_position, display=completion.display)
for completion
in self.path_completer.get_completions(sub_doc, complete_event))
completion.text
包含要插入的文本;
completion.start_position
包含将要插入文本的位置,相对于光标位置(在这个特定示例中,我们可以从嵌套完成器中获取值)。
completion.display
是弹出菜单中显示的值。 (在本例中,是整个文件名,而不仅仅是插入的字符串。
如果您有任何问题,请随时打开 GitHub 问题。
我正在为我的项目创建一个 REPL 工具(为清楚起见进行了简化)直接执行输入的命令或(如果输入命令“.x some/path/to/file”)从文件中读取并执行它们。我的问题与自动完成用户输入有关(使用 prompt_toolkit)。
我有类似的东西(最小可执行示例):
import prompt_toolkit
from prompt_toolkit.completion import Completer, Completion
from prompt_toolkit.document import Document
from prompt_toolkit.contrib.completers import PathCompleter
class CommandCompleter(Completer):
def __init__(self):
self.path_completer = PathCompleter()
self.commands = [".x", "command1", "command2"]
def get_completions(self, document, complete_event):
if document.text.startswith(".x "):
sub_doc = Document(document.text[3:])
yield from (Completion(cmd.text, -document.cursor_position)
# ???????? ?????????????????????????
for cmd
in self.path_completer.get_completions(sub_doc, complete_event))
# ???????
else:
yield from (Completion(cmd, -document.cursor_position)
for cmd in self.commands
if cmd.startswith(document.text))
if __name__ == "__main__":
while True:
other_args = {}
input = prompt_toolkit.prompt(">>> ", completer=CommandCompleter(), **other_args)
# Do something with input (omitted)
第二个 if 分支(用于命令)工作正常,但我不知道如何正确调用 PathCompleter.get_completions()
方法并从其结果重建 Completion
对象(其中 ?? ?'s are) 在第一个分支中。诀窍是我只对输入的一部分使用完成,各种子字符串、位置计算等(还)没有导致令人满意的行为(即提供路径和构建正确的输入行)。
我一定会继续搜索,但如果有人知道如何重写它,那将非常有用。
注意:如果整个输入只是路径(这可以正常工作),则将使用 yield from self.path_completer.get_completions(document, complete_event)
。
可能应该通过以下方式解决它:
sub_doc = Document(document.text[3:])
yield from (Completion(completion.text, completion.start_position, display=completion.display)
for completion
in self.path_completer.get_completions(sub_doc, complete_event))
completion.text
包含要插入的文本;completion.start_position
包含将要插入文本的位置,相对于光标位置(在这个特定示例中,我们可以从嵌套完成器中获取值)。completion.display
是弹出菜单中显示的值。 (在本例中,是整个文件名,而不仅仅是插入的字符串。
如果您有任何问题,请随时打开 GitHub 问题。