pydocのモジュール名を補完するZsh補完関数対応Hack
Tue, 2 Mar 2010
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
0 comments.



