C++のソースを書いていると、この変数の宣言どこだっけ?とか、この関数の宣言どこだっけ?とか、呼んでるところどこだっけ?みたいなことが良くあります。
VisualStudioなら、なんかファンクションキーを押したら飛んでいける奴です。
etags, ctags
昔からある奴です。
面倒なので説明は省略します。
gtags
GNU globalのものだそうです。
Ubuntuだとその名もglobalと言うパッケージをインストールすると、gtagsとかglobalコマンドが使えるようになります。
init.el に以下を追加します。
;; gtags
(use-package gtags
:commands gtags-mode
:config
(add-hook 'c-mode-common-hook 'gtags-mode)
)
プロジェクトのトップディレクトリで、gtags と打つと、GPATH, GRTAGS, GTAGS と言う3つのファイルができます。
デフォルトではキーが何も設定されていないので、M-x gtags-find-tag
とか打つ必要があります。
gtagsを使う場合は、使いそうなコマンドをキー割り当てしましょう。
ここまでは github の gtags ブランチで。
rtags
ctags, etags, gtags は、タグの情報をファイルに書き、emacsはそのファイルを読んで動作する。
rtags は、rdm と言うデーモンが情報をemacsとやり取りする。
Ubuntuの場合、パッケージに見当たらなかったので、githubに書いてある通りにgit cloneしてビルドした。
使い方はwikiにある。
手順通りにビルドすると rtags.el は /usr/local/share/emacs/site-lisp/rtags に入るのだが、最近はpackage-installばかり使って個人の ~/.emacs.d にパッケージが入ったため、/usr/local/share/emacs/site-lisp/subdirs.el が存在しなかった。
このため、rtags.elが読み込めなくて少し悩んでしまった。
以下の内容をinit.elに追加する。
;; rtags
(use-package rtags
:hook (c++-mode . rtags-start-process-unless-running)
:config
(rtags-enable-standard-keybindings)
(setq rtags-completions-enabled t)
(add-to-list 'company-backends 'company-rtags)
(bind-keys :map c-mode-base-map
("M-." . rtags-find-symbol-at-point)
("M-," . rtags-location-stack-back)
("C--" . rtags-find-references-at-point)
("M-;" . rtags-find-file)
("C-." . rtags-find-symbol)
("C-," . rtags-find-references)
("C-<" . rtags-find-virtuals-at-point)
("M-i" . rtags-imenu))
)
rtags-enable-standard-keybindingsでデフォルトのキー設定がされるのだが、prefixが深くて使いにくいので、良く使うコマンドはキー割り当てしよう。
この状態でc++のソースを開いて、M-.
とか押すと、indexされてませんよ?とか怒られるので、プロジェクトのトップディレクトリで rc -J build/
とかやってcompile_commands.json の位置を教えてあげると、情報がインデックスされて使えるようになる。
Makefileにも対応しているので、マニュアルを読んで欲しい。
とは言え、lspにも似たようなことができるはずだし、rtagsにもcompileコマンドっぽいものがあったりして、機能がかぶっているような気もしないでもない。
ここまでは github の rtags ブランチで。