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 で愛しています。
ありがとー!!