auto-complete-ya-gtags.el を作ってみました。

どもです。

前振り

auto-complete.el って最高。今でも感動を覚えます。
でも,なんかしらんが,もっさりする。開いたバッファの数が増えればどんどん。
原因は,ac-sources に ac-source-words-in-buffer が入っていたからでした。
これは,前に日記に書いたとおり,開いている全部のバッファから補完候補を
拾ってくるので,バッファを開けば開くほど,重くなる。
さて,これで,emacs-lisp-mode が軽くなりました。
というか,驚きのスピード。バージョンを 1.4 にしたので,
そのせいもあるかもしれませんが,とにかくすごく早い。
ストレスが減ったどころか,逆に補完される度に気持ちがいい!


しかし,c-mode で,C のソース書いているときに,あれ? と。
もっさりするがな。そのときの ac-sources の値。
ac-sources =>
(ac-source-etags <-- これは自前
ac-source-gtags
ac-source-words-in-same-mode-buffers
ac-source-dictionary)


これは困った。今まではこのくらいが普通と思っていたが,
emacs-lisp-mode での早さを知ってしまった今,耐えられない。

原因。そして。

ac-sources から,各ソースを削除していって,原因判明。
ac-source-gtags が,補完のたびに,global -ci を呼んでいるからでした。
自前の ac-source-etags.el があるので,なくてもこまらにゃーですが,
なんとかしたいなぁと思って,自前の ac-source-etags.el を作ったとき
と同じように改造してみた。

作ってみた。

なーに,大したことはしてないのです。
ただ単にキャッシュするようにしただけなんですがね。
どうもワタシは単純なことを難しく考えてしまうようで
(これは馬鹿の典型ですね。ごめんなさい),
それでもめげずに作ってみました。
というか,auto-complete.el の出来がすばらしいので,簡単にできる。
ほんとすげーなーと思う。まいいや。

auto-complete-ya-gtags.el。

  • ソース

https://github.com/whitypig/auto-complete-ya-gtags


ac-source-gtags は,オリジナルに付属しているので,別の名前を考えたです。
なんか,yet another つけるのってかっこいいなぁと思っていたので,
ここぞとばかりにつけてみたです。


簡単に言うと,あるバッファを編集し始めたときに,global -p を実行して,
GTAGS が見つかれば,global -c で補完用のテーブルを作って,
以降そこから補完するようにしただけです。
GTAGS が見つからなければ,何もしません。
なので最初の1回はややもっさりしますが,以降はしません。やったぜ!

使い方。

auto-complete が動いて,global がインストールされていれば,
動くはず。
ac-source-gtags を使っている人には,是非使ってみて欲しいです。
もっさり感がなくなります。というか既に別の代替法があったりする?
ま,いいや。


使い方は,auto-complete-ya-gtags.el をロードパスの通ったところに置いて,
require して,ac-sources に ac-source-ya-gtags を追加です。
c-mode とか,c++-mode のフック関数の中で設定するのがいいかもです。
例えば,ワタシの場合は,下記のような感じになってます。
というか,ac-source-etags と ac-source-ya-gtags を同時に使うのは
いかがなものかとも思うのですが,勘弁して下ちい。
(4/1 15:30 ac-sources に追加する部分が間違っていたのを修正しました。)

(defun my-c-mode-common-hook-func ()
  ; ...
  (when (and (require 'auto-complete nil t) (require 'auto-complete-config nil t))
    (auto-complete-mode t)
    (setq ac-auto-start 2)
    (setq ac-sources '(ac-source-words-in-same-mode-buffers
                       ac-source-dictionary
                       ;ac-source-dabbrev
                       ;ac-source-abbrev
                       ))
    (when (require 'auto-complete-etags nil t)
      (add-to-list 'ac-sources 'ac-source-etags))
    (when (require 'auto-complete-ya-gtags nil t)
      (add-to-list 'ac-sources 'ac-source-ya-gtags))))

(add-hook 'c-mode-common-hook 'my-c-mode-common-hook-func)


もし使ってもらえて,バグやまずい所を見つけたら,
コメントなりメールで教えてもらえると大変うれしいです。
自分でもまだ使い始めたばっかりだし,テスト書いてねーし(書けよ!),
見つけきれてません。

ac-source-etags についてちょびっつ。

自分で作っておいてなんですが,
ぶっちゃけ,ac-source-etags の方が使い勝手がいいと思う。
タグファイルを自分で指定できたり,複数のタグから補完できたり。
あと,タグファイルが散在していても大丈夫という強みもあります。
これについては,自分で etags.el に手を入れ,あと,
auto-complete-etags.el も改造してあるからというのが
その理由ですが,これについては,
後日アップしたりまとめてみたいと思っております。
えぇ,先延ばしですよ。


あと,テストを書きたいのですが,el-expectation.el もいいのですが,
ウィンドウがあっちこっちに開かれるのがちと痛い。
popwin.el ですね。わかります。で,popwin-test.el というファイルがあったので,
どうやってテストを書いているのかなぁと覗いてみたら,
よくわからんかった。この「よくわからん」というのは,
自分の知識のなさを露呈している状況を表しています。
けど,なんかすごそうなのはわかった。ほとんど何もわかってねぇじゃん(ry
というわけで,そろそろ common-lisp の勉強をガチでしたいなぁと。
残されている時間も減っているしね。

最後に。

auto-complete.el の作者様にまたまた感謝。
あんな簡単に,ac-source の1つを作れるようになっているのは,
すごいと思います。
それから,global の作者様にも感謝。やはりgtagsのタグジャンプは
強力だし便利。global を global に global で愛しています。
ありがとー!!