0

我正在通过 CLI使用FuzzyCompleterfrom for 。prompt_toolkit我另外传递complete_while_typing=Trueprompt函数。

如果我提供一个包含例如“Testing”的列表并且用户键入“tst”,它将显示为第一个建议。但是如果用户随后按下回车,prompt函数的结果将是“tst”,而不是“Testing”。如果用户按 Tab 然后输入,它当然可以工作。

我希望该prompt函数仅返回完成列表中的值,而不是用户键入以快速匹配的“tst”之类的无意义的字符串。输入前的制表符不应该是必需的。我怎样才能做到这一点?

4

1 回答 1

1

您可以创建自定义键绑定以在用户按 Enter 时执行完成。例如:

from prompt_toolkit import prompt
from prompt_toolkit.completion import FuzzyWordCompleter
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.filters import (
    has_completions,
    completion_is_selected,
)

# Override enter key to automatically perform first completion.
key_bindings = KeyBindings()
filter = has_completions & ~completion_is_selected
@key_bindings.add("enter", filter=filter)
def _(event):
    event.current_buffer.go_to_completion(0)
    event.current_buffer.validate_and_handle()

completer = FuzzyWordCompleter([
    "Using", "Testing", "Building", "Designing", "Documenting"
])
result = prompt("$ ",
    completer=completer,
    complete_while_typing=True,
    key_bindings=key_bindings,
)
if result:
    print(result)

将被覆盖的键绑定当前位于shortcuts/prompt.py和中key_binding/bindings/basic.py

如果您的提示应用程序更复杂(例如多行输入或多个缓冲区),那么您可能需要额外的逻辑来处理这些情况。 prompt_toolkit.filters.is_multiline可能有用。

于 2020-04-13T12:16:54.887 回答