オートコンプリート機能付きのスクリプトを作成するにはどうすればいいですか?

オートコンプリート機能付きのスクリプトを作成するにはどうすればいいですか?

のようなプログラムを使用する場合svn、Gnome ターミナルに次のように入力します。

svn upd

クリックするとTab次のように自動補完されます:

svn update

カスタム bash スクリプトでそのようなことを行うことは可能ですか?

答え1

新しいファイルを作成する必要があります:

/etc/bash_completion.d/foo

静的な自動補完(たとえば--help/ )の場合は、以下を追加します。--verbose

_foo() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help --verbose --version"

    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _foo foo
  • COMP_WORDS現在のコマンド ライン内のすべての単語を含む配列です。
  • COMP_CWORD現在のカーソル位置を含む単語のインデックスです。
  • COMPREPLY Bash が可能な補完候補を読み取る配列変数です。

このコマンドは、現在の単語 に一致する、、compgenの要素の配列を返します。--help--verbose--version"${cur}"

compgen -W "--help --verbose --version" -- "<userinput>"

ソース

答え2

完全なチュートリアルはこちらです。

admin.shオートコンプリートを機能させたいスクリプトの例を見てみましょう。

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_2
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

オプションに注意してくださいshortlist。このオプションを使用してスクリプトを呼び出すと、このスクリプトで可能なすべてのオプションが出力されます。

ここにオートコンプリート スクリプトがあります:

_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

最後の引数 complete は、自動補完を追加するスクリプトの名前であることに注意してください。必要なのは、次のように自動補完スクリプトを bashrc に追加することだけです。

source /path/to/your/autocomplete.sh

または、次の場所にコピーします:

/etc/bash_completion.d

答え3

あなたはプログラム可能な完了いくつかの例については/etc/bash_completionとをご覧ください。/etc/bash_completion.d/*

答え4

単純な単語ベースの自動補完だけが必要な場合(つまり、サブコマンドの補完などは不要)、コマンドには適切な処理を実行するオプションcompleteがあります。-W

たとえば、次のような行を.bashrcプログラムに自動補完するために使用しています。ジュピター:

# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'

今ではjupyter <TAB> <TAB>自動補完されるようになりました。

ドキュメントgnu.org のが役に立ちます。

変数が正しく設定されていることに依存しているようですIFSが、私にとっては問題は発生していません。

ファイル名補完とデフォルトの BASH 補完を追加するには、次の-oオプションを使用します。

complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'

completeこれを zsh で使用するには、コマンドを実行する前に次のコードを追加します~/.zshrc

# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
    autoload bashcompinit
    bashcompinit
fi

関連情報