Como gerar conclusões de string para stdout?

15

Alguns dos gitcomandos têm muitas opções, e muitas vezes seria útil procurá-los pelo que eu precisava - eu estava apenas procurando a opção que controla a TABlargura git-gui, mas existem cerca de 200 conclusões git config. Uma solução óbvia é copiar todas as conclusões em um editor e pesquisá-las, mas prefiro fazer

[something] | grep tab

Não existam manou infopáginas para compgen, help compgennem sequer explicar suas próprias opções, e não há auto-completar para compgen(Como é que para a ironia?).

PS: compgen -Anão funciona.

PPS: Esta não é uma pergunta sobre git-gui- A solução para a questão da largura da guia estava em outro lugar.

PPPS: não se trata de comandos de preenchimento automático, apenas de parâmetros de comando .

l0b0
fonte
Isso é muito semelhante a Como canalizar a saída de "tab complete"? , Mas a resposta aceita havia especificamente para comandos completar, não argumentos
Michael Mrozek

Respostas:

10

Você pode usar a seguinte função, que usa da mesma maneira que sudoa conclusão automática gera a lista de conclusão:

comp() {
    local COMP_LINE="$*"
    local COMP_WORDS=("$@")
    local COMP_CWORD=${#COMP_WORDS[@]}
    ((COMP_CWORD--))
    local COMP_POINT=${#COMP_LINE}
    local COMP_WORDBREAKS='"'"'><=;|&(:"
    # Don't really thing any real autocompletion script will rely on
    # the following 2 vars, but on principle they could ~~~  LOL.
    local COMP_TYPE=9
    local COMP_KEY=9
    _command_offset 0
    echo ${COMPREPLY[@]}
}
comp git config ''

onde _command_offseté definido na conclusão do bash (pacote).

NOTA: a função precisa ser executada em um shell interativo (ou seja, se estiver em um arquivo, o arquivo precisa ser originado em vez de apenas ser executado.) Ou as regras / funções de conclusão necessárias não serão definidas.

PS. compgen -Afunciona apenas para ações internas, o que você deveria ter tentado (mas também não funciona) é compgen -F(ou realmente compgen -o bashdefault -o default -o nospace -F _git). A razão pela qual isso não funciona (e o documento para comandos internos do bash, incluindo compgen / complete), pode ser encontrado no bash (1) .

yuyichao
fonte
Esperamos que @ l0b0 funcione em todos os casos.
217128 Yuyichao # 737
Excelente, funciona! Fiz alguns ajustes menores e agora está no meu .bash_aliases para sempre. Você pode podar para que apenas a solução fique, mas não há dúvida de que você recebe a recompensa. Retirei meus comentários da discussão, pois eles não são mais relevantes.
L0b0
1
Descobri que usar isso no shell interativo pode destruir a conclusão de guias já em vigor. Tornar cada uma das variáveis ​​locais para a função resolve esse problema. (por exemplo local COMP_LINE="$*")
AL Flanagan
@ALFlanagan Good point. Atualizada.
yuyichao