SKK by javascript: メモ

チュートリアルで言及されなかった機能 / SKK.js で実現していない機能

SKK の仕組みは単純だが、実際に作りあげるとなると、意外と細かいルールや、特殊なケースというのがある。チュートリアルをやっていて「こういう場合はどうなるのかな?」と意地悪なことを考える人もいるかもしれないが、たいていの場合にはそういうものは解決されている。

ここでは、チュートリアルで説明されない SKK の機能について、いくつか紹介する。こうした機能は、オリジナルでない SKK クローンには存在しないこともあるので、注意してほしい。

辞書サーバ

SKKはかなり快適に動作する……というが、実はちょっと時間のかかることがある。SKKの辞書ファイルはかなり巨大なので、最初に読み込むのにちょっと時間がかかるのだ。といっても、いっぺん読み込んでしまえばいいので遅いのは最初の1回だけだし、実装によってはそんなに遅くもないのだけれど。

そこで、辞書ファイルを読み込んだサーバをあらかじめ動作させておき、必要に応じて適宜問い合わせるという方式が知られている。これを SKK サーバとか辞書サーバとか呼んだりする。 SKK サーバは独自の簡易なプロトコルを使っていて、ネットワークごしに問い合わせることができる。

余力があれば、そのような設定をしてもいいだろう。辞書サーバによってはいろんな奇妙な機能や特徴をもつものがいっぱいあって、それはそれでなかなか楽しい。

アノテーション

実際の skk では、変換候補に注釈をつけることができる。つまり「走る」と「迸る」のちがいとかね。

アノテーションは変換候補で見ることもできるし、存在するけど見えないように設定を変更できるSKKクローンもある。取扱はさまざまだ。

数値変換

SKK の変換規則はすごく簡単で、開始から終了までの文字列をそのまま1単語とみなす。「Kanji 」なら「かんじ」がキーワードであり、「かん」と「じ」に分ける、といったことをしない。このシンプルさが実はメリットとなりうることは、チュートリアルを終えた皆さんならもうおわかりだろう。

また、プログラムを多少はかじったことのあるという人なら、これをどう実現するかっていうのはすぐわかるはずだ。単純に文字列で一致するものを見つけてくる。それだけなのだ。

それだけなのだが、ときどきそれじゃ上手く行かないことがある。その代表例が数値。「1こ」って変換するのと「2こ」って変換するのとで辞書内にべつべつにあるんだとすると、それはちょっとやってられない。

実際の SKK では、数値を含む場合には、それを使った特殊機能を呼び出す。これが数値変換て呼ばれるものだ。たとえば「1こ」なら「一個」かもしれないし「1戸」かもしれない。

ユーザとして知っておかないといけないのは辞書エントリの読み方。数値があると、それは # という文字で置き換えられる。だから辞書を見ると「#こ」というエントリがあるはずだ。そこには「#1個」とか「#2戸」とか書いてある。

ほかにも4と9があるが用例はまれだから省略しよう。

こういうのを見てもびびらないように、というのと、数値を含んだ変換候補を学習させるときに注意してほしい。いやよく忘れるんですけどね、これ。

ちなみに SKK.js では実装していない。

タブ補完

タブ補完は本来はチュートリアルに含まれているが、 SKK.js で実装していないのではぶいた。だいいちタブはブラウザなどが奪ってしまって JavaScript までキーイベントを運ばないような……いや、それはどうでもいい。

変換文字列を入力している(▽モードの)間でタブキーを押すと、これまでの変換してきた変換候補のなかでいちばん最近の一致するもので補完される。たとえば「佐藤と斎藤では▽さ」とまで入力したところでタブを押すと「▽さいとう」となるはずだ。すぐさまスペースキーを叩けば、手間が省ける。

もう一回タブキーか、「.」を打てば次の補完候補を見ることができる。「,」でひとつ前の補完候補に戻る。

さらに、この変換候補の補完を動的に(つまり勝手に)やってくれるシステムもある。

わたしは滅多に使わないが、常用している人にとっては便利だろう。

自動変換開始 / 終了

SKK には「、」や「。」など、ふつうは単語に含まれないであろう文字が「▽モード」の途中に出てくると、それ以前の部分を変換文字列として勝手に認識し、変換開始してくれるという機能がある。

これは SKK ジャンキーは無意識にやっている(人がいる)機能で、熟練していけばいくほどスペースバーを叩く頻度は落ちていく。

接頭語 / 接尾語変換

SKK では「変換直後」で(あるいは上のように確定キーを押すかわりに)「>」を押すと、接尾辞変換モードとなる。

これは地名なんかで役に立つ。たとえば「塩山市」という地名を入力するとしよう。しかし君の辞書には「えんざんし→塩山市」というエントリーは入っていないという状況を想定してほしい。

このとき、まず「えんざん」と打鍵して「塩山」まで確定したとする。そのあとで「し」から「市」を取り出すのだが、あいにくと「し」に対応する単語は山のようにあるので、発見するのも大変だ。そこで「塩山」確定直後に「>」を打鍵すると、なんと勝手に▽モードに突入し「▽>」という状態に移るはずである。ここで「し」を入力し「▽>し」で変換できるようになる。この変換は、「何かの接尾辞」となる、2つつながりの単語の後のほうの単語ばかりが用意されているエントリーになっていて、たとえば人名なんかもあるから「氏」はあるけれど「私」みたいな単語はない、ということになっている。

同様の接頭語変換というのもある。これは単語の最後に「>」をつけるものだ。たとえば「▽とう>」で変換すれば、そこからはじまる単語の先頭っぽい文字しか候補にでない。

この機能は、 SKK クローンのなかでは実装をされている率がちょっと低い機能であるが、わりと便利だ。

Emacs Lisp 式変換

これは、わたしの知るかぎりオリジナルの SKK でしか実装されていない。と、思う。

SKK の辞書情報は、基本的には辞書に書いてある内容がそのまんまべったりとコピーされるわけだが、そうでない場合がある。もともと SKK は Emacs Lisp という言語で書かれ、 Emacs というエディタ上で動いていた。そこで、辞書のエントリにふつうの文字列じゃなくて「Emacs Lisp のプログラム」を書くと、その実行結果が貼り付けられるというスゴイ機能があるのである。

いちばん身近に感じられる例は now だ。 「/now 」で変換すると「ナウ」みたいなカタカナも出てくるが、なんと現在時刻を示す候補が出てくるはずである。これは Emacs Lisp のプログラムをその場で計算しているのだ。「/today」では日付が出てきたりする。年号の変換なんかもこの機能で実装していて、なかなか強烈ではある。

もしお手元に Emacs があり、 skk が動いているようなら、試してみるといいだろう。

まあただ、なにぶんほかの SKK でこの機能を実現するには Emacs Lisp を自分で再実装しないといけないわけで、さすがにそんなことができるわけもなく、たいていの SKK クローンではこの機能の実現だけは諦めている。ちょっとした事情があり、 scim-skk でも部分的には頑張ったのだが、ぜんぶってのはさすがに無理だ。

あなたの環境で SKK を使うために

SKK はもともと Emacs Lisp で開発されたが、そのオリジナルの SKK の開発は、すでに公式に停止している。

そのオリジナルの SKK をもとに、有志によって開発が継続されているのが、われわれがふだん目にしているいちばんちゃんとした SKK だ。単に「SKK」と呼ぶときは、このことを指すことが多い(開発の停止した版の SKK は「オリジナルSKK」と呼んで区別したりする)。また、こっちは daredevil というコードネームを持っていて、略して ddskk と呼ばれることもある。

Emacs というのはきわめて UNIX-centric なエディタだし、なにせエディタの上でしか動かないのでは使いづらい。そういう事情で、ほかの環境で SKK 風の操作を実現する IME がいろいろと開発されている。

まず Windows では、 SKKIME というソフトウェアが開発されているようである。「ようである」というのは、わたしが Windows 上ではデフォルトの MSIME を使っているというポリシーのない人間だからである(まぁどうせ Windows なんて滅多に使わないから IME が何であっても変わんない)。だから、完成度については何もわからない。御自由に。

MacOSX を使っているなら、 AquaSKK がある。これはなかなか良くできていて完成度が高く、わたしも Mac を使っているときはかならず AquaSKK を常用している。昔はちょっと調子が悪くなることもあったが、最近のヴァージョンではおかしくなることはまずない。

UNIX環境で、 Emacs の外から使う場合にも、いくつかの方法がある。たとえばjvim-skk という、 jvim に加えた拡張もあるが、そういうエディタごとの拡張をのぞくと、 XIM をしゃべる skkinput がある(2.xのページ / 3.xのページ)。個人的には skkinput の動作は安定していないため、常用はあまりオススメしないが……。

ほかにも、 UIM プロジェクトの uim-skk や scim プロジェクトの scim-skk がある。わたしが scim-skk を開発しているので個人的な事情としては scim-skk の方が好きだが(笑)、完成度は正直、どっちもどっちだろう。 uim や scim そのものの利用法や環境のセットアップについては、ほかのドキュメントをあたってほしい。 XIM (skkinput)ほどの苦労や不調には悩まされないはずである(とくに gtk や qt なアプリケーションを使っているかぎりは)。

最後に iiimf という XIM を置き換えるプロトコルも提唱されていて、これの上で動く iiimf-skk という実装もあるらしいのだが、これもわたしは使ったことがないので詳しい言及は避ける。

Coptyright (C) Jun Mukai