読者です 読者をやめる 読者になる 読者になる

Python のソースを読むのにタグジャンプ機能を利用する

python environment

vi(vim) で Python のソースを読むのに ctags を使ってみました。調べていると、別途、ptags.py と言うものもあり、それを用いてもタグファイルを作成してくれるようです。
basic Tip #1188: Use ptags.py to generate tags file for python によると、Python 2.3 以上で使用できます。ptags.py は python-tools パッケージに含まれています。

yum を使って python-tools と ctags をインストールします。

$ sudo yum install python-tools ctags
~~~ snip ~~~
Running Transaction
  Installing     : python-tools                                      [1/2]
  Installing     : ctags   

以下のように ptags.py の引数にファイル名を指定すると tags ファイルが作成されます。おそらく ptags.py は ctags が Python に対応していなかった過去の名残りかな?と思います。現在は ctags でもタグファイルを作成することができます。

$ /usr/lib/python2.5/Tools/scripts/ptags.py *.py
又は、
$ ctags *.py

ptags.py と ctags で作成した tags ファイルを比較してみました。ctags の tags ファイルの方がサイズが大きいです。

$ ls -l tags*
-rw-rw-r-- 1 xxx xxx 33543 2008-09-03 18:31 tags.ctags
-rw-rw-r-- 1 xxx xxx 18708 2008-09-03 18:32 tags.ptags

$ head tags.ptags tags.ctags
==> tags.ptags <==
CacheProgressCallback   output.py       /^class CacheProgressCallback:/
CheckFailedSignal       yum-updatesd.py /^    def CheckFailedSignal(/
CheckNow        yum-updatesd.py /^    def CheckNow(/
CheckUpdateCommand      yumcommands.py  /^class CheckUpdateCommand(/
CleanCommand    yumcommands.py  /^class CleanCommand(/
CliError        cli.py  /^class CliError(/
DbusUpdateEmitter       yum-updatesd.py /^class DbusUpdateEmitter(/
DepListCommand  yumcommands.py  /^class DepListCommand(/
DepSolveProgressCallBack        output.py       /^class DepSolveProgressCallBack:/
EmailUpdateEmitter      yum-updatesd.py /^class EmailUpdateEmitter(/

==> tags.ctags <==
!_TAG_FILE_FORMAT       2       /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED       1       /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR    Darren Hiebert  /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME      Exuberant Ctags //
!_TAG_PROGRAM_URL       http://ctags.sourceforge.net    /official site/
!_TAG_PROGRAM_VERSION   5.6     //
CacheProgressCallback   output.py       /^class CacheProgressCallback:$/;"      c
CheckFailedSignal       yum-updatesd.py /^    def CheckFailedSignal(self, message):$/;" m       class:YumDbusInterface
CheckNow        yum-updatesd.py /^    def CheckNow(self):$/;"   m       class:YumDbusListener
CheckUpdateCommand      yumcommands.py  /^class CheckUpdateCommand(YumCommand):$/;"     c

どちらが良いとか、何が違うとかがよく分からないので、取り合えず ctags を使用することにします(^ ^;;

カレントディレクトリ配下(サブディレクトリも含む)の
全ての .py ファイルからタグファイルを作成する
$ find . -type f -name "*.py" -exec ctags -a {} \;

上記に加えて、特定ライブラリも対象に含めてタグファイルを作成する
$ find . /usr/lib/python2.5/site-packages/rpm* -type f -name "*.py" -exec ctags -a {} \;

vi(vim) エディタ上での基本操作は以下の通りです。詳細は Tip #94: Questions & Answers about using tags with Vim からリンクを辿ればありそうです。まぁ、ぼちぼちと(- -#

:ta tag タグを検索する
Ctrl-] カーソル下のタグを検索する(ヒットすればジャンプ)
Ctrl-T タグジャンプする前の位置へ戻る

さらに taglist.vim : Source code browser (supports C/C++, java, perl, python, tcl, sql, php, etc) に taglist.vim というプラグインがあります。せっかくなのでこれもインストールして使ってみます。

インストール方法:
1. taglist_45.zip をダウンロード

2. vim の環境設定
$ vi ~/.vimrc
filetype on を追加
$ cd ~/.vim
$ unzip /tmp/taglist_45.zip
plugin/taglist.vim - プラグインの本体
doc/taglist.txt    - ドキュメント(ヘルプ)ファイル

3. 基本操作
:TlistToggle
左側にタグリストメニューが表示され F1 でヘルプが見れます

以下のようなイメージです。


リファレンス:
Vim Taglist Plugin 本家サイト