auto-complete と dabbrev の組み合わせまとめ

どうもいっす。


2chEmacs Part34 から。
http://pc12.2ch.net/test/read.cgi/unix/1268015714/

840 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2010/06/07(月) 13:07:08
auto-complete で html-mode のときに *.rb を開いているバッファの単語を
補完候補にするにはどうしたらいいでしょうか?

841 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2010/06/07(月) 23:32:06
dabbrevで解決するのは雑か?

842 名前:840[sage] 投稿日:2010/06/08(火) 02:43:51
>>841
dabbrevはずっと使っているんですが、同じようなシンプルな使い方が
auto-complete で、できないものかと。

cssのバッファに書いているクラス名を、htmlのバッファで補完とか多用するので
同じバッファからのみという仕様は個人的にはメリットが少なかったりします。


キタコレ。ac-dabbrev.el の生きる道が!!
複数の異なるメジャーモードで開いているバッファのみを対象とした補完が!
ここで,auto-complete と dabbrev のコラボですよ。


ま,auto-complete 使用しない場合も,
dabbrev では,補完元のバッファを集めてくる関数を,
自分で定義して使用することができるので,それを使えばいいちゃいいけど,
auto-complete 使えるなら使うべきだと思うお。

対象モードのフックで,dabbrev の補完もととなるバッファを集める関数を設定する。
例えば,上記のように,

auto-complete で html-mode のときに *.rb を開いているバッファの単語を
補完候補にするにはどうしたらいいでしょうか?

の場合は,下記のようにする。
もいっこ抽象的にして,引数でmajor-modeのリストをもらってもいいけど
ま,いいや。

(defun my-dabbrev-select-ruby-mode-buffers ()
  "Return a list of buffers opened with ruby-mode."
  (interactive)
  (let (b l (bl (buffer-list)))
    (dolist (elt bl)
      (save-excursion
        (set-buffer elt)
        (when (memq major-mode '(ruby-mode))
          (add-to-list 'l elt))))
    l))

;; html-mode のフックに追加する関数を定義
(defun my-html-mode-hook-func ()
  (interactive)
  ;; dabbrev の設定
  (set (make-local-variable 'dabbrev-check-all-buffers) nil)
  ;; 定義した関数を使用する用に設定
  (set (make-local-variable 'dabbrev-select-buffers-function)
       'my-dabbrev-select-html-mode-buffers)
  ;; auto-complete の設定
  (when (and (require 'auto-complete nil t) (require 'auto-complete-config nil t))
    (make-local-variable 'ac-sources)
    (setq ac-auto-start 2)
    (setq ac-sources '(ac-source-words-in-buffer
                       ac-source-etags
                       ac-source-imenu
                       ac-source-dabbrev
                       ac-source-abbrev))))

;; html-mode のフックに追加する。
(add-hook html-mode-hook 'my-html-mode-hook-func)

より詳しい.emacs の設定については,
http://d.hatena.ne.jp/whitypig/20100401/1270121901
を参照にして下さい。


これで,html-mode で開いているバッファ内でdabbrevで補完を出すときには,
html-mode, ruby-mode で開かれているバッファを対象としてくれるはずです。
また,css-mode やら,javascrip-modeだっけ? とかも対象にしたいなぁ,
とか,もしくは,c-mode の時に,c++-mode, asm-mode も対象にしたいなぁ
なんていうときにも柔軟に対応できるお。


以上,ついつい,ac-dabbrev.el が生きる道を見つけて,興奮してしまい,
はしょり気味で説明しました。
わからないことあったら,何でも聞いて下さいな。