4. X

X 環境下においても大きな違いはない。X Window System という 新しいレイヤーは、スキャンコードをコンソール上より多種かつ正確な keysym に翻訳して アプリケーションに渡してくれるのだ (これが XEmacs では問題が発生しない理由だ - X はキーコード 14 を keysym BackSpace に割り当て、キーコード 111 を keysym Delete に割り当てる。 こうすることで目的の動作を関連付けることが容易になる)。当然だが 端末エミュレータプログラム (X の世界では通常 VT100 エミュレータを指す) は X Keysym を ASCII 文字列に割り振らねばならない。結果としてまた例の問題と 再会することになる。

もっと詳しく言うと、普通 xterm はコンソールと まったく同じように振る舞う (つまりまったく同じ ASCII 文字列を出力する)。しかし例えば、 7.0 より前の Red Hat についてくる gnome-terminal は、BackspaceBS を、DeleteDEL を 出力する。これを知ったらほんとに笑えるだろうが、 xtermgnome-terminal はデフォルトで端末データベースの同じエントリを使うのだ。 ここでは kbs 特性は ASCII DEL に割り当てられている。というわけで、本来まともな振る舞いをするアプリケーションのはずが、 gnome-terminal 上では BackspaceDelete で同じ動作をしてしまうことになる。 こういうときは次の一行

bash$ export TERM=gnome
でまともなアプリケーションなら問題を解決できる。ええと、 いつもこうってわけではないのだが。システムに gnome という名前の端末データベースエントリがない場合も あるかもしれないから。とくに最新のものじゃないデータベースの場合は。

いずれにせよこれが常に解決策であるとは限らない - 例えばもし 7.0 以降の Red Hat ディストリビューションを使っているなら、 gnome-terminal はコンソールのような動作をするだろう。 しかし気を付けよう - もし Helix ディストリビューションを使うように デスクトップをアップグレードすると、gnome-terminal が 7.0 より前の Red Hat のような振る舞いをするようになる。

以下の議論を簡単にするために、標準を コンソールのように振る舞う VT100 エミュレータ、アレゲBackspace に対して BS を、Delete に対して DEL を出力する VT100 エミュレータ、と定義する。 従って、例えば Debian ディストリビューションの xterm は 常に標準であり続けたが、 Red Hat では標準からアレゲに、そしてアレゲから標準にと 何度か切り替わった。gnome-terminal の履歴は よりいっそう異常になっている。