2013-05-20 10 views
8

私は、魚に使用するオートコンプリートスクリプトを作成しようとしています。私は同じプログラムのbash補完スクリプトを移植しています。サブコマンドを使用したオートコンプリートスクリプトの作成

プログラムは3つのトップレベルのコマンドを持っているが、foobar、およびbazを言うと、それぞれがちょうどそれぞれのabcを言って、いくつかのサブコマンドがあります。

私は何を見ていることは、トップレベルの自動OK完了コマンドということですので、私はfを入力した場合、私はオートコンプリートにfooを取得していますが、私はそれがサブコマンドがあるのですか見てもう一度タブをヒットした場合、その後、私はfooを見ます、barbazabcと正しい動作しているようですので、それはちょうど私が参考にgit completion scriptを使用していますabc

でなければなりません。私もgit flow scriptを参照として使用しています。

私はこれがでgitの完了スクリプトで処理されると思う:理にかなって

function __fish_git_needs_command 
    set cmd (commandline -opc) 
    if [ (count $cmd) -eq 1 -a $cmd[1] = 'git' ] 
    return 0 
    end 
    return 1 
end 

コマンドへの単一の引数、スクリプト自体がある場合は、あなただけの完了を使用することができます。最上位レベルのコマンドを完了するための条件として(-n)の条件を使用すると、正しいことが起こると思います。

しかし、私が見ていることはそうではありません。その関数をスクリプトにコピーして、 "git"を適切に変更し、運がなかった。

function __fish_prog_using_command 
    set cmd (commandline -opc) 
    set subcommands $argv 
    if [ (count $cmd) = (math (count $subcommands) + 1) ] 
    for i in (seq (count $subcommands)) 
     if not test $subcommands[$i] = $cmd[(math $i + 1)] 
     return 1 
     end 
    end 
    return 0 
    end 
    return 1 
end 

function __fish_git_needs_command 
    set cmd (commandline -opc) 
    set startsWith (echo "$cmd[1]" | grep -E 'prog$') 
    # there's got to be a better way to do this regex, fish newb alert 
    if [ (count $cmd) = 1 ] 
    # wtf, this is always false? it this the problem? 
    if [ $cmd[1] -eq $cmd[1] ] 
     return 1 
    end 
    end 

    return 0 
end 

complete --no-files -c prog -a bar -n "__fish_git_needs_command" 

complete --no-files -c prog -a foo -n "__fish_git_needs_command" 

complete --no-files -c prog -a a -n "__fish_prog_using_command foo" 
complete --no-files -c prog -a b -n "__fish_prog_using_command foo" 
complete --no-files -c prog -a c -n "__fish_prog_using_command foo" 

complete --no-files -c prog -a baz -n "__fish_git_needs_command" 

この作業を行う方法上の任意の提案は非常に高く評価され、次のよう

トリムダウンスクリプトがあります。

答えて

7

return 0は真を意味し、return 1は偽を意味すると思いますか?

出力から、needs_command関数が正常に動作していないように見え、サブコマンドがある場合でもバーが表示されます。

私は、次のコードを試してみました期待どおりに動作します:

function __fish_prog_needs_command 
    set cmd (commandline -opc) 
    if [ (count $cmd) -eq 1 -a $cmd[1] = 'prog' ] 
    return 0 
    end 
    return 1 
end 

function __fish_prog_using_command 
    set cmd (commandline -opc) 
    if [ (count $cmd) -gt 1 ] 
    if [ $argv[1] = $cmd[2] ] 
     return 0 
    end 
    end 
    return 1 
end 

complete -f -c prog -n '__fish_prog_needs_command' -a bar 

complete -f -c prog -n '__fish_prog_needs_command' -a foo 
complete -f -c prog -n '__fish_prog_using_command foo' -a a 
complete -f -c prog -n '__fish_prog_using_command foo' -a b 
complete -f -c prog -n '__fish_prog_using_command foo' -a c 

complete -f -c prog -n '__fish_prog_needs_command' -a baz 

完了から出力:

➤ prog <Tab> 
bar baz foo 
➤ prog foo <Tab> 
a b c 
➤ prog foo 

は何をしたい、このですか?

+0

うん、それはうまくいった、ありがとう。 – Michael

+0

@terjeと@Michaelの素晴らしい例をありがとう! '' -f -c prog -n ''、 '' -f -c prog -n ''、 '' -f -c prog -n ''、 '' -f -c prog- '-ac'を別々の行に書くと、スペースで3つの補完を区切ることができると信じています: '-f -c prog -n' __fish_prog_using_command foo '-a" abc "' – yegeniy

関連する問題