zshの補完にunzipの-Oオプションを付け足す

前書き

patch当てることによって使える-Oオプション
このオプションを書いてしまうと忽ち補完ができなくなってしまうのでいじります
なお、私は-O cp932しか使わないのでそれが出るようにしか対応してません
vals配列いじれば好きに追加できます

やり方

このunzipの補完の実体はarchlinuxなら

    /usr/share/zsh/functions/Completion/Unix/_zip

にあると思います
どこかわからなければ

    % find $fpath -type f -exec grep -l '#compdef.* unzip' {} +
    /usr/share/zsh/functions/Completion/Unix/_zip

こんな感じでわかると思います。unzipを他のコマンドに変えたらそれの補完が出ると思います

後はこれを適当なディレクトリにコピーします
私は~/.zsh/functionsに置きました
後はmplayerの補完を参考にして気合で修正します

そして出来上がったのが
https://gist.github.com/silenvx/7433295
こちらです。修正箇所は

    % diff -Narup _zip.orig _zip
    --- _zip.orig   2013-11-13 00:57:06.922524391 +0900
    +++ _zip    2013-11-13 00:50:52.775261772 +0900
    @@ -75,6 +75,7 @@ case $service in
           '-M[page output]' \
           '-x[exclude the following names]' \
           '-Z[zipinfo mode]:zipinfomode:->zipinfo' \
    +      '-O[specify a character encoding for DOS, Windows and OS/2 archives]:iconvList attachment:->iconvList' \
           "(-p -f -u -l -t -z -n -o -j -C -X -q -qq -a -aa -v -L -M)1:zip file:_files -g '(#i)*.(zip|xpi|[ejw]ar)(-.)'" \
           '*:file:->files' && ret=0
       ;;
    @@ -132,6 +133,11 @@ case $state in
         _multi_parts / _zip_cache_list && return
         fi
       ;;
    +
    +  iconvList)
    +      vals=('cp932')
    +      _describe -t iconvList 'iconv list' vals
    +      ;;
     esac

     return ret

こんな感じになってます

使えるようにするため.zshrcのcompinitを読み込む前に

    fpath=(~/.zsh/functions $fpath)

を書いておきます

後はzshを再起動させれば使えるようになりましたとさ

後書き

書き方が正しいのかは知りません
それと、書いてから気づいた
http://d.hatena.ne.jp/tyru/20120708/zsh_completion_for_unzip_o_option
既に同じようなことしてる人がいました。二番煎じなことしてすみません