Доступ к завершению bash для определенных команд программно
Я пытаюсь написать небольшое приложение запуска командной строки и хотел бы использовать завершение вкладок bash в моей собственной системе завершения. Мне удалось получить список дополнений для общих команд с помощью compgen -abck
.
Тем не менее, я также хотел бы получить дополнения для конкретных команд: например, вход git p
должен отображать завершение для команд git.
Можно ли использовать compgen
для этого? Если нет, есть ли другие способы, с помощью которых я могу получить список завершений программным способом?
[РЕДАКТ.: Чтобы уточнить, я не пытаюсь выполнить обеспечить завершение до bash - мое приложение представляет собой панель запуска GUI. Я просто хотел бы использовать bash существующие дополнения в моем собственном приложении.]
Ответы
Ответ 1
Я действительно не знаю, как это работает, но awesome window manager использует следующий код Lua для доступа к завершению bash результат:
https://github.com/awesomeWM/awesome/blob/master/lib/awful/completion.lua#L119
- Через
complete -p
находим complete -o bashdefault -o default -o nospace -F _git git
. Мы помним "_git" позже.
- Длина "git l" равна 5, поэтому мы устанавливаем COMP_COUNT = 6. Мы завершаем первый аргумент "git", поэтому COMP_CWORD = 1.
Все вместе мы используем следующие script:
__print_completions() {
printf '%s\n' "${COMPREPLY[@]}"
}
# load bash-completion functions
source /etc/bash_completion
# load git completion function
_completion_loader git
COMP_WORDS=(git l)
COMP_LINE='git l'
COMP_POINT=6
COMP_CWORD=1
_git
__print_completions
Выход: "журнал"
Ответ 2
Взгляните на администрацию Debian Введение в bash завершение - это довольно легко понять - кстати, это также имеет часть вторая.
Ответ 3
Зайдите в каталог /etc/bash_completion.d/
. Здесь хранятся различные сценарии завершения команд.
Ответ 4
Вот простой, но рабочий пример в bash:
function foo_completion()
{
local currentWord=${COMP_WORDS[COMP_CWORD]}
local completionList=""
case "${COMP_CWORD}" in
"1")
completionList="command1 command2 command3";
;;
"2")
completionList="param1 param2 param3";
;;
esac
COMPREPLY=( $( compgen -W "${completionList}" -- ${currentWord} ) )
}
complete -F foo_completion foo
При таком виде кода вы получите командуN завершена, когда вы наберете "foo c" + tab и paramN, завершенную при вводе "foo command1 p" + tab
Вы можете вычислить список завершения из командной справки.
my2c
Ответ 5
Я взломал этот script a назад, который дает вам довольно точный Man-page Bash Completion Я знаю, что другие люди имеют сделал аналогичные действия с разбором вывода --help
.