0

ZSHの Capistrano mutilstage補完を作成しようとしています:

$ cap |
production staging


$ cap production |
deploy                       -- Deploy a new release
deploy:bundle                -- Bundle
...

完了コード:

#compdef cap
#autoload

# /Users/pablo/.oh-my-zsh/custom/plugins/capistrano_custom/_capistrano_custom

local curcontext="$curcontext" state line ret=1
local -a _configs

_arguments -C \
  '1: :->cmds' \
  '2:: :->args' && ret=0

_cap_tasks() {
  if [[ ! -f .cap_tasks~ ]]; then
    echo "\nGenerating .cap_tasks~..." > /dev/stderr
    cap -v --tasks | grep '#' | cut -d " " -f 2 > .cap_tasks~
  fi
  cat .cap_tasks~
}

_cap_stages() {
  find config/deploy -name \*.rb | cut -d/ -f3 | sed s:.rb::g
}

case $state in
  cmds)
    if [[ -d config/deploy ]]; then
      compadd `_cap_stages`
    else
      compadd `_cap_tasks`
    fi
    ret=0
    ;;
  args)
    compadd `_cap_tasks`
    ret=0
    ;;
esac

return ret

問題:

#compdef cap動作しません。入力capして[TAB]を押すと、補完は実行されませんが、他の言葉(つまりshipit)では正常に機能します。

何か案は?

解決:

cap は実際には予約語であり、 では使用できないよう#compdef capです。

キャップカピストラーノの補完が以前にどのように機能したか疑問に思っています(おそらく古いバージョンのZSH)。

  • ソリューション ドットファイル コード: capistrano_custom
  • ソリューション oh-my-zsh/PR: #2471

どちらのソリューションもshipitの代わりに使用しcapます。

$ shipit |
production staging

$ shipit production |
deploy                       -- Deploy a new release
deploy:bundle                -- Bundle
...
4

1 に答える 1

0

はい、capZSH ビルトインです。zsh docs からの引用:

zsh/cap モジュールは、POSIX.1e (POSIX.6) 機能セットを操作するために使用されます。[...] . このモジュールのビルトインは次のとおりです。

cap [ capabilities ]シェルのプロセス機能セットを指定された機能に変更します。それ以外の場合は、シェルの現在の機能を表示します。

于 2014-01-25T17:44:15.097 に答える