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 "$@"
- 2008-10-31追記:変数名とキャッシュファイル名を変更(以前のものを使っていた場合は~/.zcompcache/cheat_sheetsを消してください)
- 2008-10-31追記:codereposにおいたので最新は http://svn.coderepos.org/share/lang/zsh/Completion/_cheat で。