부분 인수를 완성하고 더 많은 힌트를 제공하기 위해 bash 명령줄 완성을 얻으려면 어떻게 해야 합니까?

부분 인수를 완성하고 더 많은 힌트를 제공하기 위해 bash 명령줄 완성을 얻으려면 어떻게 해야 합니까?

foo:bar foo:foo bar:bar 또는 bar:foo 인수를 취하는 'command' 명령이 있다고 상상해 보십시오. 다음과 같은 완성 기능을 제공하기 위해 내 환경에 소스로 제공할 수 있는 명령줄 완성 스크립트를 작성할 수 있습니다.

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'

그러나 입력하면 command f[tab][tab]foo:bar 및 foo:foo가 나열되지만 둘 다 명령줄에 완료되지 않습니다(아직 구별되지 않기 때문입니다. 제가 달성하고 싶은 것은 이것이 command foo:커서를 생성하고 끝에 남겨두는 것입니다). (공백을 추가하는 대신) 현재 단어를 입력하거나 b다시 f탭하여 명령을 완료할 수 있습니다. 예제 문제는 단지 제가 의미하는 바를 보여주기 위한 것입니다... 실제 사례에서는 접두사:접미사 조합이 꽤 깁니다. , 따라서 부분 완성은 정말 유익할 것입니다. 예를 들어 모두 접두사로 시작하는 25개의 서로 다른 명령인 Translationupdateprocess: 그리고 Translationupdateprocess는 그만큼 많은 옵션이 있는 똑같이 긴 25개의 서로 다른 접두사 중 하나입니다.

bash를 이런 식으로 작동하도록 완료하는 방법을 아는 사람이 있습니까?

답변1

다음 코드를 사용할 수 있습니다( foo:baz foo:qux bar:eat bar:egg명확하게 하기 위해 옵션을 다음으로 대체했습니다).

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'

입력하면 commandtab첫 번째 수준 목록이 표시되고 foo: bar:, 입력하면 ftabtab두 번째 수준에 대한 완성 목록이 표시됩니다 baz qux. 그런 다음 입력하여 qtab전체 명령줄을 얻을 수 있습니다 command foo:qux.

도움이 되길 바랍니다.

관련 정보