Подтвердить что ты не робот

Доступ к завершению bash для определенных команд программно

Я пытаюсь написать небольшое приложение запуска командной строки и хотел бы использовать завершение вкладок bash в моей собственной системе завершения. Мне удалось получить список дополнений для общих команд с помощью compgen -abck.
Тем не менее, я также хотел бы получить дополнения для конкретных команд: например, вход git p должен отображать завершение для команд git.

Можно ли использовать compgen для этого? Если нет, есть ли другие способы, с помощью которых я могу получить список завершений программным способом?

[РЕДАКТ.: Чтобы уточнить, я не пытаюсь выполнить обеспечить завершение до bash - мое приложение представляет собой панель запуска GUI. Я просто хотел бы использовать bash существующие дополнения в моем собственном приложении.]

4b9b3361

Ответ 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

Выход: "журнал"

Ответ 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.