2011年06月11日

Emacs でTAGファイルを使って関数にタグジャンプ

ソフトウェア開発している時って、 「こっちからあっちの関数をなんか呼んでるんだけど結局そこで何をしてんのー?」 ってことでそこの関数を見に行くわけですけど、 まあ、そういう時、Emacsとかならタグジャンプするよねってお話。

自分はRailsの開発をしていたりするので、 とりあえず Exuberant Ctagsを導入。

MacでMacPortsを使っていると多分

$ sudo port install ctags

で入ってくる。

Ubuntuだときっと

$ sudo aptitude install exuberant-ctags

でいけるんじゃないかな

これでRubyにも対応したctagsが使えるようになると。

で、Emacs用に

$ ctags -e app/**/*.rb lib/*.rb vendor/plugins/**/*.rb

でTAGファイルを出力。 それぞれのgemの中身までは追い掛けなくていいよね。 pluginも見ないでいい気がするけど。

これでTAGSって名前で、Emacs用のタグファイルができると。

ちっちゃいプロジェクトだと適当に

$ ctags -e **/*

したりするけど。

んでまあ適当にプロジェクト内のrbファイルでも開いて 関数を呼び出しているところで M-. したら find-tag が呼ばれて、TAGファイルの中で最初に見付かったその関数にジャンプするよ。

他にも色々あるから軽くまとめてみた

M-.find-tag入力した名前の関数にジャンプ
M-*pop-tag-mark元のところに戻る
C-u M-.find-tag(引数付)M-. した後に使うと次の同名の関数に飛ぶ
C-M-.find-tag-regexp正規表現で関数を探してジャンプ
C-x 4 .find-tag-other-window入力した名前の関数のところに別windowでジャンプ
C-x 5 .find-tag-other-frame入力した名前の関数のところに別frameでジャンプ

他にもtags-searchとかあるみたいだけど、よくわかんないからいいや。

でまあ、etagsのジャンプも悪くないんだけど、 なんかもっとなーい? ってことで調べたら anuthing-c-etags-select とかいう関数がanything-config.elにあるらしいじゃないですか。

と思って使おうとしたら、 自分の使っているEmacs22で使えなかったりしたけどなんとかした。

ってことで

M-x anything-c-etags-select

から選べるようになった。

あとは、デフォルトのキーバインドがなんか気に入らないので、 それも変えてみる。

M-. はともかくとして、C-u M-. はちょっとめんどいもん。 C押して離してM押してーは、ね。

(defun find-tag-next ()
  (interactive)
  (find-tag last-tag t))

(global-set-key (kbd "M-g .")   'find-tag-regexp)
(global-set-key (kbd "C-M-.")   'find-tag-next)
(global-set-key (kbd "M-,")     'find-tag-other-window)
(global-set-key (kbd "M-g M-.") 'anything-c-etags-select)

ってことで、こんなんになった。

M-.find-tag
M-*pop-tag-mark
M-g .find-tag-regexp
C-M-.find-tag-next
M-,find-tag-other-window
M-g M-.anything-c-etags-select

本当はM-,は別のキーバインドがあてられてるけど、 それを使う機会が無さそうなので、

あと、 C-x 4系は基本的に hogehoge-other-window が、 C-x 5系には hogehoge-other-frame が割り当てられてるけど、 そんなんガン無視していいよね。 特にC-x 5系は、単一フレーム派だから関係ないし。

posted by 麦汁 at 20:29 | Comment(0) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。