Kenichi Handa
handa****@m17n*****
2006年 9月 14日 (木) 21:34:40 JST
以下の件、返事遅れてすいません。一応現在最後に付けたような新 規 API が使えるようになりました。 CVS commit してあります。 > > ところで、ユーザごとの customization データをどこから読んでそ > > れをいつ minput_assign_command_keys によって反映させるかは、 > > 今のところ全く appliction (というか UIM/SICM 等の IM module) > > に任せっきりなんですが、 m17n-lib の方でその方法を固定して、 > > IM module には minput_load_config(), minput_save_config() な > > どの API を提供する方が便利かなとも思い、今それをどうやるか模 > > 索しています。そうすると uim-pref でやった customize をSCIM > > 経由で使う m17n-lib に反映することができるようにもなります > > (逆も)。 > > それが良いと思います。ただし、将来のuimが扱う予定の特殊なキー操 > 作、例えばgとhの同時押し等については、uim側で追加設定を保存する > 事になると思います。 うーん、でも uimのみに有効な設定の保存と一般に有効な設定の保 存をどう区別するんでしょうか?例えば前者は uim が独自にやり、 後者は minput_save_config でやるとしても、uim は 追加設定した 部分のみもとに戻してから minput_save_config を呼び、その後で また追加設定をやり直すという、結構面倒な処理が必要になるんじゃ ないでしょうか? > > minput_load_config なんていらなくて input method > > を open したら自動的に customization 反映されるようにした方が > > より簡単かもしれません。ここいらに関して何か御意見ありません > > でしょうか? > > 初回の読み込みは自動でやった方が嬉しいと思いますが、それとは別に > 明示的なload_config()も欲しいです。別プロセスがセーブした設定を > 反映させたい場合があるので。 その場合、それまでに設定していた command や variable はどう いう状態になって欲しいのでしょう? ちなみにユーザがある IM を使用中にその IM を reload できる機 能を作りつつあります。IM のデバッグ中には便利な機能なんです が、これで configulation も reload するようにしようかと思っ ています。 > save_config()の方はIMのclose時に暗黙に呼び出したりせず、明示的な > 実行のみとして欲しいです。 これはそうする予定です。ただ、 > これはキーバインドを全てuim側に吸い出 > して設定し、m17n-lib側のキーバインドを無効にする形態での利用を可 > 能にするためです。 これがよく分からないのですが、m17n-lib側のキーバインドには minput_save_config でセーブされたものも入っているのですか? > それから将来的な要望ですが、以下のようなコマンド定義中の > "Convert"や"Convert Hiragana to Kanji"といったテキストはgettext > を使って翻訳できるようになると嬉しいです。 こういう文字列は m17n-lib がロードするデータ中に現れるわけで すから、 m17n-lib の input method loader がこれは翻訳対象とな る文字列(というか M-text)と判断すれば、その部分に対して明示 的に gettext 関数を呼べば良いだけなんですが、問題は xgettext などで po ファイルの元を作るのに、単に -L lisp では何も翻訳対 象だとされないし -a を付けると今度は全ての文字列が翻訳対象に なったりでうまくいかないのです。考えられる方法は例えば unicode.mim とかは以下のように書くことです。 (input-method t unicode) (description "Input method for Unicode BMP characters using hexadigits. Type C-u followed by four hexadecimal numbers [0-9A-Fa-f] of a Unicode character code. ") (variable (prompt (description "Preedit prompt Prompt string shown in the preedit area while typing hexadecimal numbers.") "U+")) (command (start (description "Start Unicode Start typing hexadecimal numbers of Unicode character.") (C-U))) これまでと違うのはコマンド名の後にいきなり文字列を書かないで トップレベルと同じように (description "...") という FORM を使 うことです。これで xgettext -L lisp -kdescription unicode.mim とやると、 #: unicode.mim:26 msgid "" "Input method for Unicode BMP characters using hexadigits.\n" "Type C-u followed by four hexadecimal numbers [0-9A-Fa-f]\n" "of a Unicode character code.\n" msgstr "" #: unicode.mim:32 msgid "" "Preedit prompt\n" "Prompt string shown in the preedit area while typing hexadecimal numbers." msgstr "" #: unicode.mim:36 msgid "" "Start Unicode\n" "Start typing hexadecimal numbers of Unicode character." msgstr "" というような PO ファイルができあがります。他に良い方法はある でしょうか? --- 半田@AIST obsolete API minput_get_commands, minput_assign_command_keys, minput_get_variables, minput_set_variable new API minput_get_command, minput_config_command, minput_get_variable, minput_config_variable, minput_config_file, minput_save_config MPlist * minput_get_command (MSymbol language, MSymbol name, MSymbol command) /***ja @brief 入力メソッドのコマンドに関する情報を得る. 関数 minput_get_command () は、$LANGUAGE と $NAME で指定される入力 メソッドのコマンド $COMMAND に関する情報を返す。入力メソッドのコマ ンドとは、疑似キーイベントであり、1つ以上の実際の入力キーシークエ ンスが割り当てられる。 コマンドには、グローバルとローカルの2種類がある。グローバルなコマンド はグローバルに定義され、ローカルなコマンドはその説明とキー割り当て を継承することができる。各入力メソッドはローカルなキー割当を持つロー カルなコマンドを定義する。また同名のグローバルなコマンドの定義を継 承するローカルなコマンドを宣言することもできる。 $LANGUAGE が #Mt で $NAME が #Mnil の場合は、この関数はグローバルコ マンドに関する情報を返す。そうでなければローカルコマンドに関するも のを返す。 $COMMAND が #Mnil の場合は、すべてのコマンドに関する情報を返す。 戻り値は以下の形式の @e well-formed plist (#m17nPlist) である。 @verbatim ((NAME DESCRIPTION STATUS [KEYSEQ ...]) ...) @endverbatim @c NAME はコマンド名を示すシンボルである。 @c DESCRIPTION はコマンドを説明する M-text であるか、説明が無い場合に は #Mnil である。 @c STATUS はキー割り当てがどのように定められるかをあらわすシンボルであ り、その値は #Mnil (デフォルトの割り当て), #Mcustomized (ユーザ 毎の設定ファイルによってカスタマイズされた割り当て), #Mconfigured (minput_config_command ()を呼ぶことによって設定される割り当て)の いずれかである。ローカルコマンドの場合には、#Minherited (対応する グローバルコマンドからの継承による割り当て)でもよい。 @c KEYSEQ は1つ以上のシンボルからなる plist であり、各シンボルはコマ ンドに割り当てられているキーシークエンスを表す。KEYSEQ が無い場合は、 そのコマンドは現状で使用不能である。(すなわちコマンドの動作を起 動できるキーシークエンスが無い。) $COMMAND が #Mnil でなければ、返される plist の最初の要素は、 $COMMAND に関する情報を含む。 @return 求められた情報が見つかれば、空でない plist へのポインタを返す。リス トはライブラリが管理しているので、呼出側が変更したり解放したりする ことはできない。 そうでなければ、すなわち指定の入力メソッドやコマンドが存在しなければ @c NULL を返す。 */ #if EXAMPLE_CODE MText * get_im_command_description (MSymbol language, MSymbol name, MSymbol command) { /* Return a description of the command COMMAND of the input method */ /* specified by LANGUAGE and NAME. */ MPlist *cmd = minput_get_command (langauge, name, command); MPlist *plist; if (! cmds) return NULL; plist = mplist_value (cmds); /* (NAME DESCRIPTION KEY-SEQ ...) */ plist = mplist_next (plist); /* (DESCRIPTION KEY-SEQ ...) */ return (mplist_key (plist) == Mtext ? (MText *) mplist_value (plist) : NULL); } #endif int minput_config_command (MSymbol language, MSymbol name, MSymbol command, MPlist *keyseqlist) /***ja @brief 入力メソッドのコマンドのキーシークエンスを設定する. 関数 minput_config_command () はキーシークエンスのリスト $KEYSEQLIST を、$LANGUAGE と $NAME によって指定される入力メソッドの コマンド $COMMAND に割り当てる。 $KEYSEQLIST が空リストでなければ、キーシークエンスのリストであり、 各キーシークエンスはシンボルの plist である。 $KEYSEQLIST が空の plist ならば、コマンドは使用できなくなる。 $KEYSEQLIST が NULL であれば、指定の入力メソッドのコマンドの設定は キャンセルされ、デフォルトのキーシークエンスが有効になる。この場合、 $COMMAND が #Mnil ならば指定の入力メソッドの全てのコマンドの設定が キャンセルされる。 $NAME が #Mnil ならば、この関数は個々の入力メソッドではなくグローバ ルなコマンドのキー割り当てを設定する。 これらの設定は、現行のセッション中で入力メソッドがオープン(または 再オープン)された時点で有効になる。将来のセッション中でも有効にす るためには、関数 minput_save_config () を用いてユーザ毎の設定ファイ ルに保存しなくてはならない。 @return この関数は、処理が成功すれば 0 を、失敗すれば -1 を返す。失敗とは以下の場合である。 <ul> <li>$KEYSEQLIST が有効な形式でない。 <li>$COMMAND が指定の入力メソッドで利用できない。 <li>$LANGUAGE と $NAME で指定される入力メソッドが存在しない。 </ul> @seealso minput_get_commands (), minput_save_config (). */ #if EXAMPLE_CODE /* Add "C-x u" to the "start" command of Unicode input method. */ { MSymbol start_command = msymbol ("start"); MSymbol unicode = msymbol ("unicode"); MPlist *cmd, *plist, *key_seq_list, *key_seq; /* At first get the current key-sequence assignment. */ cmd = mplist_get_command (Mt, unicode, start_command); if (! cmd) { /* The input method does not have the command "start". Here */ /* should come some error handling code. */ } /* Now CMD == ((start DESCRIPTION KEY-SEQUENCE ...) ...). Extract */ /* the part (KEY-SEQUENCE ...). */ plist = mplist_next (mplist_next (mplist_value (cmd))); /* Copy it because we should not modify it directly. */ key_seq_list = mplist_copy (plist); m17n_object_unref (cmds); key_seq = mplist (); mplist_add (key_seq, Msymbol, msymbol ("C-x")); mplist_add (key_seq, Msymbo, msymbol ("u")); mplist_add (key_seq_list, Mplist, key_seq); m17n_object_unref (key_seq); minput_config_command (Mt, unicode, start_command, key_seq_list); m17n_object_unref (key_seq_list); } #endif MPlist * minput_get_variable (MSymbol language, MSymbol name, MSymbol variable) /***ja @brief 入力メソッドの変数に関する情報を得る. 関数 minput_get_variable () は、$LANGUAGE と $NAME で指定される入力 メソッドの変数 $VARIABLE に関する情報を返す。入力メソッドの変数とは、 入力メソッドの振舞を制御するものである。 変数には、グローバルとローカルの2種類がある。グローバルな変数はグ ローバルに定義され、ローカルな変数はその説明と値を継承することがで きる。各入力メソッドはローカルな値を持つローカルな変数を定義する。 また同名のグローバルな変数の定義を継承するローカルな変数を宣言する こともできる。 $LANGUAGE が #Mt で $NAME が #Mnil の場合は、この関数はグローバル変 数に関する情報を返す。そうでなければローカル変数に関するものを返す。 $VARIABLE が #Mnil の場合は、すべてのコマンドに関する情報を返す。 戻り値は以下の形式の @e well-formed plist (#m17nPlist) である。 @verbatim ((NAME DESCRIPTION STATUS VALUE [VALID-VALUE ...]) ...) @endverbatim @c NAME は変数の名前を示すシンボルである。 @c DESCRIPTION は変数を説明する M-text であるか、説明が無い場合には #Mnil である。 @c STATUS は値がどのように定められるかをあらわすシンボルであり、 @c STATUS の値は #Mnil (デフォルトの値), #Mcustomized (ユーザ毎の設 定ファイルによってカスタマイズされた値), #Mconfigured (minput_config_variable ()を呼ぶことによって設定される値)のいずれ かである。ローカル変数の場合には、#Minherited (対応するグローバル 変数から継承した値)でもよい。 @c VALUE は変数の初期値である。この要素のキーが#Mt であれば初期値を持 たない。そうでなければ、キーは #Minteger, #Msymbol, #Mtext のいずれ かであり、値はそれぞれ対応する型のものである。 @c VALID-VALUE はもしあれば、変数の取り得る値を指定する。これは @c VALUE と同じ型(すなわち同じキーを持つ) であるが、例外として @c VALUE が integer の場合は @c VALID-VALUE は可能な値の範囲を示す二つの整数から なる plist となることができる。 @c VALID-VALUE がなければ、変数は @c VALUE と同じ型である限りいかなる値も とることができる。 $VARIABLE が #Mnil でなければ、返される plist の最初の要素は $VARIABLE に関する情報を含む。 @return 求められた情報が見つかれば、空でない plist へのポインタを返す。リス トはライブラリが管理しているので、呼出側が変更したり解放したりする ことはできない。 そうでなければ、すなわち指定の入力メソッドや変数が存在しなければ @c NULL を返す。 */ int minput_config_variable (MSymbol language, MSymbol name, MSymbol variable, MPlist *value) /***ja @brief 入力メソッドの変数の値を設定する. 関数 minput_config_variable () は値 $VALUE を、$LANGUAGE と $NAME によって指定される入力メソッドの変数 $VARIABLE に割り当てる。 $VALUE が NULLでなければ、1要素の plist であり、そのキーは #Minteger, #Msymbol, #Mtext のいずれか、値は対応する型のものである。 $VALUE が NULL であれば、指定の入力メソッドの変数の設定はキャンセル され、変数はデフォルト値に初期化される。この場合、$VARIABLE が #Mnil ならば指定の入力メソッドの全ての変数の設定がキャンセルされる。 $NAME が #Mnil ならば、この関数は個々の入力メソッドではなくグローバ ルな変数の値を設定する。 これらの設定は、現行のセッション中で入力メソッドがオープン(または 再オープン)された時点で有効になる。将来のセッション中でも有効にす るためには、関数 minput_save_config () を用いてユーザ毎の設定ファイ ルに保存しなくてはならない。 @return この関数は、処理が成功すれば 0 を、失敗すれば -1 を返す。失敗とは以下の場合である。 <ul> <li>$VALUEが有効な形式でない。型が定義に合わない、または値が範囲外である。 <li>$VARIABLE が指定の入力メソッドで利用できない。 <li>$LANGUAGE と $NAME で指定される入力メソッドが存在しない。 </ul> @seealso minput_get_commands (), minput_save_config (). */ char * minput_config_file (void) /***ja @brief ユーザ毎の設定ファイルの名前を得る. 関数 minput_config_file () は、関数 minput_save_config () が設定を 保存するユーザ毎の設定ファイルへの絶対パス名を返す。通常は、ユーザ のホームディレクトリの下のディレクトリ @c ".m17n.d" にある@c "config.mic" となる。返された名前のファイルが存在するか、読み書きで きるかは保証されない。関数minput_save_config () が失敗して -1 を返 した場合には、アプリケーションプログラムはファイルの存在を確認し、 (できれば)書き込み可能にし再度minput_save_config () を試すことが できる。 @return この関数は文字列を返す。文字列はライブラリが管理しているので、呼出 側が修正したり解放したりすることはできない。 @seealso minput_save_config () */ int minput_save_config (void) /***ja @brief 設定をユーザ毎の設定ファイルに保存する. 関数 minput_save_config () は現行のセッションでこれまでに行った設定 をユーザ毎の設定ファイルに保存する。 @return 成功すれば 1 を返す。ユーザ毎の設定ファイルがロックされていれば 0 を返す。この場合、呼出側はしばらく待って再試行できる。設定ファイル が書き込み不可の場合、-1 を返す。この場合、minput_config_file () を 呼んでファイル名をチェックし、できれば書き込み可能にし、再試行でき る。 @seealso minput_config_file () */