3

Представьте, что у меня есть команда 'command', которая принимает аргументы foo:bar foo:foo bar:bar или bar:foo Я могу написать скрипт завершения командной строки, который я могу использовать в своей среде, чтобы получить завершение, которое выглядит следующим образом:

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 ответ1

0

Вы можете использовать следующий код (я заменил ваши параметры на 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'

Когда вы набираете command [tab] вы можете получить список первого уровня foo: bar: и когда вы набираете f[tab][tab] вы получаете список завершения для второго уровня baz qux . Затем вы можете набрать q[tab] чтобы получить полную команду командной строки command foo:qux .

Надеюсь, поможет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .