Python prompt_toolkit:当用户按下回车键时选择最佳模糊匹配

Python prompt_toolkit: Pick best fuzzy match when the user presses enter

我正在通过 CLI 使用 prompt_toolkit 中的 FuzzyCompleter。我另外将 complete_while_typing=True 传递给 prompt 函数。

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

我希望 prompt 函数仅包含完成列表中的 return 个值,而不是像 "tst" 这样用户键入以快速匹配的无意义字符串。输入前的 Tab 不应该是必需的。我怎样才能做到这一点?

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

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 and key_binding/bindings/basic.py

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