Как настроить завершение 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
Теперь вы можете настроить вышеупомянутые разделы кода, чтобы получить то, что вы пытаетесь найти (т.е. только некоторые команды). Подсказка.