Как заменить аргумент командной строки автодополнением с помощью табуляции?

Мне интересно, возможно ли это в Bash, но я хотел бы использовать автодополнение табуляции, чтобы полностью заменить текущий расширяемый аргумент. Я приведу пример: Я хотел бы иметь функцию, которая перемещается вверх на произвольное количество уровней в дереве, поэтому я могу вызвать до 2 И это бы cd мне 2 каталога вверх. Тем не менее, я хотел бы сделать так, чтобы, если я нажму вкладку под номером 2, он расширит это число до пути (либо относительного, либо абсолютного, либо в порядке). У меня это почти работает с использованием полной встроенной функции, за исключением того, что она будет добавлять только текст, так что это будет что-то вроде вверх 2/Volumes/Dev/

Можно ли заменить готовый символ?

Заранее спасибо :)

Обновление:

Так что большое спасибо chepner, потому что проверка моего кода выявила мою ошибку. Я сравнивал с неправильным var, и код отладки, который у меня был, приводил к тому, что значение не заменялось.

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

# Move up N levels of the directory tree
# Or by typing in some dir in the PWD
# eg. Assuming your PWD is "/Volumes/Users/natecavanaugh/Documents/stuff"
#     `up 2` moves up 2 directories to "/Volumes/Users/natecavanaugh"
#     `up 2/` and pressing tab will autocomplete the dirs in "/Volumes/Users/natecavanaugh"
#     `up Users` navigate to "/Volumes/Users"
#     `up us` and pressing tab will autocomplete to "/Volumes/Users"
function up {
    dir="../"
    if [ -n "$1" ]; then
        if [[ $1 =~ ^[0-9]+$ ]]; then
            strpath=$( printf "%${1}s" );
            dir=" ${strpath// /$dir}"
        else
            dir=${PWD%/$1/*}/$1
        fi
    fi

    cd $dir
}

function _get_up {
    local cur
    local dir
    local results
    COMPREPLY=()
    #Variable to hold the current word
    cur="${COMP_WORDS[COMP_CWORD]}"

    local lower_cur=`echo ${cur##*/} | tr [:upper:] [:lower:]`

    # Is the arg a number or number followed by a slash
    if [[ $cur =~ ^[0-9]+/? ]]; then
        dir="../"
        strpath=$( printf "%${cur%%/*}s" );
        dir=" ${strpath// /$dir}"

        # Is the arg just a number?
        if [[ $cur =~ ^[0-9]+$ ]]; then
            COMPREPLY=($(compgen -W "${dir}"))
        else
            if [[ $cur =~ /.*$ ]]; then
                cur="${cur##*/}"
            fi

            results=$(for t in `cd $dir && ls -d */`; do if [[ `echo $t | tr [:upper:] [:lower:]` == "$lower_cur"* ]]; then echo "${t}"; fi done)

            COMPREPLY=($(compgen -P "$dir" -W "${results}"))
        fi
    else
        # Is the arg a word that we can look for in the PWD
        results=$(for t in `echo $PWD | tr "/" "\n"`; do if [[ `echo $t | tr [:upper:] [:lower:]` == "$lower_cur"* ]]; then echo "${t}"; fi; done)

        COMPREPLY=($(compgen -W "${results}"))
    fi  
}

#Assign the auto-completion function _get for our command get.
complete -F _get_up up
7
задан Nate Cavanaugh 11 May 2012 в 17:05
поделиться