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

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

Imagine que eu tenho um comando 'command' que recebe argumentos foo:bar foo:foo bar:bar ou bar:foo. Posso escrever um script de conclusão de linha de comando que posso fornecer em meu ambiente para me fornecer uma conclusão semelhante a esta:

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 listados, mas nenhum deles é concluído na minha linha de comando (porque eles ainda não são distintos. O que eu gostaria de realizar é que isso produza command foo:e deixe meu cursor no final de a palavra atual (em vez de adicionar um espaço) para permitir que eu digite bou fe tab novamente para finalizar o comando O problema do exemplo é apenas para mostrar o que quero dizer ... no caso real, as combinações de prefixo: sufixo são bastante longas. , portanto, a conclusão parcial seria realmente benéfica, por exemplo, 25 comandos diferentes que começam com o prefixo translationupdateprocess: e translationupdateprocess é um dos 25 prefixos diferentes igualmente longos com tantas opções.

Alguém sabe uma maneira de completar o bash para operar dessa maneira?

Responder1

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

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'

Ao digitar, commandtabvocê pode obter a lista do primeiro nível foo: bar:e, ao digitar, ftabtabobtém a lista de conclusão do segundo nível baz qux. Em seguida, você pode digitar qtabpara obter a linha de comando completa command foo:qux.

Espero que ajude.

informação relacionada