Встроенная команда bash complete
может использоваться для настройки завершения табуляции в bash.
См. документация по bash для получения дополнительной информации.
Вкратце, это можно сделать, указав пользовательскую функцию завершения для java, complete -F _comp_java java
.
Затем функция может использовать переменные COMP_WORDS и COMP_CWORD для доступа к словам (и текущему индексу слов) в командной строке, чтобы сгенерировать список возможных дополнений.
Возможные дополнения должны быть помещены в массив COMPREPLY. Встроенный compgen
может быть объединен с выводом команды ls
, чтобы найти все пути, начинающиеся с текущего слова.
Эти возможные дополнения можно затем изменить, чтобы заменить косые черты точками.
Вот один из способов сделать это. Любые более чистые решения будут приняты.
_comp_java () {
prev=${COMP_WORDS[$COMP_CWORD - 1]}
case $prev in
"-jar")
COMPREPLY=($(compgen -A file -- ${COMP_WORDS[$COMP_CWORD]}))
;;
*)
fields=($(echo ${COMP_WORDS[$COMP_CWORD]} | tr "." "\n"));
[ "${COMP_WORDS[$COMP_CWORD]: -1}" == "." ] && lastIdx=0 || lastIdx=1
[ ${#COMP_WORDS[$COMP_CWORD]} -eq 0 ] || [ ${lastIdx} -eq 0 ] && lastWord='' || lastWord=${fields[${#fields[@]}-1]}
[ ${#COMP_WORDS[$COMP_CWORD]} -eq 0 ] && fields=() || fields=($(echo ${fields[*]:0:${#fields[@]}-$lastIdx}))
[ ${lastIdx} -eq 0 ] && prefix=${COMP_WORDS[$COMP_CWORD]} || prefix=$(tr ' ' '.' <<< $(echo "${fields[@]}."))
[ "${prefix:0}" == "." ] && prefix=""
COMPREPLY=( $(compgen -W "$(ls $(tr ' ' '/' <<< $(echo ${fields[@]})))" -- $lastWord ))
COMPREPLY=(${COMPREPLY[@]/#/$prefix})
COMPREPLY=(${COMPREPLY[@]/%/.})
COMPREPLY=(${COMPREPLY[@]/.class./})
COMPREPLY=(${COMPREPLY[@]/.java./})
;;
esac
return 0
}
complete -o nospace -o filenames -F _comp_java java