Python prompt_toolkit: выбрать лучшее нечеткое совпадение, когда пользователь нажимает ввод - PullRequest
0 голосов
/ 12 апреля 2020

Я использую FuzzyCompleter из prompt_toolkit для CLI. Я дополнительно передаю complete_while_typing=True в функцию prompt.

Если я предоставлю список, содержащий, например, "Testing" и пользователь вводит "tst", он будет отображаться в качестве первого предложения. Но если пользователь затем нажимает ввод, результатом функции prompt будет «tst», а не «Testing». Если пользователь нажимает на вкладку и затем вводит, это, конечно, работает.

Мне бы хотелось, чтобы функция prompt возвращала только значения из списка завершения, а не бессмысленные строки, такие как "tst", которые пользователь вводит в совпадать быстро. Вкладка перед вводом не обязательна. Как мне этого добиться?

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете создать пользовательскую привязку ключа, чтобы выполнить завершение, когда пользователь нажимает ввод. Например:

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.

Если ваш Приложение «запрос» является более сложным (например, многострочный ввод или несколько буферов), тогда вам, вероятно, понадобится дополнительный лог c для обработки этих случаев. prompt_toolkit.filters.is_multiline может быть полезным.

...