4

迅速なツール (コンパイラとパッケージ マネージャー) 用の zsh 完了スクリプトを作成しています。このコマンドは、サブコマンドを指定してもしなくても使用できます。例えば

# calls to the compiler
# usage: swift [options] <inputs>
1>  swift my_file.swift
2>  swift -a 1 -b 2 my_file.swift

# calls to build subcommand
3>  swift build
4>  swift build -c 1

# calls to test subcommand
5>  swift test
6>  swift test -d 4

これまでのところ、次の完了スクリプトがあります。ほとんどの場合は機能しますが、裸の呼び出しの場合、オートコンプリートはうまく機能しません。_compiler メソッドに入りますが、 の後に正しくオートコンプリートしませんswift -a。を忘れたかのようにオートコンプリートし-aます。したがってswift -a <TAB><TAB>、1-2-3 を選択するためのメニューが表示されます。代わりに、ファイルのリストが表示されます。swift -a -a <TAB><TAB>正しい補完が表示されますが、繰り返しは-a無効です。

おそらく変更された状態と関係がありますが、この特定のユースケースでは関係ありません。ただし、サブコマンド (build & test) については、それぞれの完了が正しく機能するように状態を変更する必要があります。

私はドキュメントを調べましたが、非常に不可解です。他のさまざまな補完スクリプトを確認しましたが、欠落しているリンクがわかりませんでした。では、個別のフラグ セットを持つ (およびサブサブコマンド自体を持つ) オプションのサブコマンドを持つコマンドの補完を指定するにはどうすればよいでしょうか?

#compdef swift
local context state state_descr line
typeset -A opt_args

_swift() {
    _arguments -C \
        ': :->command' \
        '*:: :->arg'

    case $state in
        (command)
            local tools
            tools=(
                'build:description for build'
                'test:description for test'
            )
            _alternative \
                'tools:common:{_describe "tool" tools }' \
                'compiler: :_compiler'
            ;;
        (arg)
            case ${words[1]} in
                (build)
                    _build
                    ;;
                (test)
                    _test
                    ;;
                (*)
                    _compiler
                    ;;
            esac
            ;;
    esac
}

_compiler() {
    _arguments -C \
        '(-a)-a[description for a]: :(1 2 3)' \
        '(-b)-b[description for b]: :(4 5 6)' \
        '*: :_files'
}

_build() {
    _arguments -C \
        '-c[description for c]: :(1 2 3)'    
}

_test() {
    _arguments -C \
        '-d[description for d]: :(4 5 6)'    
}
4

1 に答える 1

0

_regex_wordsと を使用してそれを行うことができます_regex_arguments

local -a abopts buildopts testopts cmds aargs bargs cargs dargs
local matchany=/$'[^\0]##\0'/
aargs=(/$'(1|2|3)\0'/ ':number:number:(1 2 3)')
bargs=(/$'(4|5|6)\0'/ ':number:number:(4 5 6)')
cargs=(/$'(1|2|3)\0'/ ':number:number:(1 2 3)')
dargs=(/$'(4|5|6)\0'/ ':number:number:(4 5 6)')
_regex_words opt 'options' '-a:description for a:$aargs' '-b:description for b:$bargs'
abopts=("${reply[@]}")
_regex_words opt 'options' '-c:description for c:$cargs'
buildopts=("${reply[@]}")
_regex_words opt 'options' '-d:description for d:$dargs'
testopts=("${reply[@]}")
_regex_words cmd 'commands' 'build:build command:$buildopts' 'test:test command:$testopts'
cmds=("${reply[@]}")

_regex_arguments _swift "$matchany" \( "${cmds[@]}" \| "${abopts[@]}" "$matchany" ":file:file:{_files}" \)
_swift "$@"

これらの関数の使用方法については、http: //zsh.sourceforge.net/Doc/Release/Completion-System.html#Completion-Functions またはここで読むことができます: https://github.com/vapniks/zsh-completions /blob/master/zsh-completions-howto.org

于 2016-10-04T17:05:02.843 に答える