Как написать завершение bash для завершения имен директоров, начинающихся с ~ /

Представьте, что у меня есть скрипт bash myscript, который будет echo только первым аргументом, который будет именем каталога.
Пример использования:
myscript proj1
Где proj1 - это каталог, например, расположенный в ~/folder1/folder2/proj1, а ваш текущий рабочий каталог - ~/.
Мой вопрос заключается в том, чтобы для этого сценария я мог написать правило завершения, чтобы myscript [tab][tab] перечислял все каталоги, доступные для echo, начиная с ~/. Это означает, что в первом примере и предполагая, что это единственные каталоги в ~/, myscript pro[tab] завершит выражение до myscript proj1.
Может ли кто-нибудь помочь мне достичь этого?

Заранее спасибо.

1
задан 19 March 2015 в 23:40

1 ответ

Ваше описание кажется нечетным: Если Вы становитесь справедливыми proj1, как Вы знаете, каков его родительский каталог?

Так или иначе, чтобы дать Вам, что Вы попросили:

# for me, this takes a looooooong time [1]. Do it once and cache it
mapfile -t _all_dir_names < <( find ~ -type d -printf "%f\n" )

# the function you want completion for
myfunc () { echo hello world $*; }

# the completion function
complete_myfunc() {
    local dir cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=()
    for dir in "${_all_dir_names[@]}"; do
        if [[ $dir == "$cur"* ]]; then
            printf -v dir "%q" "$dir"      # protect whitespace in the dir name
            COMPREPLY+=("$dir")
        fi
    done
}

# registering the completion
complete -F complete_myfunc myfunc

[1]: 2 минуты, 66 782 каталога

3
ответ дан 19 March 2015 в 23:40

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

Похожие вопросы: