とにかく書く

日々の雑感や知り得たことを、とにかく書いています

find-tags の実行時に TAGS ファイルを探しに行く

GNU Global だと、こういうことはやってくれるけど、変数と関数を区別していて(?)手になじまなかったので etags を使い続けている。だけど GNU Global はタグファイルを自動で検索してくれるところが使いやすかった。
だから etags の場合でも find-tags を実行時にソースコードを含むディレクトリから上に上に TAGS ファイルを検索していくようにしてみた。

(defun tags-search-tags-file (file-name)
  "Search TAGS file to upper directories of the current buffer"
  (let ((parent-directory (file-name-directory (directory-file-name file-name))))
        (unless (string= file-name parent-directory)
          (let ((tags-file (concat parent-directory "TAGS")))
                (if (file-exists-p tags-file)
                        (setq tags-file-name tags-file)
                  (tags-search-tags-file parent-directory))))))

 (add-hook 'pre-command-hook
       (lambda ()
           (when (eq this-command 'find-tag)
                     (tags-search-tags-file (buffer-file-name)))))

tags-table-list のことは知っているけど、ちょっとだけ違う複数のソースコードを扱っていると、単にタグファイルを列挙するだけでは不十分で、都度タグファイルを読んでほしかったのです。