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 |