僕は、SKK系列のインプットメソッドが好きだ1。EmacsユーザーでありmacOSユーザーだから、EmacsではDaredevil SKK、それ以外ではAquaSKKを使用している2。しかし各SKKで正しく辞書を設定できていなかった。そこで今回は、各SKKの設定を見直し、入力や変換の挙動を改善する事にした。
背景と前提
日本語の入力方法に何を使うのかという問題は、日本語の文章を書いていると必ず付いて回る。以前はそのように言われていた。ただ現状の状況をいろいろと考えて見ると、初期状態で日本語を入力できないシステムに触れる機会は殆どないし、そのような機会は特殊な環境だろう。今や日本語を入力する方法に悩むなんて事は今は殆どないが、それでも文章を書いたりしていると、入力方法を変更したり工夫したくなる。 入力を漢字や絵文字に変換する時の精度などに差があるからだ。
これらの入力方法は一般的にIM3やIME4と呼ばれる。ここではインプットメソッドに統一する。また、僕は日本語を使うので、この記事では日本語用のインプットメソッドのみを考える事にする。
世の中には多くのインプットメソッドが存在する。例えばmacOSには日本語入力プログラムが、WindowsにはMicrosoft IMEが標準で提供されている。サードパーティが開発しているプログラムもあり、Google 日本語入力(mozc)、ATOK、Simejiあたりが有名だろう。Anthyというものもあったが、これは開発を停止してしまったようだ。
これらインプットメソッドの仲間に、SKKというものがあった。変換の区切りを使用者が明示的に指定する事で、好きな所で変換できるという点が特徴であった。そのため、形態素解析を行わないし、実装もとてもシンプルだ。区切り位置をシフトキーを使って明示的に指定するため、独特の操作性となり慣れるとSKK系列のインプットメソッドしか使えなくなる。初期のSKKはEmacsのためにEmacs Lispで実装されていたが、他の環境でも使えるように様々な環境に移植された。macOSで使えるようにしたSKKとして、AquaSKKがある。SKK自体は開発停止してしまったが、Daredevil SKKが後継として開発を継続している。
僕はEmacsユーザーでありmacOSユーザーだから、EmacsではDaredevil SKK、それ以外ではAquaSKKを使用している。それらで使用する辞書は同じにすべきだし、そうしているはずだった。辞書データを確認すると、いくつかのディレクトリに同じような辞書データがあり、どれを参照しているのか分からない状況になっていた。そこでDaredevil SKKとAquaSKKでどの辞書データを参照しているのかを調べる事にした。
Daredevil SKK
Emacsの初期化時に行っている設定の内、Daredevil SKKに関係する所を抜粋した。
(with-eval-after-load 'skk
;; SKKモードに切り替わってもモードラインを表示しない
(add-hook 'skk-mode-hook 'disable-mode-line)
(setq-default mode-line-format nil)
(setq-default skk-modeline-input-mode nil)
;; 絶対にモードラインを表示させたくないため
;; モードラインの設定関数を上書きする。
(defun skk-setup-modeline () nil)
;; SKKの候補の表示方法
(setq skk-show-tooltip nil)
(setq skk-show-inline 'vertical)
(setq skk-egg-like-newline nil)
(setq skk-dcomp-activate t)
(setq skk-dcomp-multiple-activate t)
(setq skk-henkan-strict-okuri-precedence t)
;; カーソルの色を変更する
(setq-default skk-cursor-latin-color "turquoise")
(setq-default skk-cursor-hiragana-color "orange")
(setq-default skk-cursor-katakana-color "systemGreenColor")
(setq skk-show-mode-show t)
(setq skk-show-mode-style "tooltip")
(defun skk-isearch-setup-maybe ()
(require 'skk-vars)
(when (or (eq skk-isearch-mode-enable 'always)
(and (boundp 'skk-mode)
skk-mode
skk-isearch-mode-enable))
(skk-isearch-mode-setup)))
(defun skk-isearch-cleanup-maybe ()
(require 'skk-vars)
(when (and (featurep 'skk-isearch)
skk-isearch-mode-enable)
(skk-isearch-mode-cleanup)))
(add-hook 'isearch-mode-hook #'skk-isearch-setup-maybe)
(add-hook 'isearch-mode-end-hook #'skk-isearch-cleanup-maybe)
)
;; 学習
(require 'skk-study)
;; 辞書の設定
(setq skk-user-directory "/opt/ng/symdon/dict")
(setq skk-extra-jisyo-file-list
'("/opt/ng/symdon/dict/SKK-JISYO.L"))
この内、Daredevil SKKの辞書の設定は skk-user-directory
と skk-extra-jisyo-file-list
の2箇所になる
(setq skk-user-directory "/opt/ng/symdon/dict")
(setq skk-extra-jisyo-file-list
'("/opt/ng/symdon/dict/SKK-JISYO.L"))
/opt/ng/symdon/dict
配下には辞書があり、 /opt/ng/symdon/dict/SKK-JISYO.L
も存在し、確かに辞書データだった。ただし、辞書データはgitignoreで指定されており、バージョン管理からは外れていた。また暗号化されていなかった。
設定ファイル
SKKの初期設定を記述するファイル名を指定する。SKKを起動した時、一度だけ読み込まれる。=M-x skk-restart= によって、この設定を再度読み込ませる事ができる。
~/.emacs.d/init.el
に設定を記述する事も可能ではあるが、その場合 M-x skk-restart
によって設定をファイルから再度読み込まれる事はない。
辞書の設定
- skk-kakutei-jisyo
- 「確定変換」で検索する辞書
- skk-initial-search-jisyo
- 個人辞書の検索の前に検索する辞書
- skk-large-jisyo
- 個人辞書の検索の後に検索する辞書
- skk-aux-large-jisyo
- *辞書サーバが使えない時に、代わりに検索する辞書
- skk-extra-jisyo-file-list
- *メイン辞書の他に検索する辞書のリストを指定する。
- skk-itaiji-jisyo
- 異体字辞書 `SKK-JISYO.itaiji', `SKK-JISYO.itaiji.JIS3_4' へのパスを指定する。
他の設定
- skk-search-prog-list
- *検索関数、検索対象の辞書を決定するためのリスト。
- skk-inhibit-ja-dic-search
- GNU Emacs標準の辞書の検索を禁止する。
AquaSKK
AquaSKKは、設定のためのダイアログを提供しており、そのGUIを用いて設定を変更する。ここで設定した値は ~/Library/Application Support/AquaSKK
に plist
形式で保存される5。例えば、辞書の設定は DictionarySet.plist
というファイルに保存されている。
ユーザー辞書の在処
/opt/ng/dict/user-jsjo
を指定していたが、確認した所この場所には何も無かったし /opt/ng/dict
ディレクトリも作っていなかった。その代わりに /opt/ng/dic
というディレクトリはあり、そこに幾つかの辞書が格納されていた。このディレクトリはバージョン管理されており、GitHubのプライベートリポジトリにホスティングしていた。
現状の設定の状況のまとめ
Daredevil SKKは /opt/ng/symdon/dict
にある辞書を使用するが、このディレクトリにある辞書はバージョン管理しておらず、暗号化もしていなかった。
AquaSKKは正しく設定されておらず、 /opt/ng/dict
という場所にユーザー辞書を設置しようとしているようだったが、ディレクトリもないため適切に使われていなかった。
/opt/ng/dic
に辞書データがあり、GitHubのプライベートリポジトリにホスティングしていた。ただし、この辞書データはどこからも使われておらず、ただそこに存在するだけだった。