Como posso obter a conclusão da linha de comando do bash para concluir um argumento parcial e, em seguida, fornecer mais dicas

3

Imagine que eu tenho um comando 'command' que aceita argumentos foo: bar foo: foo bar: bar ou bar: foo Eu posso escrever um script de conclusão de linha de comando que eu possa inserir em meu ambiente para me dar uma conclusão parecida com a seguinte:

function _command_opt()
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="foo:bar foo:foo bar:bar bar:foo"
    if [[ ${prev: -7} == 'command' ]]
    then
        COMPREPLY=( $(compgen -W "${opts}"  -- ${cur}) );
        return 0;
    fi
}
complete -F _command_opt -o bashdefault -o default 'command'

No entanto, se eu digitar command f[tab][tab] , recebo foo: bar e foo: foo listado, mas nenhum deles é concluído na linha de comando (porque eles ainda não são distintos. O que eu gostaria de realizar é que isso produz command foo: e deixa meu cursor no final da palavra atual (em vez de adicionar um espaço) para permitir que eu digite b ou f e, em seguida, aba novamente para concluir o comando. O problema do exemplo é apenas mostrar o que eu Quer dizer ... no caso real, o prefixo: combinações de sufixos são bastante longas, então a conclusão parcial seria realmente benéfica, por exemplo, 25 comandos diferentes que começam com prefixo translationupdateprocess: e translationupdateprocess é um dos 25 prefixoes igualmente longos com tantas opções.

Alguém sabe de uma maneira de obter bash completa para operar dessa maneira?

    
por Robert 08.03.2018 / 21:48

1 resposta

0

Você pode usar o seguinte código (substituí suas opções por foo:baz foo:qux bar:eat bar:egg para esclarecer):

function _command_opt()
{
  local cur cursec command opts
  COMPREPLY=()

  cur="${COMP_WORDS[COMP_CWORD]}"
  cursec='echo ${cur} | awk -F ':' '{print $1}'';

  command="${COMP_WORDS[1]}"
  opts="foo bar"

  case "${command}" in
    foo)
      COMPREPLY=( $(compgen -W "baz qux" -- ${cursec}) ); return 0;;
    bar)
      COMPREPLY=( $(compgen -W "eat egg" -- ${cursec}) ); return 0;;
    *) ;;
  esac

  COMPREPLY=( $(compgen -W "${opts}" -S ":" -- ${cur}) ); compopt -o nospace;
}

complete -F _command_opt -o bashdefault -o default 'command'

Quando você digitar command [tab] , poderá obter a lista de primeiros níveis foo: bar: e, quando digitar f[tab][tab] , obterá a lista de conclusão do segundo nível baz qux . Em seguida, você pode digitar q[tab] para obter a linha de comando completa command foo:qux .

Espero que ajude.

    
por 19.03.2018 / 22:31