A conclusão da tabulação não funciona para argumentos quando o comando é um alias

5

Eu tenho um alias, ee, definido para o meu editor favorito, mg. Quando eu faço algo como

mg fo

e, em seguida, pressione a guia, se houver um arquivo foo, obtenho a conclusão da tabulação para:

mg foo

Na maioria dos sistemas que uso (por exemplo, todas as versões do Ubuntu há muitos anos e algumas instalações do Debian),

ee fo

também é concluído corretamente em

ee foo

Mas em um sistema que eu uso, que tem Debian 6.0 e GNU bash 4.1.5 (1) -release, a conclusão da tabulação falha para a versão com o alias. Note que isto não é um problema em completar o próprio alias - é um problema em completar os argumentos do comando aliased. Existe uma maneira de corrigir esse comportamento no sistema Debian? Atualize para o bash 4.2.x? Mexer com arquivos de configuração?

    
por Ben Crowell 15.05.2013 / 18:05

2 respostas

2

Editar: OK. Parece que eu poderia ter interpretado mal a situação. Pensei que você queria dizer as opções do programa como em:

$ mplayer_alias -pla<tab><tab>
-playing-msg  -playlist
$

mas acho que é a conclusão do arquivo. Eu não sei, mas tente.

Como solução rápida, isso deve funcionar:

complete -f -o default ee

Dando:

$ ee<tab><tab>
file1 file2 file3
$

a partir de Builtins de Conclusão Programável . Por exemplo. o -X pattern pode ser útil. Por exemplo. para excluir .swp e .swo arquivos:

complete -f -X '*.sw[op]' ee

mostre apenas .zip , .ZIP :

complete -f -o default -X '!*.+(zip|ZIP)' my_unzip_alias

alguns podem precisar que você adicione shopt -s extglob no arquivo de configuração.

Resposta antiga:

Você poderia experimentar algo assim em seu .bash_completion .

Pelo menos como um iniciante.

A ideia principal é simplesmente adicionar complete para o alias usando o existente script completo para o programa real . Aqui eu suponho que eles estão todos no formato:

complete -F _complete_function_from_original program_name

Você pode obter o que é executando: complete -p program_name . Melhor verificar primeiro.

Para alguns métodos, como apt-get , é possível usar somente alias + load:

_load_comp_hack apt-get myalias

Para outras pessoas, como mplayer , é necessário um wrapper de função, como, por exemplo:

myalias() { mplayer "$@"; }
                      |
                      +--- Could be messy

É bem possível que haja uma maneira melhor de resolver isso, mas funcionou bem para o meu uso. Eu principalmente usá-lo para scripts wrapper onde eu estendo a funcionalidade do programa original. Não o usei em aliases.

Eu não me sinto seguro neste hack, mas você pode ver se funciona.

_load_comp_hack()
{
    local cc=
    # Make sure completion scripts are sourced.
    # Report error if source fail.
    if . "/usr/share/bash-completion/completions/$1" >/dev/null 2>&1; then
        # Extract the completion function used by the "real" program.
        if cc="$(complete -p "$1" | cut -d' ' -f3)"; then
            # Add it to the alias
            complete -F "$cc" "$2"
            return 0
        fi
    fi
    echo "bash-completion '$1' for '$2' not found."
}

_load_comp_hack mplayer mplad
_load_comp_hack apt-get z
                |       |
                |       +----- Alias, script or function
                +------------- Real function

Alguns programas usam uma conclusão mais geral, como _longopt , pela qual o o arquivo de origem não será localizado. Normalmente, não é necessário variante mais simples poderia ser:

_load_comp_hack()
{
    local cc=
    if cc=$(complete -p "$1" | cut -d' ' -f3); then
            complete -F "$cc" "$2"
    fi
}

Um problema aqui, o IIRC, é que alguns scripts de conclusão não são carregados até a primeira execução, como no primeiro:
prog aba aba . Como alternativa, talvez inclua-o como else se o fornecimento do arquivo falhar.

    
por 16.05.2013 / 15:21
0

Seu problema é: o bash-completion não entende aliases. Portanto, se você escrever um alias, ele será visto simplesmente como um comando desconhecido e não será preenchido automaticamente. Você pode alternar para a conclusão do nome do arquivo padrão, se é isso que você deseja. Ou, você pode instalar um um programa que expande os aliases antes do preenchimento automático e conclui seus aliases como comandos com alias.

    
por 14.08.2018 / 03:01