pydocのモジュール名を補完するZsh補完関数対応Hack

Big Sky :: perldocのbash-completionが激しく便利でうれしょん出た。 の Hack(まぁ正確に言うとperldoc-completeの紹介ですが。)が渋い感じなので、 Zsh+pydocでできんかなと。

perldocのモジュール補完はZshではすでに対応できていたので、 pydocのモジュールでも同じようなことがしたい!と。

かなり間に合わせな感じですが、以下のような手順で対応できます。

準備

恐らくZshを使用している環境であれば、すでにpydocの補完関数は存在するはずです。

$ locate _pydoc
            :
            :
/usr/share/zsh/functions/Completion/Unix/_pydoc
$ cat /usr/share/zsh/functions/Completion/Unix/_pydoc
#compdef pydoc

local context state line
typeset -A opt_args

_arguments \
  '-k[keyword]:keyword:' \
  '-p[port]:port:_ports' \
  '-g[gui]' \
  '-w[write out HTML]:file or dir:_files' \
  ':keyword, topic, module, package, or dotted reference:->lookup' && return 0

_alternative \
  'keywords:keyword:compadd ${=${${(f)"$(pydoc keywords)"}[2,-1]}}' \
  'topics:topic:compadd ${=${${(f)"$(pydoc topics)"}[2,-1]}}' \
  'modules:module:'

で、対応させる方法としては最後の行( 'modules:module:' )の箇所を 以下のように変更します。

$ vim /usr/share/zsh/functions/Completion/Unix/_pydoc
            :
            :
  'modules:module:compadd ${=${${(f)"$(python -c "import pkgutil,sys;[sys.stdout.write(m[1]+\" \") for m in pkgutil.iter_modules()];")"}[0,-1]}}'
$

$HOME/.zshrc ファイルを読み込みなおせば補完が有効になります。 システムのZsh補完関数を直接編集したくない場合は、 以下のような記述を $HOME/.zshrc ファイルに追加して、 編集した _pydoc ファイルを $HOME/.zsh/completion/ 配下に格納してください。

fpath=(~/.zsh/completion/ $fpath)
autoload -U ~/.zsh/completion/*(:t)
autoload -Uz compinit
compinit -u

こちらも $HOME/.zshrc ファイルを読み込みなおせば補完が有効になります。

動作例

以下の例では Simple まで入力して候補を表示させています。

$ pydoc Simple ここでTabを押す
SimpleDialog        SimpleHTTPServer    SimpleXMLRPCServer

終わりに

Ubuntu9.10, Python2.6.4, Zsh4.3.10 の環境でしか試していませんので、 そのまま他の環境で動作するかはわかりません。 私が使用している環境 [1] ではストレス無く使えていますが、 Tabを押す度にワンライナーを実行することになるので、 補完に時間がかかるかもしれません。 また、モジュール名以上の補完はできません。

サクサク開発できるようになれば最高ですね。 興味があれば試してみてください。

もっといい感じのやり方があれば誰かおせえて。。

footnote

[1]Intel Core2Duo 1.4GHz