Как настроить завершение bash, чтобы выбрать только пользовательский набор команд?

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

Пример:

$ m [tab] mycmd1 mycmd2 mycmd3

вместо команд, которые совпадают в PATH, псевдонимы и функции.

1 ответ

Следующее должно удалить "слово" из списка завершения. Функции завершения просто возвращают массив bash, и вы можете манипулировать им, чтобы он содержал все, что вам нравится:

_b() {
        local word=${COMP_WORDS[COMP_CWORD]}
        COMPREPLY=($(compgen -f -- "${word}"))
        if [[ "$word" ]]; then
                local  w
                local  i=0
                local  n=${#COMPREPLY[*]}
                while [[ $i -lt $n ]]
                do
                        w=${COMPREPLY[$i]}
                        COMPREPLY[$i]="${w:${#word}}"
                        let i++
                done
        fi
}

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

for c in /bin/* /usr/bin/* ~/bin/*
do
        complete -F _b $(basename $c)
done

Теперь вы можете настроить вышеупомянутые разделы кода, чтобы получить то, что вы пытаетесь найти (т.е. только некоторые команды). Подсказка.

Другие вопросы по тегам