Emacs + Anything + gtags で、プロジェクト単位の情報源を作成

さいきんEmacsを使うようになったのですが、どうも風潮としては、helmというやつがいまは隆盛のようですね。

でも、Anythingでずいぶん楽しいので、とりあえずAnythingで書きました。

もしかすると、with-current-bufferはletでやんなくてもいいのかもしれないけれど、とりあえず動いているので。

まずgtags

gtagsが前提です。

僕はmacportsで入れました。

sudo port install gtags

で、さくっと入っちゃうと思います。

それぞれのプロジェクトのディレクトリで、

gtags -v

で、インデクスを生成します。

普段はgitを使っているので、git単位というのも考えたのですが、git単位だと、複数の.gitからできているような場合、うまいこと起点にしづらかったので、gtagsにしています。

EmacsとAnything

これはどこかかしらから入手します。

コード

以下のような感じ。

;;; あればgtagsを起点にしてfindし、なければカレントディレクトリを対象にした情報源
(defvar anything-c-source-find-by-gtags
	'((name . "Find by gtags or ls")
 (candidates . (lambda ()
     (let
      ((default-directory
      	 (with-current-buffer anything-current-buffer default-directory))
       (find-opt " -type f ! -name \"*.png\" ! -name \"*.ico\" ! -name \"*.gif\" ! -name \"*.jpg\""))
     	(cond
     	 ;; gtags-get-rootpathが返ったらgtagsをあてにして良い
     	 ((gtags-get-rootpath)
      (split-string
       (shell-command-to-string
      	(concat "find " (directory-file-name (gtags-get-rootpath)) find-opt)) "\n"))
     	 ;; gtagsがないならls
     	 (t
      (split-string
       (shell-command-to-string
      	(concat "ls -1 " (shell-command-to-string "pwd"))) "\n"))))))
 (type . file)))

findを投げているので、それなりにコストがありますし、インターネット上には、インデクスを作って対象にするようなノウハウもたくさん見かけます。

でも、まあ、これで僕の環境では、十分サクサク動いているのでいいかしら。

Finderに行く機会が激減しています :-)

ジャンル: EmacsMac