LINUX.ORG.RU

autocomplete аргументов скрипта

 ,


0

2

есть вот такой список аргументов. Хочется, чтобы было так:

./some dev<TAB>
./some dev-
build stage

Чтобы можно было запускать

./some.sh dev<TAB>b --> ./some dev_build
actions="build-dev \
    build-stage \
    stop \
    stop-all \
    destroy \
    destroy-all \
    collectstatic \
    compilemessages \
    makemigrations \
    migrate \
    runserver \
    manage \
    db-connect \
    uni-test"
★★★★

Последнее исправление: bryak (всего исправлений: 6)

Обгуглился уже. Типа такого не получается

_customcomplete() {
    local CMD_NAME=`readlink -f "$1"`
    local word="${COMP_WORDS[COMP_CWORD]}"

    if [[ $CMD_NAME == './some.sh' ]] ; then
        COMPREPLY=( $(compgen -W "one two three" -- "$word") )
    fi
} &&

complete -F _customcomplete some.sh
bryak ★★★★
() автор топика
actions="build-dev \
    build-stage \
    stop \
    stop-all \
    destroy \
    destroy-all \
    collectstatic \
    compilemessages \
    makemigrations \
    migrate \
    runserver \
    manage \
    db-connect \
    uni-test"

complete -W "${actions}" projectctl

Работает, но только тогда, когда это ввести непосредственно в bash, а если вставить это в скрипт, - то не работает

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
┌─[user@debian-home]─[]─[~]
└──╼ cat ./dothis-completion.bash
#/usr/bin/env bash
complete -W "now tomorrow never" dothis
┌─[user@debian-home]─[]─[~]
└──╼ source ./dothis-completion.bash
┌─[user@debian-home]─[]─[~]
└──╼ dothis
never     now       tomorrow

Ага, так работает. Но если это записать в ./projectctl т.е

┌[x]─[user@debian-home]─[]─[~]
└──╼ cat ./projectctl
#/usr/bin/env bash

source ./dothis-completion.bash

То это как бы не работает)))

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 2)

Думал при запуске projectctl(bash script) выполнять запись в

┌─[user@debian-home]─[]─[~]
└──╼ cat /etc/bash_completion.d/projectctl_competition
#/usr/bin/env bash
_dothis_completions()
{
  COMPREPLY+=("now")
  COMPREPLY+=("tomorrow")
  COMPREPLY+=("never888")
}

complete -F _dothis_completions projectctl

и потом выполнять типа bash -c «source /etc/bash_completion» внутри projectctl, но при изменении содержимого /etc/bash_completion.d/projectctl_competition и повторном запуске ./projectctl - автодополнение не меняется(т.е остается статичным. Но если в самом баше ввести source /etc/bash_completion, то изменения происходят

bryak ★★★★
() автор топика

На ум приходит только

alias projectctl='source /etc/bash_completion;./projectctl'

А внутри projectctl писать в /etc/bash_competition.d/some что-то

bryak ★★★★
() автор топика
Ответ на: комментарий от kardapoltsev

у каждого проекта свои actions, поэтому нельзя так сделать

bryak ★★★★
() автор топика
┌─[user@debian-home]─[]─[~]
└──╼ cat ~/.bash_completion
for bcfile in ~/.bash_completion.d/* ; do
    [ -f "$bcfile" ] && . $bcfile
done
mkdir -p ~/.bash_completion.d
bash -c "echo > ~/.bash_completion.d/projectctl"
sudo tee -a ~/.bash_completion.d/projectctl &>/dev/null << END
#/usr/bin/env bash
complete -W "${actions}" projectctl
END
alias projectctl='source ${HOME}/.bash_completion;./projectctl'

Работает. Но мне как-то не по себе от этого способа. Мне кажется, что он через клоаку

bryak ★★★★
() автор топика
Ответ на: комментарий от bryak

Или вот так, без алиаса

remo-projectctl() {
    ./projectctl $@
    source ${HOME}/.bash_completion
}
bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.