Wie kann ich die Bash-Befehlszeilenvervollständigung dazu bringen, ein Teilargument zu vervollständigen und dann weitere Hinweise bereitzustellen?

Wie kann ich die Bash-Befehlszeilenvervollständigung dazu bringen, ein Teilargument zu vervollständigen und dann weitere Hinweise bereitzustellen?

Stellen Sie sich vor, ich habe einen Befehl „command“, der die Argumente foo:bar foo:foo bar:bar oder bar:foo annimmt. Ich kann ein Befehlszeilenvervollständigungsskript schreiben, das ich in meine Umgebung einbinden kann, um eine Vervollständigung zu erhalten, die wie folgt aussieht:

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'

Wenn ich jedoch command f[tab][tab]„foo:bar“ und „foo:foo“ eintippe, werden mir zwar „foo:bar“ und „foo:foo“ aufgelistet, aber keines von beiden wird in meiner Befehlszeile vervollständigt (weil sie noch nicht eindeutig sind). Ich möchte erreichen, dass command foo:mein Cursor am Ende des aktuellen Wortes steht (anstatt ein Leerzeichen hinzuzufügen), damit ich dann „ boder“ eingeben fund dann erneut die Tabulatortaste drücken kann, um den Befehl zu beenden. Das Beispielproblem soll nur zeigen, was ich meine … im echten Fall sind die Präfix:Suffix-Kombinationen ziemlich lang, sodass eine teilweise Vervollständigung wirklich nützlich wäre. Z. B. 25 verschiedene Befehle, die alle mit dem Präfix „translationupdateprocess:“ beginnen, und „translationupdateprocess“ ist eines von 25 verschiedenen, gleich langen Präfixen mit so vielen Optionen.

Kennt jemand eine Möglichkeit, Bash auf diese Weise zum Laufen zu bringen?

Antwort1

Sie können den folgenden Code verwenden ( foo:baz foo:qux bar:eat bar:eggzur Verdeutlichung habe ich Ihre Optionen durch ersetzt):

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'

Wenn Sie eingeben, commandtaberhalten Sie die Liste der ersten Ebene foo: bar:und wenn Sie eingeben, ftabtaberhalten Sie die Vervollständigungsliste für die zweite Ebene baz qux. Anschließend können Sie eingeben, qtabum die vollständige Befehlszeile zu erhalten command foo:qux.

Ich hoffe es hilft.

verwandte Informationen