Walrus,Visit. | 一覧 | 検索 | 更新履歴(RSS) | 新規作成
はてなブックマークに追加 はてなブックマークを表示 編集 | 編集(管理者用) | 差分

Linuxザウルス開発メモ/IMKit-uim

編集

uimを使って多種のIMをLinuxザウルスに導入。

ページ作成: ヤマケン
Page Created: YamaKen <yamaken at bp.iij4u.or.jp>

関連ページ

編集

関連情報

概要

uimという新しい入力システムを使ったIM。

uimSchemeで書かれたIMモジュールを 多くの環境(gtk-immodule, emacs, vi, その他諸々)で共用する事を目的の1つとしており、 IMKitをこれに対応させる事で多くのIM(Anthy, SKK, Canna等)をLinuxザウルスで利用できるようになります。 興味のある方は公開MLに参加される事をおすすめします。

将来的にはIMKit-Anthyを置き換える事になります。

開発状況

インストール手順

ベース

  • 以前のバージョンで必要だったgconv関係のパッケージは不要になっています

変換エンジン毎

  • 変換エンジンとしてSKKを使いたい場合
    • SKK Openlab辞書のページから好きな辞書をダウンロードし、/opt/Qtopia/share/skk/SKK-JISYO.L のようにインストールする。SKK-JISYO.L以外の辞書をインストールした場合は、~/.uim に以下のような記述を追加する
(define skk-dic-file-name "/opt/Qtopia/share/skk/SKK-JISYO.ML")
    • 個人辞書は ~/.skk-uim-jisyo としてインストールする。(現時点の実装では)利用頻度順のソートが崩れたりするので他の環境向けとの共用はおすすめできない。バックアップ推奨
    • 各種辞書をipkとしてパッケージにまとめて下さる方募集中。ipkが揃ったらuim-skk側で複数辞書を扱えるように拡張してみたいと思います
  • 変換エンジンとしてPRIMEを使いたい場合
    • Linuxザウルス向けのPRIMEパッケージさえ作ってインストールすれば一応動作するはずです。有志募集中
  • 変換エンジンとしてCannaを使いたい場合
    • どなたかLinuxザウルス向けのバイナリを作って頂けるならIMKit-uim側でCannaに対応するようにします。有志募集中
      • 難しさとかよくわかってないのですが、こちらにあるバイナリではいかんのでしょうか? -- Oh!石
      • その後いろいろ修正が入っている3.7がリリースされているので、そちらが欲しいですね。それとCannaは辞書がいろいろあるんですが、どれがいいのかよくわかっていなかったりします。 -- ヤマケン

その他

カスタマイズ

付属ドキュメント

  • README-0.4.0.txt
    • IMKit 0.4.0に付属しているREADMEです
    • QCopによる操作とIMKit.confによる設定変更について解説されています

設定ファイル

  • ~/.uim というファイルを作り、そこに設定を追加する事でキーバインドや見た目の変更が可能です
  • /opt/Qtopia/share/uim/*.scm の各ファイル先頭近くで定義されている変数を ~/.uim で上書きしてカスタマイズして下さい
  • ~/.uim を作成する場合は、以下の内容を最初の行に書いて下さい
(require "default.scm")

メニューに登録するIMの取捨選択

  • /opt/Qtopia/share/uim/loader.scm というファイル内にどのIMを利用するかが書かれています
  • 以下のように行頭に";"を挿入してコメントアウトする事で不要なIMを外す事ができます
;;
;(require "PY.scm")
(require "tcode.scm")
(require "anthy.scm")
;(require "prime.scm")
;(require "canna.scm")
(require "tutcode.scm")
(require "skk.scm")
;(require "viqr.scm")
;(require "hangul.scm")
;(require "ipa.scm")
;(require "spellcheck.scm")

キーバインド

  • 以下のようなS式を ~/.uim に記述する事によって各種動作のキーバインドを変更できます。詳細はuim付属ドキュメントを見て下さい
(define-key anthy-commit-as-opposite-kana-key? "q")
(define-key anthy-latin-key? '("<Control>l" "<Control>L"))
  • uim-anthyのキーバインドは以下のようになっています
→        カーソルを前方に移動
Ctrl + f  〃
←        カーソルを後方に移動
Ctrl + b  〃
Ctrl + a  カーソルを行頭に移動
Ctrl + e  カーソルを行末に移動

Ctrl + k  カーソル以降を削除
Ctrl + d  カーソル直後の一字を削除
Backspace カーソル直前の一字を削除
Ctrl + h  〃

Shift + ←  文節を縮める
Ctrl  + i   〃
Shift + →  文節を伸ばす
Ctrl  + o   〃

↓         候補選択
Ctrl + n   〃
↑         候補選択(逆方向)
Ctrl + p   〃

SPACE     変換
SELECT    〃

Return    確定
Ctrl + m  〃
Ctrl + j  〃

Shift + SELECT  操作キャンセル
Ctrl  + g       〃

Ctrl + j  ひらがな入力モード
(ひらがな入力モードで) q  カタカナ入力モード
(ひらがな入力モードで) Ctrl + q  半角カタカナ入力モード
(ひらがな入力モードで) l  半角英数入力モード
(ひらがな入力モードで) L  全角英数入力モード
(かな入力モードで)    Q  現在のひらがな/カタカナと逆のモードで確定


スタイラスによる操作は以下のものがサポートされています

入力モードインジケータをタップ   入力モード選択
候補ウィンドウ上の候補をタップ   候補を選択

動作確認状況

全般

  • Qtopia 1.5でキー入力中にバックライトがOFFにならないか
    • SL-5500 ROM 3.10ではOK -- ヤマケン
    • SL-C760 OK -- てすり
  • Qtopia 1.6でキー入力中にバックライトがOFFにならないか
    • SL-C750(Qtopia 1.7.0)ではOK -- hal
  • IMKit-uimでザウルス固有のキーを利用できるか
    • SL-5500 ROM 3.10でOK -- ヤマケン
  • QCopを使った入力文字種切り換えが実機で動作するか
    • C760, SKK にて HIRAGANA, KATAKANA, ALPHA, WALPHA の動作を確認 -- さきら
  • Qtopia 1.5 での起動状態と loader.scm -- さきら
    • インストール直後状態のloader.scmでqpe起動失敗を繰り返す (Anthy_5003では未確認 -- さきら)
    • (require "anthy.scm") 以外をコメントアウトすると起動成功
    • anthy と skk 以外のみをコメントアウトすると qpe 起動失敗を繰り返す (Anthy_5003では起動成功 -- さきら)
    • PY, tcode, anthy, tutcode, skk, ipa 以外のみをコメントアウトすると起動成功

uim-anthy

  • (Qtopia 1.5) SL-C760シャープ純正ROM環境での動作確認
    • uim-Anthyで候補一覧ウインドウが表示されると、Enterで確定できない
      • この状態では一度IMをOFF/ONして次のキー入力をしないと確定文字が送られません - ayati
      • pre9で正常動作を確認しました - ayati
    • IMKit-Anthyだと未確定文字でEnterすれば確定して送られますが、uim-Anthyだと変換操作(SPACEを押す)をしないと送ることができません - ayati
      • SL-5500 + ROM 3.10で発生する事を確認 -- ヤマケン
      • zaurus.scm をロードしないようにしたら解決した
      • PC上のQtopia 1.5.0及び1.7.0では問題なし -- ヤマケン
      • SL-C750 + 1.7.0でも発生することを確認 -- hal
      • pre9で正常動作を確認しました - ayati
  • 全角の"〜"を入力すると"□"(トウフ)が表示される
    • SL-5500 + ROM 3.10 + naga10フォントではIMKit-Anthyは"〜"、uim-anthyは"□"になった -- ヤマケン

uim-skk

  • 変換中(▼モード)にEnterを押すとキャンセル操作扱いになる
    • SL-5500 + ROM 3.10で発生する事を確認 -- ヤマケン
      • zaurus.scm をロードしないようにしたら解決した
    • PC上のQtopia 1.5.0及び1.7.0では問題なし -- ヤマケン
  • 変換中(▼モード)にFnを押すと通常のキー入力扱いになって変換中の単語が確定してしまう
    • SL-5500 + ROM 3.10で発生する事を確認 -- ヤマケン
      • zaurus.scm をロードしていない状態でも発生する(「問題無し」は確認ミス)
  • KeyHelper? でキーリピート開始時間を短かめに設定していると、文字列確定で押したキーにキーリピートがかかって2回押した状態になる。
    • KeyHelper? 側の delay 300 ms で発生。500ms だと発生せず。 -- てすり

キー入力の不審な挙動

  • SPACEが横取りされているらしく、カレンダーなどでSPACEでチェックボックスが操作できる場面で、直接入力モードにもかかわらず操作できません -- Oh!石
    • IMKit-Anthyの方ではどうでしょうか -- ヤマケン
    • 同じですね。みんなキーボードオンリーの操作ってやらんのかな?いちいちペンを取り出すのは面倒だろうに… -- Oh!石
  • 原因と対策
    • SPACE横取り問題は原因が分かりました。uimでキーを離した時のイベントを横取りしてしまっていたためです。以下の対策でuim-anthyの症状が収まるはずです(バグ付きだったので削除)
    • 。Enter無限リピート問題にも変化があるかもしれないので確認をお願いします -- ヤマケン

      • うーん、変化ないです。uim-anthyオン状態でターミナルなんかはちゃんとスペースが入りますが、やっぱりチェックボックスには入力が行かないですねぇ。まさか、SPACEとは違うコードが使われているとか…? -- Oh!石
      • すいません、その後バグを発見して手元で修正しました。直接入力モードの時はSPACEはもちろん、他のキーも問題なく通るようになっています。近いうちに新版のパッケージ一式を出すのでそれで確認してみて下さい
      • 新版でも変化ないです。でも何かすると通るような気がするな…といろいろいじっていたら、なんとデフォルトにはないCtrl-lを入力した後は再起動しない限り二度とuim-Anthyでの日本語入力ができなくなるようです(あらゆるモードでも直接入力のみになる)。Ctrl-l自体は私の勘違いなのですが、まだ何か隠れているということでしょうか? -- Oh!石
  • IMの一覧からEnterで例えばuim-Anthyを選択すると、Enter無限リピート状態になる(Qtopia 1.5) - ayati
    • 今のところ、IMKit-Anthyでは出ていません
      • IMKit-Anthyでも現象再現しました。KeyHelper?との併用で起こるようです - ayati
    • c700+スペシャルカーネルで発病します。発病しないこともあり、発病条件はよく分かっていません。 - まゆら
    • uim-Anthy に限らず、uim-skk、uim-tcode でも同様に発生しています。手元で確認できる限り再起動後、一度も uimを動かしていない時にエンターで選択すると、確実に再現できます。 IM を off にして縦横を切替えると収まります。 - てすり
      • KeyHelperapplet?をdisableにすると現象が出なくなりました。Linuxザウルス/LUSScreenSaverの2/5のコメントで類似の現象が話題になっていて気づきました - ayati
      • pre9で正常動作を確認しました - ayati

スクリーンショット

TODO

不具合の修正

  • KeyHelper?との連携動作時に電源OFFキーが効かない事がある
2004-03-30 (Tue) 21:24:43 てすり : 電源OFF がきかない状態になったら、何度電源ボタンを押しても効きません。KeyHelper? は有効な状態です。手書入力等に切替えてから IMkit に戻したときには、電源OFFは有効になっています。
  • Qtopia 1.5でIMKitを使った複数のIMが登録されている状態でqpeを終了すると2つ目のIM終了時にSEGVが発生する。それぞれのIMを単体で動作させた場合には発生せず、IMKit-uim-*だけを複数登録している状態でも発生しない
    • 環境により再現しないこともあるので0.4.0での解決は見送り

機能追加等

  • PRIME対応
    • ある程度使えるところまで対応したが、まだ問題が多く残っているので0.4.0での正式対応は見送り

uim本体への変更を含む調整

  • 直接入力モード以外でもキーによるGUI操作ができるように(SPACEでチェックボックス操作等)

iconv

KeyHelper?との連携

KeyHelper?との連携機能

  • KeyHelper?はIMがアクティブな状態の時はキー入力を奪わないようになっている
  • IMが非アクティブな状態になった瞬間に再度QWSServer::setKeyboardFilter?()を使ってKeyHelper?がキー入力を奪う
  • IMKitはKeyHelper?との連携機能を持っており、QWSServer→IMKit→KeyHelper?→IMKitという流れでキー入力を受け渡す
  • QWSServer→KeyHelper?→IMKitという流れにせずまずIMKitがキー入力を受けるようにしているのはQtopia 1.6以降で実現されているソフトウェアキーボード(Qtopia 1.5までのIMと同等)と変換エンジン(Qtopia 1.6以降でのIMKitは変換エンジンとして動作)の分離との絡みでキー入力はIMKitが最初に受けるようになっていて欲しいため
  • 連携時の動作を追いやすくするため、log出力を増やしたIMKit 0.4.5をリリースした。logが増えた以外の動作は変更なし

問題 (解決済)

  • IMKit 0.4.5 + KeyHelper? 1.1.5では以下のような問題が発生する
    • 2004/05/01 KeyHelper? 1.1.6のリリースにより解決済
    • IMKitを使ったIMがアクティブな状態で他のIMKit使用IMへ切り換えると、KeyHelper?がQWSServerからのキー入力を奪ってしまう
QWSServer→KeyHelper→IMKit
  • この場合でもQtopia 1.5ではユーザから見ると結果的に正常な動作となるが、Qtopia 1.6以降で動作させた場合との整合性を考えて以下のような流れになるようにしておいた方が望ましい
QWSServer→IMKit→KeyHelper→IMKit
  • また、原理的にはIMKitに限らずsetKeyboardFilter?()を行うIM同士で切り換えを行うとIMがキー入力を握れない状態になるはずなのでKeyHelper?側で対処しておく事が望ましい

uim-skkアクティブ→非アクティブ (問題なし)

  • 動作中のlog (IMKit 0.4.5 + KeyHelper? 1.1.5)
[IMWidget][][4][(null)]
QWSKeyBypassIn::on_deactivate() setKeyboardFilter(NULL)
KeyHelperForwarder::on_deactivate() send unhook() to KeyHelper
[unnamed][][40][(null)]
KeyHelperWidget::set()
  • IMKitがsetKeyboardFilter?(NULL)した後にKeyHelper?がsetKeyboardFilter?(this)するので、IM非アクティブ状態でKeyHelper?が再度有効になる。この動作には問題ない

uim-skkアクティブ→uim-anthyに切り換え (問題あり)

  • 動作中のlog (IMKit 0.4.5 + KeyHelper? 1.1.5)
[IMWidget][][4][(null)]
QWSKeyBypassIn::on_deactivate() setKeyboardFilter(NULL)
KeyHelperForwarder::on_deactivate() send unhook() to KeyHelper
[IMWidget][][10][(null)]
QWSKeyBypassIn::on_activate() setKeyboardFilter(this)
KeyHelperForwarder::on_activate() send hook() to KeyHelper
[IMWidget][][8][(null)]
[IMWidget][][40][(null)]
[IMWidget][][10][(null)]
KeyHelperWidget::set()
    • IMKit(uim-skk)がsetKeyboardFilter?(NULL)した直後にIMKit(uim-anthy)によってsetKeyboardFilter?(this)され、その後からKeyHelper?がsetKeyboardFilter?(this)するので、KeyHelper?がキー入力を握ってしまう
      • この場合のキー入力の流れ
QWSServer→KeyHelper→IMKit
    • 本来はIMKit(uim-skk)がsetKeyboardFilter?(NULL)した直後にKeyHelper?のsetKeyboardFilter?(this)が来て、その後IMKit(uim-anthy)のsetKeyboardFilter?(this)が来るのが正しい
      • 本来のキー入力の流れ
QWSServer→IMKit→KeyHelper→IMKit
    • 原理的にはIMKitに限らずsetKeyboardFilter?()を行うIM同士で切り換えを行うとIMがキー入力を握れない状態になるはず

uim-skkアクティブ→uim-anthyに切り換え (patchその1適用済、問題あり)

  • 動作中のlog (IMKit 0.4.5 + KeyHelper? 1.1.5 + patchその1)
KeyHelperWidget::set()
[IMWidget][][4][(null)]
QWSKeyBypassIn::on_deactivate() setKeyboardFilter(NULL)
KeyHelperForwarder::on_deactivate() send unhook() to KeyHelper
[IMWidget][][10][(null)]
QWSKeyBypassIn::on_activate() setKeyboardFilter(this)
KeyHelperForwarder::on_activate() send hook() to KeyHelper
[IMWidget][][8][(null)]
[IMWidget][][40][(null)]
[IMWidget][][10][(null)]
    • KeyHelperWidget?::set()のタイミングを変更する事で、IMがアクティブな状態で切り換えを行っても以下のようなキー入力の流れが保持できるようになった
QWSServer→IMKit→KeyHelper→IMKit
  • ただし、単純にIMを非アクティブにした場合は、KeyHelper?が入力を握れなくなっていた
KeyHelperWidget::set()
[IMWidget][][4][(null)]
QWSKeyBypassIn::on_deactivate() setKeyboardFilter(NULL)
KeyHelperForwarder::on_deactivate() send unhook() to KeyHelper
[unnamed][][40][(null)]

uim-skkアクティブ→uim-anthyに切り換え (patchその2で解決済)

  • 動作中のlog (IMKit 0.4.5 + KeyHelper? 1.1.5 + patchその2)
[IMWidget][][4][(null)]
QWSKeyBypassIn::on_deactivate() setKeyboardFilter(NULL)
KeyHelperForwarder::on_deactivate() send unhook() to KeyHelper
[IMWidget][][10][(null)]
QWSKeyBypassIn::on_activate() setKeyboardFilter(this)
KeyHelperForwarder::on_activate() send hook() to KeyHelper
[IMWidget][][8][(null)]
[IMWidget][][40][(null)]
[IMWidget][][10][(null)]
    • IMKit(uim-skk)がsetKeyboardFilter?(NULL)した直後にIMKit(uim-anthy)によってsetKeyboardFilter?(this)され、その後からKeyHelper?がsetKeyboardFilter?(this)するチャンスを得るが、キーボードフィルタ使用アプリ(IMKit)が既にアクティブになっていることを検知してノーリアクションとする
  • 単純にIMを非アクティブにした場合は、今までと同様のタイミングでKeyHelper?が入力を握る
[IMWidget][][4][(null)]
QWSKeyBypassIn::on_deactivate() setKeyboardFilter(NULL)
KeyHelperForwarder::on_deactivate() send unhook() to KeyHelper
[unnamed][][40][(null)]
KeyHelperWidget::set()

今後の課題

wanted

動作報告

  • 正常動作、不具合などなんでも

パッケージ作成

  • 各種SKK辞書
    • 各種SKK辞書をipkとしてパッケージにまとめて下さる方募集中。ipkが揃ったらuim-skk側で複数辞書を扱えるように拡張してみたいと思います
  • Linuxザウルス向けPRIMEパッケージ
    • Linuxザウルス向けのPRIMEパッケージさえ作ってインストールすればuim-primeが一応動作するはずです
  • Linuxザウルス向けCannaパッケージ
    • どなたかLinuxザウルス向けのバイナリを作って頂けるならIMKit-uim側でCannaに対応するようにします

コメント


お名前: コメント: 更新

2004-02-05 (Thu) 10:11:52 Linuxザウルス/LUSScreenSaver? [龍] : 仕事中だけど、ちょっと追加。「開発日記」の方にあった「キーリピート」ですが、かなり確実に発生してます。Zeditorを起動した状態でセーバ起動して、パスワード入力した後、OKボタンではなく、enterキーで復帰すると、Zeditor上で改行し続けてくれます。(^^;;