Можно ли завершить bash программно? - PullRequest
13 голосов
/ 16 июля 2011

Мне нужна функция, которую я могу вызвать из программы, чтобы она завершила способ, которым bash дал бы командную строку и место, где была нажата TAB.

. /etc/bash_completion
generate_completions "command arg1 arg2" 17

вернет то же, что и

command arg1 arg2[TAB]

Я не видел никакого способа сделать это.

1 Ответ

8 голосов
/ 19 июля 2011

Я действительно должен был сделать это, чтобы выяснить, как apt-get autocomplete работает в Ubuntu (создал свой собственный инструмент псевдорепозитария:)

Это многоступенчатый процесс:

Во-первых, complete -p предоставит вам список всех дополнений в виде набора команд, которые вы можете запустить для репликации конфигурации. Например, допустим, вы хотите выследить автозаполнение для apt-get. Тогда:

$ complete -p | grep apt-get
complete -F _apt_get apt-get

Это говорит о том, что функция оболочки _apt_get вызывается механизмом завершения.

Вам необходимо воссоздать специальные переменные, используемые функцией, а именно COMP_LINE (полная строка), COMP_WORDS (массив bash всех аргументов - в основном разделенный COMP_LINE), COMP_CWORD (индекс должен указывать на последнее значение) , COMP_POINT (где внутри слова вы выполняете автозаполнение) и COMP_TYPE (именно так вы говорите, что хотите завершить, как если бы вы нажали Tab).

Примечание: прочитайте man-страницу для получения дополнительной информации - это то, как я понял это в первую очередь. man bash

...