別解:auto-complete.el の ac-candidates の候補に日本語を含む単語が含まれないようにする

Emacsについて調べていると、なんども同じ人の記事に出会うことがあります。rubikitchさんは言うに及ばず、IMAKADOさんというかたもたくさん記事を書いておいでです。きっと古参の方々にとっては常識なのでしょう。

* * *

さておき、今回は、IMAKADOさんのこの記事です。

auto-complete.el の ac-source-words-in-buffer の候補に日本語を含む単語が含まれないようにする

なかなか便利、と思っていたのですが、ac-sourcesに、ac-source-words-in-same-mode-buffersを加えていると、こっちからは日本語を含む文字列を拾ってくるようでした。

ac-source-words-in-same-mode-buffersは、あとから足された情報源みたいですし、時代の問題でしょうかね。

いちおう、ac-candidate-words-in-bufferのなかで候補をmessageしていって、表示して見たのですが、そもそもIMAKADOさんのadviceに渡される情報源に、日本語が含まれていなかったので、当然と言えば当然ですが、ac-candidate-words-in-bufferと違うタイミングで、ac-source-words-in-same-mode-buffersは仕事をしています(というかlambdaっぽいのでadviceの手が出しにくい?)。

じゃあ、どこがいいかしら、と探してみると、ac-candidatesで

(message "%s" candidates)

してみたら、文字列がupdateされるたびにきちんと日本語を含んだ文字列が来ていました。

というわけで、ほとんど同じなんですが別解です。

(defadvice ac-candidates (after remove-japanese-from-ac-candidates activate)
 "Do not contain multi byte character in auto-complete candidates."
 (let ((contain-japanese (lambda (s) (string-match (rx (category japanese)) s))))
   (setq ad-return-value (remove-if contain-japanese ad-return-value))))

remove-ifのところがエレガントですね。contain-japaneseがlambdaなので、remove-ifでnon-nilが返ったものを逐次listに対して、評価していくれているというわけだと思います。

IMAKADOさんのミソは、ac-source-words-in-bufferのadviceなところですよね。自分の辞書のなかに全角文字があったら、それは補完してほしい、と。今回の解決方法だと、same-mode-bufferやin-bufferだけでなくって、自分で作った情報源の日本語も抑止してしまうので、そこはご注意ください。

自分で作った情報源の日本語は生かしたいけど、same-mode-bufferやin-bufferは抑止したいという場合は、うーん、どうするんでしょうね。

ジャンル: Emacs