普段の開発には主にEmacsを使っているのだが、良くある事例として現在参照しているモジュールがどこにあるのか分からなかったり、この定数がどこから定義されているのか分からなかったりすることが良くありますよね。
ソフトウェアの世界だと、これらの関数定義にジャンプするためには、WindowsではVisual StudioのIntelliSenseが有名だが(僕も良くお世話になっている)、Emacs/Vimの世界ではctags/etagsというものがあるらしい。
これは現在のソースコードを解析して、関数の定義場所にジャンプしてくれる優れ物らしい。さっそく試してみよう。
Ubuntuでの導入手順
Ubuntuで導入するためには、普通にaptitudeするだけで良い。
sudo aptitude install exuberant-ctags
次に、ファイルの存在する場所でexuberant-ctagsを実行する。TAGSファイルが作成された。
$ etags `find . -name *.v` `find . -name *.vh` $ ls -ltr total 600 drwxrwxr-x 3 vagrant vagrant 4096 Nov 14 14:54 ip drwxrwxr-x 5 vagrant vagrant 4096 Nov 14 14:54 common drwxrwxr-x 13 vagrant vagrant 4096 Nov 14 14:54 mag_core drwxrwxr-x 10 vagrant vagrant 4096 Nov 14 14:54 cocotb drwxrwxr-x 3 vagrant vagrant 4096 Nov 14 14:59 tests -rw-rw-r-- 1 vagrant vagrant 592799 Dec 26 16:54 TAGS
.emacs/init.elの編集
emacsでのキーバインドを作成して、使いやすいようにしておく。以下のサイトを参考にした。
;; ;; CTAGS ;; (defun find-tag-next () (interactive) (find-tag last-tag t)) (global-set-key (kbd "M-g .") 'find-tag-regexp) (global-set-key (kbd "M->") 'find-tag-next) (global-set-key (kbd "M-,") 'find-tag-other-window) (global-set-key (kbd "M-g M-.") 'anything-c-etags-select)
CTagsの試行
例えば、Verilogファイルを開いていて、以下のようにモジュールのインスタンシエーション部にカーソルを当ててM-.
を実行した。ここでは、mag_ifuというモジュールがどこに定義してあるのか探したい。
そういえばまだTAGファイルを指定してなかったので、TAGファイルの場所を指定する。
実行した。ところが、違うファイルが参照されてしまった。
M->
を何回か入力して、当該ファイルに飛んだ。どうやら、サーチには一工夫必要らしい。
これ、最近流行りのVisual Studio Codeなどではどうなのかな?ちょっと試してみよう。