みずぴー日記

陽気なプログラマが世界を廻す

SKK辞書の闇への対応状況

SKK-JISYO.lispで書いたようにSKKの辞書形式にはいくつかの闇(=歴史的経緯による複雑な仕様)を抱えている。

この闇に対して、SKKの各実装がどう対応をしているかを調べた。

f:id:mzp:20160502100018p:plain

調べた実装

concatへの対応

SKK辞書の書式上、/; を含む変換候補は登録できない。 そのため、L辞書には以下のようにconcatを用いて登録されている。

dosv /(concat "DOS\057V")/  

対応済

concatによるエスケープを理解し、意図した変換結果を出力する。

未対応

変換結果に(concat ".....") がそのままでてしまう。

/や;を含んだ単語の登録

ユーザが/;を含んだ単語を登録した場合もconcatによるエスケープが必要である。

対応済

対応済?

以下のように独自の形式でエスケープを行なう。 単語登録は行なえるが、他のSKK実装とは互換性がない。

dosv /DOS[2f]V"/

未対応

/; をそのまま登録してしまう。単語を登録しても変換できない。

concat以外のEmacsLisp式

SKKの辞書は任意のEmacsLisp式を含めることができる。そのためlisp辞書には以下のようなエントリが登録されている。

time /(current-time-string)/ 

部分対応

pwdなどの一部のエントリには対応していないが、Lisp辞書の大半に対応している。

  • CorvusSKK
  • SKK日本語入力FEP + SKKGate

部分対応 その2

current-time-string、pwd、skk-versionの3つの関数のみに対応している。 CorvusSKK等に比べるとかなり限定的。

未対応

数値エントリ

SKKの辞書は # を含む見出し語を特別扱いする。例えば、以下のエントリは「3かい」や「10かい」とマッチする。

#かい /#1回/#0回/#3回/#2回/ 

変換時、 #<n> は以下のように変換される。

  • #0: 半角数字。(例: 1024)
  • #1: 全角数字。(例: 1024)
  • #2: 漢数字で位取りあり。(例: 一〇二四)
  • #3: 漢数字で位取りなし。(例: 千二十四)
  • #4: 再変換。見出し語中の数字そのものをキーとして辞書を再検索する。*2
  • #5: 大字。(例: 壱阡弐拾四)
  • #8: 桁区切り。(例: 1,234) *3
  • #9: 将棋の棋譜入力用。(例: 8五)

詳細はSKK Manual: 数値変換に記載されている。

対応済

  • CorvusSKK
  • SKK日本語入力FEP + SKKGate

部分対応

  • #0#1#2#3#5#9: AquaSKK, uim-skk
  • #0#1#2#3: fcitx-skk, FlickSKK

未対応

数値エントリの変換に対応していない。

追記

CorvusSKKの対応状況に誤認があったので、修正した。

追記 その2

SKK日本語入力FEP拡張機能のことを認識していなかったので、追記した。

所感

  • Lisp辞書と棋譜変換はSKK辞書の二大闇だと思っていたが、やはり闇っぽかった。 CorvusSKK/SKK日本語入力FEPはすごい。
  • concatへの対応はAquasKK/FlickSKKにいれてもいいかもしれない。

*1:libskkを用いているのでibus-skkも同じ挙動をするはず

*2:正しい挙動を理解していないので、今回は調べていない。

*3:SKK日本語入力FEPが先行実装し、L辞書に取り込まれたらしい。 https://twitter.com/coexe/status/726983576516853762