別解: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