X Window でのかな入力

こんなページを書いていながら、私は普段かな入力は全然使いません。思 わぬ誤りを含んでいたりするかも知れませんので、そのつもりでお読みくださ い。

むかーし、かな入力を使っていた頃はあって、そのころは何 の苦労もなくかな入力できていたのですが、ある時期どうしてもローマ字入力 を使わざるを得なくなったことがありました。その時期は結構長い間続き、さ らに使ってみるとローマ字入力はそれはそれで便利に感じることもあった(数 字や記号を、いちいちモード切り替えしなくても入力できる)ため、そのうち すっかり慣れ切ってしまったのです。その結果、かな入力の力はもうすっかり 衰えてしまって現在に至ります。

これまでの概要

X window 環境で日本語入力する場合、「かな入力」は意外と難しいもので す。広く使われている kinput2 と canna という組み合わせでは、 ~/.canna


(setq romkana-table "kana.cbp")

とカスタマイズすれば「かな入力もどき」になります。 しかし、これは本来かなでない入力を、canna が「読み替える」ことによって 行っているだけです(例えば、本来は「3」だった入力を、「あ」と読み替え る、など)。そのため、JIS 配列以外のキーボードではまともに入力できませ ん(なお、ASCII 配列のキーボードに対しては、kana.ctdに対 して mkromdic -DASCII を実行して kana.cbpを作 り直し、適切な場所に置けば ASCII 配列対応のかな入力が可能です)。

話をいわゆる日本語 106 キーボードに限定しても問題は残ります。かな入 力をする側から見ると「ろ」と「ー」はまったく別のキー上にあるのですが、 実は kinput2 や canna に対して渡る入力はどちらも「\」で、同じです。し たがって、単に「入力された文字をかなに読み替える」だけでは、「ろ」とし て入力されたのか、「ー」として入力されたのか、区別することができません。

このため、kana.cbp ではこの「\」を「ー」の方に割り当て、 「ろ」は「`」、すなわちShift+@に割り当てることで妥協を図っ ています。

同様のことが「を」にも言えます。かな入力する側の立場としては「を」 は Shift+「わ」 なのですが、このキーは、日本語 windows を使っ た方なら「キートップを見ると『~』が出るはずなのに押しても何も出てこな い。ああ、『~』は一体どうやって入力すればいいんだ!」という経験を一度 は味わったことのあるキーでしょう。これは「押しても何も入力されないキー」 なのです。かんなでも、入力がなければ「置き換え」すらできません。そのた め「を」の場所を「|」、つまり Shift+\ に退避させてあるよう です。

なお、最近の(?)XFree86 での日本語 106 キーボードだと、 Shift+0 では「~」が出てくるようです(あるいは、XFree86 など できる前の古来からそうだったのかも)。これは Shift+^ で出て くるものと同じ「~」ですが、かな入力の最中なら Shift+^、つま りShift+へ を使う機会はないでしょうから、「~」に対して「を」 を割り当てておけば、「を」の入力に関する問題はなさそうです(とは言え、 かんなは本来 X Window 下のみでの動作を想定されたソフトではないので、 「~」を「を」に割り当てることだけで済ますわけにはいかないでしょう)。

Plamo Linux ではこの「ろ←→ー」問題、「を」問題をかん なの defsymbol 機能の上手な利用(と、おそらく X の keymap の調整 こ れは、kinput2 に Plamo 独自の修正を加えることで実現している、とご指摘を 受けました。keymap に手を加えるという方針でないのは、windows 上の X サー バーを使う場合も考えてのこと、ということだそうです。う〜ん、深い) によってほぼ解消しているようですが、僅かに本来の「かな入力」は実現できてい ないようです(defsymbol の選択によって直前に「ろ」や「を」以外の候補を選 んでいた場合、文章の途中で「ろ」「を」を入力することができない…ように見 える。設定ファイルの一部を眺めてみただけなので、間違っていたらごめんなさ い) (すみません、見てたのが古い設定ファイルだったので大ウソを書いてました。 現在はその問題は修正されています

「本当の」かな入力

[2010, 1/9] 私なんかよりよっぽど事情を よくわかっている方が、テキパキとやり方を説明してくださっているようで す。以下のクドクドした説明より、そちらをご覧いただいた方がよいでしょう。 特に、まだ試してはいませんが、以下の説明よりもっとマトモな「かなロック」 が実現されているっぽい感じです。ただ、キーボード配列設定の記述場所が、 xorg.conf から別の所に移った点はまだ更新されていないような ので、その部分に関してだけ、私の記述を参考にしていただければよいと思いま す。

XFree 86 4.3.0 以降及 び Xorg では、適当なキーに「かな ロックキー」の役割を与え、「もどき」ではないかな入力を行うことが可能で す。その方法を説明しましょう。なお、以下の説明は /usr/X11R6/lib/X11/xkb 以下の文書を流し読みし、試行錯誤し た結果をまとめたものなので、誤り・不適切な記述が含まれる危険が多分 にあります。改めてご注意ください。詳しくは、上記文書に直接当たっ てみてください。

なお、ここで説明する方法で kinput2 にかな入力をする場合(XK_kana_* の keysym を kinput2 に与えています)、Canna 3.7p2 以降を使っていると、 kinput2 が落ちます。そこでこのバグ修正の パッチを当てて、kinput2 を再コンパイルしておいてください。

ここでは、左の「windows キー」をかなロックキーとして使ってみることに しましょう(※キーボードの一番下の列に、旗のマークがついたキーがあります ね。windows で押すと、「スタート」メニューが開くアレです)。まずは kterm を開き、


% setxkbmap -print
とコマンドを入力してみてください。

xkb_keymap {
        xkb_keycodes  { include "xfree86+aliases(qwerty)"       };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "jp"  };
        xkb_geometry  { include "pc(jp106)"     };
};

のような出力が返ってくれば準備はOKです。細部の違 いはあって構いませんが、重要なのは「jp」や「jp106」があることです。

ここで、


% setxkbmap -option grp:lwin_toggle
と入力すれば、それだけでokです。もう一度 setxkbmap -print と入力して、


xkb_keymap {
        xkb_keycodes  { include "xfree86+aliases(qwerty)"       };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "jp+group(lwin_toggle)"  };
        xkb_geometry  { include "pc(jp106)"     };
};

のように「xkb_symbols」の行に変化が 現れているのを確認しましょう。

ここで試しに「左 windows キー」を一度押し、kterm に適当なキーを入力 してみてください。「半角カナ」ないし「全角かな」がぞろぞろ現れましたか? (kinput2 が起動済みだと全角かなになるようです)

このままだと何のコマンドも入力できませんし、他のアプリケーションに 対する入力まで全部かなになってしまうので、もう一度「左 windows キー」 を押して元に戻しましょう。

続いて、kinput2 を起動し、日本語入力の準備を整えてください。そうし たら再び「左 windows キー」を押し、かなロックをかけます。kinput2 の日 本語モードを on にし、「かな入力」を味わってみましょう(※ 上で注意し た通り、最近のかんなを使っている場合は kinput2 にパッチを当てておかないと落 ちてしまいますのでご注意)。終わったらかなロックを解除します。

なお、上で実行した setxkbmap コマンドは keymap を初期化 しますので、ログイン時のスタートアップスクリプトなどで xmodmap を使って keymap のカスタマイズを行っていた場合、そ れが無効化される点に注意してください。対策は後で説明します。

というわけで「本当のかな入力」が実現できたのですが、これにはいくつ か問題が残っています。順に見ていきましょう。

1. モードの切り替えがめんどくさい

かなロックが kinput2 の日本語モードの ON・OFF と連動していないので、 これで「かな入力」をやろうと思ったら、日本語モードを ON・OFF する度に 左 windows キーを押さねばならず、相当に厄介です。このままではあまり実 用的とは言えず、kana.cbp による「もどき」の方がまだましか もしれません。

左 windows キーには ISO_Next_Group という keysym が割り付 けられた状態になっていますので、kinput2 が日本語モードを切り替える度に 「ISO_Next_Group の keysym のキーが押された」ことに当たる情 報を X サーバーの方に送ってくれればいいのですが…。

kinput2 の開発は今では停止しているようなので、待っていてもおそらく そういう機能は取り込まれません。現在 uim などの次世代の入力機構が開発されつつありますので、そちらに期待 しましょう(そういう所では、「かな入力」は別の方法で実現されそうな気も しますが)。

2. ロック中かどうかわからない

今の説明通りに使った場合、「現在、かなモードなのかそうでないのか」 は入力してみるまでわかりません。Caps Lock や Num Lock などと同様、ラン プ(LED)の点灯状態によってかなロックがかかっているかどうかを判断した いものです。

それには


% setxkbmap -option grp_led:scroll

とすると、「Scroll Lock」の表示灯が「かなロック」 の表示灯代わりになってくれるようです。

3. 設定として固定するには

このままだと、いったん log off すると元の状態に戻ってしまいます。 log in する度に setxkbmap コマンドを入力し直すのではやって いられませんし、上に述べた通り xmodmap による keymap のカス タマイズも消えてしまいます。

[2010, 1/9] 最近の xorg では、dbus や HAL といった機構(私にはよくわかっていません(笑))を基幹部に 取り入れたため、以下で抹消した記述は通用せず、キーボード配列関係の設定 は xorg.conf で行うのではなくなっています(………というの が、FreeBSD だけの話なのか、他の OS でもそうなのかも知らない(すみませ ん)ので、もしお使いの環境で違うようでしたらすみません)。

現状では、キーボード(や、マウス)といった入力機器の面倒は HAL が見る ことになっているらしく、以下の記述に相当する設定 は /usr/local/etc/hal/fdi/policy/ というディレクトリに、拡 張子 .fdi のファイル(ファイル名は何でもいいらしい)を作り、 以下のように記述しておけばいいようです


<?xml version="1.0" encoding="UTF-8"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.keyboard">
      <merge key="input.x11_options.XkbRules" type="string">xorg</merge>
      <merge key="input.x11_options.XkbModel" type="string">jp106</merge>
      <merge key="input.x11_options.XkbLayout" type="string">jp</merge>
      <merge key="input.x11_options.XkbOptions" type="string">grp:lwin_toggle,grp_led:scroll</merge>
    </match>
  </device>
</deviceinfo>

むむむ………こっち の方がちょっと正統派っぽいかな?すみません、もうあんまりいろいろ試し てみる気力がないです…。

設定を保存し、最初からこの状態にしておくには、 XF86Configxorg.confInputDeviceKeyboard 設定部に、setxkbmap に与えたオプショ ンを書いておきます。例はこんな感じ。


Section "InputDevice"
	Identifier  "Keyboard0"
	Driver      "keyboard"
	Option	    "XkbModel" "jp106"
	Option	    "XkbLayout" "jp"
	Option      "XkbOptions"    "grp:lwin_toggle,grp_led:scroll"
EndSection

XKbOptions の行にすでに caps lock 関係のオプションが入っ ている人もいるでしょうが、そういう人はそのオプションも含めてコンマで区 切って並べてください。 ※ この変更は、X サーバーを再起動しないと反映されないようです。xdm を使っている場合は、log off だけでは変更が有効になりませんので注意。

4. Emacs へのかな入力は?

Emacs には、そのままでは上の方法による「本当のかな入力」はできませ ん。~/.emacs


(global-set-key [kana-A] [?ア])
;; ないし、(define-key function-key-map [kana-A] [?あ]) など
のような行を延々と書く必要があるのだと思います。

それを行ったとしても、 emcws でかんなを利用している場合、かな漢字変換に対してかな入力はで きません。それを可能にするには、私が公開し ているパッチを適用し、ファンクションキーをかんなのキーコードに変換 している部分に、上と同様な「kana-* の keysym を、canna に とってのキーコード(半角カナの文字コードと同じ)に変換する」という部分 を付け加えればよいだろうと思います(動作未確認)。

setxkbmap コマンドの -option に与えられるオプ ションは他にもいろいろあります。詳しくは /usr/X11R6/X11/lib/xkb にある README, README.config, README.enhancing を参照してください。


計算機関連のトップページへ
全体のトップページへ
井汲 景太 <ikumikeita@home.jcom.ne.jp.NOSPAM.>(迷惑メールお断り)
最終更新日: 2010年1月10日