É possível forçar as sugestões de conclusão da guia bash a serem listadas em uma única coluna?

6

Quando estou digitando um nome de arquivo e pressionando duas vezes Tab, uma listagem de diretório ocorre para sugerir todas as opções para a conclusão da tabulação. Por padrão, ele lista no mesmo formato que ls , no entanto, eu preferiria listar as opções mais em linha com ls -l . Isso é possível?

Também estou interessado em ver se há alguma personalização adicional que possa ser feita nesse caminho, embora eu não tenha certeza do que gostaria, apenas alguns exemplos de ideias seriam legais também.

    
por DanH 20.04.2012 / 07:49

1 resposta

5

Simplesmente não.

Razão:

  1. Não há opção em "set" ou "shopt" para especificar o formato de saída das sugestões de conclusão de guias. A única exceção é o ambiente COLUMNS , no entanto, você não pode alterá-lo para um valor diferente.

  2. Para finalizações personalizadas (como --opção de ação), você pode substituir a função de conclusão com saída para stdout / stderr, para exibir algo como ls -l juntamente com as sugestões de conclusão. No entanto, a conclusão do nome do arquivo é codificada, você não pode sobrescrevê-lo pelo complete integrado.

Aqui está um pequeno exemplo sujo para exibir informações detalhadas junto com sugestões de conclusão de guias. Imagine que você tem um programa foo e aceita quatro opções bar , barr , barrr , car , a função de conclusão suja seria:

function _foo() {
    local cmds=(bar barr barrr car)
    local cur n s
    if [ $COMP_CWORD = 1 ]; then
        cur="${COMP_WORDS[1]}"
        n="${#cur}"

        # -- dirty hack begin --
        echo
        cat <<EOT | while read s; do [ "${s:0:n}" = "$cur" ] && echo "$s"; done
bar:      choose this option if you feel well
barr:     choose this option if you feel hungry
barrr:    choose this option if you are starving
car:      choose this option if you want a car
EOT
        # ++ dirty hack end ++

        COMPREPLY=($(compgen -W "${cmds[*]}" "$cur"))
    fi
} && complete -F _foo foo

Agora você pode ver um pequeno helpdoc antes das sugestões:

$ foo ba<tab>
bar:      choose this option if you feel well
barr:     choose this option if you feel hungry
barrr:    choose this option if you are starving
r

(O caractere único 'r' na última linha é preenchido automaticamente com o prefixo ba .)

E, quando o prefixo é ambíguo, a função de conclusão é avaliada duas vezes, a lista de sugestões chega no final:

$ foo bar<tab><tab>
bar:      choose this option if you feel well
barr:     choose this option if you feel hungry
barrr:    choose this option if you are starving

bar:      choose this option if you feel well
barr:     choose this option if you feel hungry
barrr:    choose this option if you are starving

bar    barr   barrr
    
por 19.07.2012 / 17:02