後半で3点も入れられちゃってるよオイ、という空気を感じつつこのあいだの続きでもしよ、って思って続きです。
もういいや的あきらめって必要なときは必要ですよね。
#compdef ethna _ethna() { local curcontext="$curcontext" state line expl ret=1 _arguments -C \ '(-v --version)'{-v,--version}'[show version]' \ '1:ethna command:->ethna-cmd' \ '*:ethna command args:->ethna-cmd-arg' \ && ret=0 if [[ -n "$state" ]]; then case $state in ethna-cmd) handles=( $($service | grep '^ \+.* -> .*:$' | awk '{print $1}') ) _wanted ethna-cmd expl 'ethna cmd' compadd -a handles && ret=0 ;; ethna-cmd-arg) usage=$($service | grep -A 1 "^ \+$words[2] ->") if [[ -n "$usage" ]]; then _wanted ethna-cmd-arg expl 'ethna cmd arg' compadd -x "$usage" && ret=0 else _wanted ethna-cmd-arg expl 'ethna cmd arg' compadd -x "unknown command" && ret=0 fi ;; esac fi return ret }
ようするにethnaコマンドの出力を取るように変更しました。
どうせzshでtabで補完するなんて、「それなりに性能のいいマシンで」「インタラクティブに」呼び出される関数書くだけなんですから。いいんです、これで。solarisで動かないとかあっても一切知りません。