zshでport(MacPorts)の補完をする

zshは強力な補完機能が売りの1つですが、MacPortsのportコマンドには対応していません。variantsで、

$ sudo port install zsh +mp_completion

とすればMacPorts用の補完用スクリプトが入るのですが、キャッシュされていなくて遅かったり、variantsに対応していなかったりと若干不満が残るものでした。
なので、その辺に対応させたものを書いたので上げてみます。(動作保証はしません

ダウンロード

http://www7b.biglobe.ne.jp/~hagure_beans/files/_macports
https://github.com/beans15/my_settings/blob/master/.zsh/functions/_macports


基本的にどちらも同じです。上のURLは、もしかしたらそのうち消えるかもしれません。あと、最新でないかもしれません。

設定

ホームディレクトリに .zsh/ ディレクトリを作り、さらにその中に、cache/ ディレクトリと functions/ ディレクトリを作ります。

$ mkdir ~/.zsh
$ mkdir ~/.zsh/cache
$ mkdir ~/.zsh/functions

そして、.zsh/functions/ ディレクトリの中に、ダウンロードした _macports ファイルを置きます。

$ cp ~/Downloads/_macports ~/.zsh/functions/

最後に、.zshrc の、compinitの前に以下の設定を加えます。

# ローカルの補完ディレクトリを追加
fpath=(~/.zsh/functions ${fpath})
# キャッシュの設定
if [ -d ~/.zsh/cache ]; then
    zstyle ':completion:*' use-cache yes
    zstyle ':completion:*' cache-path ~/.zsh/cache
fi

使い方

書くほどのことではない気もしますが、とりあえず書いときます。

$ port install

と書いてタブを打つと、インストール可能なportsが表示されます。最初はキャッシュされていないので遅いですが、2回目以降はまともな速度で表示されるはずです。
また、variantsは、

$ port install zsh +

と書いてタブを打つと、利用できるvariantsが表示されます。

補足

キャッシュは、.zsh/cache/ ディレクトリの、*PORTS ファイルに入れているので、キャッシュをクリアする場合は、

$ rm -f ~/.zsh/cache/*PORTS

と打ってシェルを再起動すれば、キャッシュなしで補完できるようになります。デフォルトでは1週間でキャッシュが無効になるようになっています(この辺適当)


あと、作った本人が実はそれほどMacPortsに詳しくないので、ひょっとしたら間違ってるかもしれません。そのときはコメントしていただけるとありがたいです。