Autocomplete específico de script no shell

3

Eu crio um monte de pequenos roteiros para me ajudar na minha vida diária. Eu gostaria de fornecer auto-completar para eles, especialmente que pretendo compartilhá-los com as pessoas.

Agora, sei que posso criar funções de preenchimento automático originadas no login, mas, por motivos de elegância e portabilidade, procuro fornecer o preenchimento automático dentro do próprio script.

Como eu uso o zsh em casa e o bash no meu VPS, gostaria que o script fosse portável (ou alternasse os comportamentos de acordo com o shell), mas eu ficaria satisfeito com uma solução já existente, para qualquer ambiente.

    
por Xananax 24.12.2012 / 03:35

1 resposta

1

[F]or the sake of elegance and portability, I seek to provide the autocomplete inside the script itself.

Você não pode fazer isso dentro do script de shell.

Tradicionalmente, a conclusão de bash para scripts e binários é tratada por entradas em diretórios designados (por exemplo, /etc/bash_completion.d e /usr/share/bash-completion/completions para Bash).

No entanto, tudo isso é chamado de comando interno complete com parâmetros apropriados. Ao chamar seu script pela primeira vez, você pode simplesmente criar uma entrada em um desses diretórios (requer privilégios de root) ou em ~/.bashrc .

A sintaxe básica é a seguinte:

# declare function to pass to 'complete'
_myscript() 
{
    # declare variable 'cur' (holds string to complete) as local
    local cur

    # initialize completion (abort on fail)
    _init_completion || return

    # if string to complete ('cur') begins with '-' (option)
    if [[ "$cur" == -* ]] ; then
        # complete to the following strings, if they start with 'cur'
        COMPREPLY=( $( compgen -W '-a -b -c --foo --bar' -- "$cur" ) )
    else
        # otherwise, complete to elements in current directory that begin with 'cur'
        _filedir -d
    fi

# if declaring the function was successful, use it when the command is 'myscript'
} && complete -F _myscript myscript

Por exemplo, você pode salvar o acima em ~/.myscript_completion e anexar

source ~/.myscript_completion

para ~/.bashrc .

    
por 24.12.2012 / 04:33