jde-mode と dabbrev と auto-complete-mode と。

だうもだうも。
一晩寝かせてから,何気に .emacs 眺めてたらなんかいい感じに出来たっぽいので。


いや,ac-sources に ac-source-dabbrev を指定すると,
非力なパソせいかもっさりするので,やめたんですが,
dabbrev-my-ignored-case でファイル名を設定してやると,
そこまでもっさりしないかもー。
dabbrev-my-ignored-case とか,(defadvice dabbrev-my-ignored-case...) とかは,
ずいぶん昔にどこかから拾ってきたものだと思うんだけども,
それらを眺めていたら思いついたとさ。出来る人達にとっては当たり前なのか?!
ま,いいや。
exclude の方の正規表現は自信ないっす。

(setq dabbrev-my-ignored-case
      '(
        ;; buffer-name include exclude
        ;; (例) バッファ名に scratch という文字を含んでいれば
        ;; texi をバッファ名に含むバッファのみを補完対象とし,
        ;; navi2ch や gnus をバッファ名に含むバッファは補完対象としない
        ;; ("scratch" ("texi") ("navi2ch" "gnus"))
       ;; ...
        ("\\.java$" ("\\.java$") ("\\.[^j][^a][^v][^a]$"))  ;; for java <-- この行追加。
       ;; ... 
        ))


んでもってね,あとは auto-complete-mode の設定。
こんな関数を用意してみました。

;;; function to be called in jde-mode when auto-complete-mode is enabled
(defun my-ac-jde-mode-hook-func ()
  "Function to be called in jde-mode when auto-complete-mode is enabled."
  (make-local-variable 'ac-sources)
  (setq ac-sources '(ac-source-gtags
                     ac-source-dabbrev
                     ac-source-abbrev
                     ac-source-words-in-buffer)))

(when (require 'auto-complete nil t)
  (require 'auto-complete-gtags)
  (require 'auto-complete-etags)
  (require 'ac-dabbrev) ;; <-- これを追加っす。
  ;; もろもろの設定があって・・・。
  ;;↓は,色,フェイスっていうんだっけ?の設定ね。
  (custom-set-faces '(ac-menu-face ((t (:background "slate gray" :foreground "white"))))
                    '(ac-selection-face ((t (:background "blue" :foreground "white"))))
                    '(ac-gtags-selection-face ((t (:background "sienna4" :foreground "white"))))
                    '(ac-gtags-candidate-face ((t (:background "slate gray" :foreground "white"))))
                    '(ac-dabbrev-menu-face ((t (:background "slate gray" :foreground "white"))))
                    '(ac-dabbrev-selection-face ((t (:background "muleblue" :foreground "white")))))
  (add-hook 'jde-mode-hook 'my-ac-jde-mode-hook-func) ;; <-- これを追加っす。
  )


とりあえず以上でいけているっぽい。
どっかに穴がありそうだが,あったらあったら修正すればいいさー。

あー,忘れてた,ac-dabbrev.el は,以下から。
http://www.emacswiki.org/emacs/AutoCompleteSources


というわけで,auto-complete.el とか ac-dabbrev.el などの
中の人ありがとう!
というかというか,eclipse 使ってない・・・。
Meadow でもがいています。


※2009/08/12 (Wed) 21:02 追記
下記を .emacs なりに追加しとかないと有効にならないね。

(setq ac-modes (append ac-modes '(jde-mode)))
(add-hook 'jde-entering-java-buffer-hook 'my-ac-jde-mode-hook-func)

append でいいのかな?


※2009/08/12 (Wed) 23:35 さらに追記
やっぱり正規表現が間違っていたね。
以前も同じ間違いをした記憶があるぞぉ。
というわけでメモメモ。

"abcd" でない4文字の文字列にマッチする正規表現
  • "ab" でない2文字にマッチする正規表現
    • 1文字目が a でない場合は,2文字目はなんでもオッケー。
    • 1文字目が a の場合は,2文字目が b 以外ならなんでもオッケー。

以上より,次のようになる。
([^a].|a[^b])
んで,これを X とする。

以下同様に考えると・・・。

(X.|ab[^c]) <= これを Y とする

(Y.|abc[^d])


以上をもとにもどしていく。
(Y.|abc[^d])
=> ((X.|ab[^c]).|abc[^d])
=> ((([^a].|a[^b]).|ab[^c]).|abc[^d])
となる。


よって java 以外の4文字の文字列にマッチする正規表現は,
((([^j].|j[^a]).|ja[^v]).|jav[^a])
となる。


けど,これじゃだめじゃね?
3文字とか,2文字とかに対応できないし,
拡張子がない場合はどうするよ?
.java 以外を指定したいんだよね?
うーん,ごっちゃになってきたので,今日はここまで。


とりあえず,dabbrev-my-ignored-case を修正しときますか。

("\\.java$" ("\\.java$") ("\\.\\(\\(\\([^j].\\|j[^a]\\).\\|ja[^v]\\).\\|jav[^a]\\)$"))    ; for java