私は、魚に使用するオートコンプリートスクリプトを作成しようとしています。私は同じプログラムのbash補完スクリプトを移植しています。サブコマンドを使用したオートコンプリートスクリプトの作成
プログラムは3つのトップレベルのコマンドを持っているが、foo
、bar
、およびbaz
を言うと、それぞれがちょうどそれぞれのa
b
とc
を言って、いくつかのサブコマンドがあります。
私は何を見ていることは、トップレベルの自動OK完了コマンドということですので、私はf
を入力した場合、私はオートコンプリートにfoo
を取得していますが、私はそれがサブコマンドがあるのですか見てもう一度タブをヒットした場合、その後、私はfoo
を見ます、bar
、baz
、a
、b
、c
と正しい動作しているようですので、それはちょうど私が参考にgit completion scriptを使用していますa
、b
、c
でなければなりません。私も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"
この作業を行う方法上の任意の提案は非常に高く評価され、次のよう
トリムダウンスクリプトがあります。
うん、それはうまくいった、ありがとう。 – Michael
@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