Пользовательское завершение пути в Bash

Я хочу написать скрипт bash_completion для своей файловой системы. У меня есть клиентская программа, которая отправляет запросы в некоторые БД.

пример:

my_prog --ls db_name:/foo/bar/

эта команда записывает в стандартный вывод список файлов в папке db_name:/foo/bar.

Я хочу включить автозаполнение для этого. Поэтому, когда я нажимаю вкладку, он показывает список параметров.

my_prog --ls db_name:/foo/bar/<tab>

но в этом случае, когда я нажимаю вкладку и есть один вариант, он заменяет текущий введенный путь, поэтому я получаю следующее:

$ my_prog --ls db_name:/foo/bar/<tab>
$ my_prog --ls file

Но я хочу, чтобы совпадение было добавлено в конец введенного пути.

Вот моя функция завершения:

__complete_path()
{
    COMPREPLY=()

    if [[ ${1} == "" ]]
    then
        COMPREPLY=( "/" )
        compopt -o nospace
        return
    fi

    base=${1##*/}
    dir=${1%/*}

    options="my_prog --ls ${db}:${dir}"
    COMPREPLY=( $(compgen -W "${options}" -- ${base} ) )

    compopt -o nospace
}

person oybek    schedule 04.09.2016    source источник
comment
Что такое ${db}??   -  person F. Hauri    schedule 20.12.2016


Ответы (1)


Я нашел эту тему, пытаясь что-то подобное. Этот пост на stackexchange помог меня в объединении функции автозаполнения ниже. Это не совсем «нормальное» автозаполнение, поскольку показаны полные пути, но в остальном вы можете найти его полезным.

_complete_func()
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    if [ $COMP_CWORD -eq 1 ]; then
    opts="some options for the program"
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
    elif [ $COMP_CWORD -ge 2 ]; then
    local files=("${cur}"*)
        COMPREPLY=( "${files[@]}")
fi
}
complete -o nospace -F complete_func command_to_autocomplete
person pietervanderstar    schedule 26.12.2016