(FreeBSD) Emacs+anthy.elのかなキー入力の設定

以前にFreeBSDで(ローマ字でない)かなキー入力の設定をして、たまにjvim+cannaやEmacs+cannaでかな入力をしていたのだが、先月訳あってFreeBSD 7.3を新規にインストールすると、何と7.2まであったcanna-serverがpackagesから無くなっていた。portsを使えば時間はかかってもトラブル無くインストールできるのだろうが、今回はなるべくインストール作業に時間と手間を掛けたくなかったので、この機会にpackagesだけでインストールできるEmacs+anthy.elに完全に乗り換えることにした。

ところが、使ってみるとanthy.elのかな入力モード(anthy-kana-map-mode)のデフォルトの設定は使いづらいことがわかった。特に、全角数字や全角記号を入力する手段が無い(全角のアルファベットは入力できる)のが個人的に支障がある。漢字変換の辞書として登録しようにも、半角記号は漢字変換の対象にならないし、そして全角記号を片っ端からanthy-conf.elのキーマップに登録すると動かなくなってしまったのである。
丁度、GW開始と同時にえげつない風邪をひいて(咳と痰で窒息死するかと思った)未だ蟄居を余儀なくされており、パソコンに向かえるくらいには回復したものの、これより難しいことに取り組めるほど頭が回らないので、この機会に色々調べてanthy.elをカスタマイズしてみた。

(1) X Windowのキーの設定
以前のエントリーに書いたように、X Windowのデフォルトの設定では「ろ」「を」「ー」キー識別に問題があるので、keysymを変更する。
~/.Xmodmapに以下の2行を加える。

keycode 211 = underscore underscore
keycode 19 = 0 bar kana_WA kana_WO

(2) Emacsの設定
後述のキーマップの設定は文字コードがJISでないといけないので、anthy.el関連の設定は.emacs.elとは別のファイルに書くことにした。また、以前のエントリーではシステムのanthy-conf.elのキーマップの設定を書き換えていたが、ここではkeysymの設定をホームディレクトリに置いてるので、これもホームディレクトリに置くことにした。

~/.emacs.elの記述

(load (concat (getenv "HOME") "/.anthy-conf.el"))

~/.anthy-conf.el(文字コード:JIS)

;;anthy.elの設定
(load-library "anthy")
(setq defualt-input-method "japanese-anthy")
;(global-set-key "\C-o" 'anthy-mode)

(anthy-kana-map-mode) ;かなキー入力モード

;;xmodmapの変更に合わせたキーバインド
(anthy-change-hiragana-map "_" "ろ")
(anthy-change-hiragana-map "|" "を")
(anthy-change-hiragana-map "\\" "ー")
(anthy-change-katakana-map "_" "ロ")
(anthy-change-katakana-map "|" "ヲ")
(anthy-change-katakana-map "\\" "ー")

;;Anthyのひらがなモードとカタカナモードのキーマップを同時に設定する関数
(defun anthy-load-bothkana-map (map)
(mapcar (lambda (x)
(let ((key (car x)) (str (cdr x)))
(anthy-change-hiragana-map key str)
(anthy-change-katakana-map key str))) map))

;;日本語でよく使う記号(ワンプッシュにする)
(anthy-load-bothkana-map '(("{" . "「") ("}" . "」") ("?" . "・")))

;;その他全角記号("Q"+キーにする)
;;=”@‘+*は元々Shiftとの組み合わせで出るので省略
(anthy-load-bothkana-map
'(
("Q0" . "0") ("Q1" . "1") ("Q2" . "2") ("Q3" . "3") ("Q4" . "4") ("Q5" . "5") ("Q6" . "6") ("Q7" . "7") ("Q8" . "8") ("Q9" . "9")
("Q-" . "-") ("Q^" . "^") ("Q\"" . "\")
("Q!" . "!") ("Q#" . "#") ("Q$" . "$") ("Q%" . "%") ("Q&" . "&") ("Q'" . "’") ("Q(" . "(") ("Q)" . ")")
("Q~" . "~") ("Q|" . "|")
("Q[" . "[") ("Q]" . "]") ("Q{" . "{") ("Q}" . "}")
("Q;" . ";") ("Q:" . ":")
("Q," . ",") ("Q." . ".") ("Q<" . "<") ("Q>" . ">") ("Q/" . "/") ("Q?" . "?")))

;;カタカナは設定数が多いとダメのようなので、_はひらがなのみ
(anthy-change-hiragana-map "Q_" "_")
;;(anthy-change-katakana-map)をこれ以上実行すると固まる(\C-gで抜けられる)
;;(anthy-change-katakana-map "Q_" "_")

;;かな/カナ/全角アルファベットの切り替えのカスタマイズ
(setq anthy-rkmap-keybind
'(
;; \C-j --> ひらがな <=> カタカナ
(("hiragana" . 10) . "katakana")
(("katakana" . 10) . "hiragana")
(("walphabet" . 10) . "hiragana")
;; \C-p --> ひらがな <=> カタカナ
(("hiragana" . 16) . "katakana")
(("katakana" . 16) . "hiragana")
(("walphabet" . 16) . "hiragana")
;; \C-q --> ひらがな <=> ABC
(("hiragana" . 17) . "walphabet")
(("katakana" . 17) . "walphabet")
(("walphabet" . 17) . "hiragana")
;; H --> ひらがな
(("katakana" . 72) . "hiragana")
(("walphabet" . 72) . "hiragana")
;; K --> カタカナ
(("hiragana" . 75) . "katakana")
(("walphabet" . 75) . "katakana")
;; L --> ABC
(("hiragana" . 76) . "walphabet")
(("katakana" . 76) . "walphabet")
))

コメントにも少し書いているが、anthy-change-katakana-mapを使ってカタカナモードのキーマップにあまり多く登録すると、Anthyの応答が無くてEmacsが固まってしまう。その時にCtrl-Gを押すと、Emacs上にSegmentation faultと表示される。その後も日本語入力ができない訳ではない。謎である。

(5) anthy.elの修正
anthy-9100hのanthy.elは、Emacs23で使うと起動や変換候補一覧表示にやたら時間がかかる、よく知られたバグがある。これはanthy.elを書き換えて直すしかない。
ついでに、anthy.elをロードすると毎回

old-style backquotes detected!

と出て鬱陶しいので、それも修正する。

59c59
< (if (string-match "^22\." emacs-version)
---
> (if (>= emacs-major-version 22)
164,168c165,169
< (` (progn
< (defvar (, var) (, default-value)
< (, (format "%s\n\(buffer local\)" documentation)))
< (make-variable-buffer-local '(, var))
< )))
---
> `(progn
> (defvar ,var ,default-value
> ,(format "%s\n\(buffer local\)" documentation))
> (make-variable-buffer-local ',var)
> ))

これをファイルに保存して
cd /usr/local/share/emacs/site-lisp/anthy
patch anthy.el < (ファイル名)

とすると、修正が反映される。