cheatの補完

http://blog.netswitch.jp/articles/2008/09/25/zsh-completion-for-cheatをみて、zsh自体にcacheがあったはず、と思ったらあったので それを使って、オプションにもちゃんと対応したものを書いてみました。
fpathを通したところに_cheatというファイル名でおいておけば使えるはずです。

zshの機能を使っているので、当然zstyleでuse-cacheを有効にしないとキャッシュされません。

#compdef cheat

# cheat 1.2.1

_cheat () {
_arguments \
  '(--clear-cache --new)'{--clear-cache,--new}'[clear cache]' \
  '(--diff)'--diff'[diff sheets (cheat greader --diff 1\[\:3\])]:version' \
  '(--versions)'--versions'[show versions]' \
  '(--add --edit)'--add'[add cheat sheet]' \
  '(--add --edit)'--edit'[edit cheat sheet]' \
  '1::sheet:_cheat_sheets'
}

_cheat_sheets() {
  local update_policy
  zstyle -s ":completion:$curcontext:" cache-policy update_policy
  if [[ -z "$update_policy" ]]; then
    zstyle  ":completion:$curcontext:" cache-policy _cheat_caching_policy
  fi

  if ( [[ ${+_cheat_sheets} -eq 0 ]] || _cache_invalid CHEAT_sheets ) && ! _retrieve_cache CHEAT_sheets; then
    # `cheat cheat` says:
    #  And to get all cached locally, you could do
    #  $ cheat sheets | grep '^  ' | xargs -n 1 cheat
    _cheat_sheets=(${(f)"$(cheat sheets|sed -ne 's/^  //p')"})
    _store_cache CHEAT_sheets _cheat_sheets
  fi

  local expl
  _wanted cheat_sheets expl 'Cheat Sheets' compadd -a _cheat_sheets
  _wanted all_cheat_sheets expl 'All Cheat Sheets' compadd sheets all
  _wanted recent_cheat_sheets expl 'Recently added cheat sheets' compadd recent
}

_cheat_caching_policy () {
  # rebuild if cache is more than an hour old
  local oldp
  oldp=( "$1"(Nmh+1) )
  (( $#oldp ))
}

_cheat "$@"