kinput2 で日本語入力する場合、日本語モードの ON/OFF を行うキーの設 定は意外とややこしく、カスタマイズに苦労する人もいるようです(例えば、 Control+o は別の機能に使いたいのに、どうしても kinput2 に奪 われてしまってはまる、など)。
ここでは、それらのキーの設定がどのようにして決まっているのかを説明 します。カスタマイズしようとする方の一助となれば幸いです。
まず、カスタマイズを大きく左右する要素が、「言語入力プロトコル」で す。これは、kinput2 と日本語入力しようとするアプリケーションの間の「デー タのやりとりの形式」のことです(これは、kinput2 とかな漢字変換サーバー の間のプロトコルとは違います。そちらは「かな漢字変換プロトコル」です)。 ※「言語入力プロトコル」というのは私が勝手にでっちあげた言葉で、正式な 用語ではありません。ご注意ください。
これには、おおざっぱに言って、「kterm 専用のもの」と「それ以外のア プリケーションに共通しているもの」の2つがあります。前者が「kinput2 プ ロトコル」で後者が「XIM プロトコル」です。詳しくは FreeBSD Q&A No.360 をご覧ください。
両者を比べると、XIM プロトコルの方が汎用的で新しいです。kinput2 プ ロトコルは、XIM のような汎用的な枠組みがない時代に、kterm だけでも日本 語入力ができるように、ということで考えられたもので、現在では推奨されな いはずです。kterm も、現在では両方のプロトコルで入力が可能になっていま す。
また、kinput2 プロトコルで kterm に入力を行う場合、日本語モードがオ ンになっていると、未確定文字が一切ないときでも、半角スペースやリターン キーの入力が kterm に伝わらない(無視される)、という問題があります。
日本語入力の設定を1ヶ所で集中して行うためにも、kinput2 プロトコル は使用しないようにして、XIM プロトコルで統一することをお薦め します。
ただ、XIM プロトコルもいろいろと問題は多いらしく、今後は古い規格と して滅んでいく運命にあるようです。その辺りの事情については、 詳しく書かれた記事をご 参照ください。本ページでは、XIM の枠組を超える話には触れません。
さて、日本語入力を ON/OFF するキーがどこで決まっているか、ですが、
まず ON にする方のキーですが、これを決めるのは kinput2 プロトコルではアプリケーション(kterm)の側、 XIM プロトコルではkinput2(より一般には、XIM サーバー)の側 および canna の設定と決まっています。
プロトコル | 何が決めるのか |
---|---|
kinput2 | アプリケーション(kterm) |
XIM | XIM サーバー(kinput2) |
canna の設定 |
上述したとおり、できれば kinput2 プロトコルではなく XIM プロトコル を使うことをおすすめします。それでも、何らかの事情で kinput2 プロトコ ルを使う必要のある方は以下を参照してください。
kterm で kinput2 プロトコルを用いる場合は、標準では 「Shift+SPACE」と「CTRL+半角/全角」に日本語入力 の開始が割り当てられています。これを変更するには、 FreeBSD Q&A No.360 にあるように kterm のリソースで指定してく ださい。※ kinput2 プロトコルを使う場合は、kterm 以外のリソースをいく らいじっても意味がありません。
リソースを記述するファイルが .Xresources なのか .Xdefaults なのか、 単に書くだけでいいのかそれともリソースファイルの読み込み処理を初期化ス クリプトか何かに追加する必要があるのかは環境によって違います。Linux な ら、ディストリビューション毎に違っているのでしょう…たぶん。その辺りは 自分で調べてください。
日本語入力を ON にするキーは
XIM サーバーの設定については、kinput2 を用いる場合、標準では Shift+SPACE と Ctrl+半角/全角 で日本語入力が ON になるようになっています。これをカスタマイズするには、kinput2 のリソー スを記述するファイルの中で
Kinput2*ConversionStartKeys: \
Ctrl<Key>Henkan_Mode \n\
Alt<Key>Zenkaku_Hankaku
のように書いてください(これは、「Control+変 換」と「Alt+半角/全角」で ON にする例)。
上述のように、リソースを記述するファイルが .Xresources なのか .Xdefaults なのか、単に書くだけでいいのかそれともリソースファイルの読 み込み処理を初期化スクリプトか何かに追加する必要があるのかは環境によっ て違います。やはり、その辺りは自分で調べてください。
さらに、kinput2 で canna を使って日本語入力する場合は、 canna 側で日本語入力 ON に設定されているキーも追 加されます。
これは、標準では「Control+o」と「Shift+半角/全角
」になっています(※注)。したがって、
Control+oで日本語入力が ON になってしまうのを解除するには、
~/.canna
で
(global-unbind-key-function 'japanese-mode)
や
(set-key 'alpha-mode "\C-o" 'self-insert)
のようにする必要があります(前者なら Shift+半角/全角 も解除
される。後者なら Control+o だけが解除される)。
また、日本語入力 ON を Control+o から
Control+\ に変更するには、上のように Control+o
の設定を解除した上で、さらに ~/.canna
で
(global-set-key "\C-\" 'japanese-mode)
ないし
(set-key 'alpha-mode "\C-\" 'japanese-mode)
とすればいい………はずなのですが、kinput2 のバグのためこれは効きません。 他にいくつか見つけたバグとともに、バグ修正のパッチ を用意しましたのでそちらをどうぞ。
ただし、canna 側で日本語入力 ON に設定されているキーのうち、 2つ以上のキー列からなるものは kinput2 には伝わりません。 例えば
(set-key 'alpha-mode "\C-x\C-o" 'japanese-mode)
のようにした場合、自動では C-xC-o が日
本語入力の開始にはならないのです。日本語入力の ON がキー1発で実現でき
ないのは不便でしょうから、そういう設定は普通はしないのでしょうが、何ら
かの理由でどうしてもそのようにしたい方は、~/.canna
ではな
く上述の X Resource により指定してください。
OFF にする方のキーは、次の2つで決まります。 kinput2 プロトコルと XIM プロトコルの違いはありません。
canna の設定の方は、標準では、OFF のキーは ON のキーと同じく 「Control+o」と「Shift+全角/半角」に割り 当てられています。(これも※注参照)
これも、~/.canna
で変更できます。解除するには
(global-unbind-key-function 'alpha-mode)
や
(set-key 'empty-mode "\C-o" 'undefined)
でよいでしょう。
Control+\ を OFF に割り当てるなら、さらに
(set-key 'empty-mode "\C-\" 'alpha-mode)
で OK です。こちらは、下のパッチを当てなくても効
きます。
canna を使う場合、kinput2 には「Shift+SPACE で日本語 モード OFF」という設定が最初から組み込まれています。これは、kinput2 の プログラムを修正してコンパイルし直さない限り変更も解除もできませ ん。
この日本語モード終了のキーを X の Resource で設定できるようにするパッチを公開されている方もいます。 このパッチについての作者の方のコメントもどうぞ(04/01/20 部です)。
canna の説明 の文書によれば、canna の標準の日本語 ON/OFF のキーは Control+o と XFER ということになっています。とこ ろが、いわゆる日本語106キーボードには「XFER」というキーは見 当たりません。
106キーボード上で XFER に対応するキーはというと、まず 「変換」キーが思い当たります。ところが、kinput2 では「 変換」キーを押しても何も起こらず、代わりに「Shift+半角/全角 」が XFER キーとして振る舞います。
これは、もともと canna が NEC で開発されており、NEC キーボードを前提 とした作りになっていたことと関連しているのでしょう。 NEC キーボードの XFER キーは、X window 上では大雑 把に言うと「Kanji」というキーとして認識され、kinput2 も 「Kanji」というキーを XFER として扱うように 作られています。しかし、106 キーボードでは「Kanji」として認 識されるのは「Shift+半角/全角」なのです。「変換」 の方は、X window では「Henkan_Mode」というキーとして認識さ れるようになっています。
この辺りの事情については、Canna ML で今さんが説明してくださいました。
(今さんの説明その1) Keysym の XK_Kanji を xfer や「変換」に当たるものにしましょう、という のを X11 研究会というところで提言しておりましたので、xfer は XK_Kanji が正しいものと思います。
(今さんの説明その2) 「XK_Kanji はかな漢字変換をオン/オフするキーに割り当てよう」というのが オリジナルアイデアです。106 キーボードの「変換」キーは厳密にはそのよう な目的のキーではなくて、106 キーボードであれば「漢字」キー(つまり、Alt + 半角/全角)がその役割になりますね。 もっと X のキーの考え方に基づいて見ると、X の XK_Kanji に当たるキーは 106 キーボードには存在しないことになってしまいます。というのは、Alt + 半角/全角は 106 キーボード的には「漢字」キーかもしれませんが、X からみ ると Alt というモディファイアキーが押されつつ「半角/全角」が押された以 上の何者でもないですから。 ということで、「変換」が XK_Henkan_Mode はそれでもかまわないと思います。
とは言うものの、やっぱり「XFER」と「NFER」が「変換」と「無変換」に 対応しないのはすっきりしませんし、さらに canna の XFER には「日本語モー ド ON」だけでなく、「かな漢字変換の実行」の役割も割り当てられているの ですから、やはり「変換」キーが「XFER」に対応していてもおかしくはないよ うに思います。そこで、kinput2 が「Henkan_Mode」も 「XFER」として扱うようなパッチを用意しました。
以下のパッチを kinput2 に当てて、コンパイルし直してください。
kinput2 が、「変換」キーを「XFER」として扱うようになります。
また、~/.canna
で「変換」キーの機能を「\Xfer
」
としてカスタマイズすることも可能になります。
なお、当然 Canna 3.7 用 wchar パッチ と XIM 用 kinput2 パッチも当てておくべきです。
([2004,7/6] ほぼ同時期に、同じようなこと
を考えていた方が他にもいらしたんですね。
こちらでも、「変換」キーを「\Xfer
」として認識させるパッチ
が公開されています。)
このパッチは同時に以下のようなバグ修正・機能追加も行います。
XK_kana_*
の keysym を持つキーを入力しても落ちな
いようにした(バグ修正)。この部分は Canna ML で相田さんに修正法を教
えていただきました。\Backspace
が C-h
と backspace の2つに対応する、など)場合、その個数の分だ
け canna 上の key code が大きい方から順に日本語モード ON のキーとして
効かなくなるバグを修正した(バグ修正)。xmodmap
コマンドなどで適
当なキーに割り当ててやらなければ意味のないキーであることに注意。
~/.canna
で
カスタマイズ可能なキーとして、\Pf1〜\Pf10を
F11〜F20に割り当てた(機能修正)。これまではプ
ログラム中の記述がおかしくて、\Pf5〜\Pf10に対
応するキーはキーボード上に存在しませんでした。XK_kana_*
を用いると、kinput2 で本当のかな入力ができるようになります。「本当の」
かな入力なので、「ろ」と長音記号の区別がちゃんとつき、
Shift+0で「を」が出てきます。XK_kana_*
の入
力法は~/.canna
でカスタマ
イズするには、Canna3.6p4 以降のバージョンが必要です。ここでは、日本語入力の ON/OFF を「Control+\」と「変
換」に割り当て、他のキーは kinput2 に使われず素通しにする設定例
を挙げます(ただし、Shift+SPACEが日本語の OFF になってしま
うことだけは避けられませんし、「Shift+半角/全角」が「
変換」と同じになってしまうことも避けられません。後者が嫌な方は、
xmodmap コマンドで「半角/全角」から「Kanji」の keysym
を
剥ぎ取るか、上のパッチにさらに手を入れて「Kanji」を
「XFER」として扱う処理を削除してください)。
.canna
に、以下のような記述を追加する。
; 日本語モードへの移行は C-\ で。
(set-key 'alpha-mode "\C-o" 'self-insert)
(global-set-key "\C-\" 'japanese-mode)
; 読みがないときに C-\ で日本語モード終了。
(set-key 'empty-mode "\C-o" 'undefined)
(set-key 'empty-mode "\C-\" 'alpha-mode)
OpenIm: yes
を付け加えて、kterm が XIM プロトコルを使う
ようにする。