Как сказать `complete` откатиться до значения по умолчанию? - PullRequest
0 голосов
/ 27 декабря 2018

Я использую complete bash-builtinin, чтобы включить произвольное автозаполнение для моего скрипта Python.Я установил его с помощью:

complete -C './script.py --compgen "$@"' ./script.py

, чтобы всякий раз, когда bash пытается выполнить автозаполнение, он запускает мой скрипт с флагом --compgen, который указывает моему скрипту на автоматическое завершение.Это прекрасно работает.

Однако я хочу иметь возможность вернуться к поведению bash по умолчанию в некоторых ситуациях из script.py.Есть ли способ сказать complete, что он должен перезапуститься без вызова моего скрипта и вместо этого сделать его по умолчанию?

В принципе, я хочу избежать повторной реализации расширения имени файла при обращении к файлу.

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Оказывается, что откат вывода compgen из скрипта python имеет тот недостаток, что он не экранирован.Таким образом, если пользователь пытается заполнить имя файла, например a/b/c d.txt, командная строка изменится с:

./script.py a/b/c\ d.txt

на

./script.py a/b/c d.txt

после нажатия вкладки.Другие расширения тоже ломаются. Встроенный complete предлагает запасной вариант , однако:

complete -C './script.py --compgen "$@"' -o default ./script.py
#                                        ^^^^^^^^^^

Что это значит, сказать завершить, чтобы сначала попробовать часть -C, и если эта часть возвращает ноль совпадений, оназапрашивает завершение по умолчанию, которое затем выполняет разрешение имени файла и т. д.

Я обнаружил, что можно даже принудительно завершить, чтобы не предлагать никаких предложений, возвращая в качестве предложения именно пустую строку.Это предотвращает запуск аварийного отката, но также не считается фактическим предложением для завершения, поэтому не учитывает пустую строку.

0 голосов
/ 27 декабря 2018

Попробуйте это в своем коде Python:

import os
# if failed:
os.system("bash -c 'compgen -o default'")
...