4

I have a shell script it's usage is:

foo.sh <name> <type> <*.tar.gz>

I want to setup a complete on 3rd parameter only. If I press on 1st parameter, just show the usage.

Could I use zsh's zshcomp to do this job?

for example:

foo.sh <tab>  # display usage
foo.sh a b <tab> # show files match with *.tar.gz

Is there similar script which I could follow?

4

1 に答える 1

6

読むべきもの。

これは、 Z-Shell Completion Systemについて説明しているブログ投稿です。

もう少し詳細な議論については、この unix.stackexchange の回答をお読みください。

そして、いつものようにマニュアルページを読んでください! .

編集:追加するのを忘れました:使用echo $fpathする関数パスが表示されますzsh。OSX では/usr/local/share/zsh/4.3.17/functions、(場所はユーザーによって異なる場合があります) があり、すべての ZSH 補完関数が含まれています。_ssh、など_lsを見_tarてください - それらはすべてそこにあり、学習できる便利な機能がたくさんあります。


質問への対処: あなたが進むべき方向。

しかし、あなたが求めていることは達成可能です。いくつかのステップがあります。

  1. z-shell 補完関数を作成する必要があります。に配置する必要がありfpathます。zsh補完システム関数を使用する関数パス。(小さな関数の場合は、入れて~/.zshrcも機能しますが、お勧めしません)。

  2. 3 番目のパラメーターで完了が必要です。これを行うには、関数は次のようになります。

    _arguments "3:<MENU>:<COMPLETION>"
    

    <MENU>メニューの説明です。メニューの説明を有効にしている場合に表示されます。(これは を使用して行われzstyleます。詳細については、マニュアル ページまたはリンクされたページを参照してください)。 <COMPLETION>で完了することができます。たとえば、次を使用した場合:

    _arguments "3::(Foo Bar)"
    

    スクリプトを実行して を押す<TAB>と、 または のいずれかを選択できFooますBar。[注:<MENU>その例にはありません。メニュー記述子が必要ない場合は、次のように省略できます]。

  3. *.tarファイルの補完が必要です。あなたはそれを行うために呼び出すことができます_files:

    _files -g \*.tar
    
  4. 最初のパラメーターの使用法を表示します。これは、引数なし (つまり、引数 1) の補完になります。最初の 2 つのオプション (典型的な使用方法の説明) ではなく、3 番目のオプションのみを補完する必要がある理由がわかりません。そのため、これに答える方法がわかりません。スクリプトが次のように使用されることになっている場合: 、引数と引数もscript foo bar FILE.tar完成させたくないですか? おそらく、より良い解決策は、スクリプトがパラメーターなしで実行されたときに使用法を表示することです。foobar

完全なスクリプトは次のようになります。


#compdef myscript

_arguments "3:tar files:_files -g \*.tar"
于 2012-08-21T15:04:31.253 に答える