2

コマンドラインフラグと適切なフラグ値を提案するbash完了ルーチンを構築しようとしています。たとえば、以下のfstcomposeコマンドでは、競合ルーチンが最初にcompose_filter =フラグを提案し、次に[alt_sequence、auto、match、sequence]から可能な値を提案するようにします。

fstcompose --compose_filter=

値のセットが関連付けられていないフラグの場合、競合他社がパスまたはファイルを提案するデフォルトモードにフォールバックするようにします。

私が直面している問題の1つは、=等号が個別のトークンとして扱われ、前のCOMP_WORDとして設定されていることです。前の=文字の前にフラグ全体を検出する手法はありますか?または、列挙可能な値を使用してこのタイプのフラグの補完を実装するためのより良い方法はありますか?以下は、私が使用している完了ルーチンのサンプルです。

_fstcompose()
{
  local cur prev opts filters pprev
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  prev="${COMP_WORDS[COMP_CWORD-1]}"
  opts="--compose_filter= --connect"
  filters="alt_sequence auto match sequence"

  if [[ ${cur} == -* ]] ; then
  COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
  return 0
  fi

  if [[ ${prev} == "--compose_filter=" ]] ; then
  COMPREPLY=($(compgen -W "${filters}" -- ${cur}))
  return 0
  fi
  _filedir
}
complete -o nospace -F _fstcompose fstcompose
4

2 に答える 2

3

あなたの最初のものは、2番目のものの評価return 0を妨げます。最も具体的なものから最も具体的でないものへと順序付けられifたステートメントを使用してみてください。または、少なくともステートメントをそのように順序付けしてください。caseif

には「=」が含まれているため$COMP_WORDBREAKS${prev}「=」を除いた「--compose_filter」です。

から "=" を削除しても、 は$COMP_WORDBREAKSではなく. その値を保存および復元せずにそうすると、他の補完が壊れます。--compose_filter${cur}${prev}

他にどんな問題があるのか​​ わかりません。

echoデバッグを支援するために、別の端末にリダイレクトされるステートメントを関数に追加できます。例えば:

echo "cur: $cur, prev: $prev" > /dev/pts/2
于 2011-02-18T14:44:13.090 に答える
0

これは私が思う何人かの人々を助けるでしょう。以下のコードは機能するはずです(オンザフライで作成)

have fstcompose &&{
    function elementExists(){
        local i isRunning result
        i=0
        isRunning=1
        result=0
        #~ for i in ${opts_with_equal[@]}; do
        while [ "$isRunning" -eq 1 ]; do
            if [ "$i" -ge "${#opts_with_equal[@]}" ]; then
                isRunning=0
            elif [ "${opts_with_equal[$i]}" == "$1" ]; then
                result=1
                isRunning=0
            fi
            ((i++))
        done
        echo $result
    }
    function _fstcompose(){
        local prev cur opts opts_with_equal isEqualOptions
        COMPREPLY=()
        _get_comp_words_by_ref -n : cur prev
        opts="--compose_filter --connect"
        opts_with_equal=(--compose_filter)

        case ${cur} in
            '--compose_filter'*)
                prev="${cur%%=*}="
                cur=${cur#*=}
                COMPREPLY=( ${prev}$(compgen -W "alt_sequence auto match sequence" -- "${cur}") )
                return 0
                ;;
        esac

        if [[ "${cur}" != -* ]]; then
            _filedir
        else
            isEqualOptions=$(elementExists "${cur}")
            if [ "${isEqualOptions:-0}" -eq 1 ]; then
                COMPREPLY=( $(compgen -W "${opts}" -S '=' -- "${cur}") )
            else
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            fi
        fi

    }
    complete -o nospace -F _fstcompose fstcompose
}
# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh

注: opts_with_equal は、この例では配列であり、1 つのパラメーターのみが含まれています。「=」を使用する各パラメータに入れます

于 2012-01-20T22:54:17.020 に答える