  The Linux Keyboard and console HOWTO
  Andries Brouwer, aeb@cwi.nl
  v2.1, 8 November 1995
  佐藤亮一, GFG02131@niftyserve.or.jp
  v2.1j, 8 November 1995

  本文書には，Linuxキーボード・端末，および非アスキー文字の利用法に関す
  る情報を記載しています．

  注意: この文書はかなり以前に書かれたものなので、いまどきの Linux 環境
  にはあてはまらない箇所があります。 (JF Project)

  1.  役にたつプログラム

  以下のパッケージ類にはキーボード・端末関連のプログラムが含まれていま
  す．

  o  kbd-0.90.tar.gz 内容： loadkeys, dumpkeys, showkey, setmetamode,
     setleds, setfont, showfont, mapscrn, kbd_mode, chvt, resizecons,
     disalloc, getkeycodes, setkeycodes.

  o  util-linux-2.5 内容： setterm, kbdrate

  o   shellutils-1.8 (stty.tar.gz） 内容： stty

  o  open-1.1.tgz 内容： open. (dynamic-vc-1.1.tar.gz）

  o  SVGATextMode-0.9.tar.gz 内容： SVGATextMode

  o  The X distribution 内容： xmodmap, xset, kbd_mode.  (X386keybd(1))

  2.  キーボードのあらまし

  キーを押すと，キーボードコントローラーがスキャンコードをカーネルのキー
  ボードドライバー に送付します．キーボードの中にはプログラム可能な物も
  ありますが，キーとスキャンコードの対応は固定となっているのが普通です．
  カーネルのキーボードドライバーは，受け取った情報をそのままアプリケー
  ションに伝達する役割を果たします（スキャンコードモードの場合．X 使用時
  など）．またキーボードドライバーは，キーが押されたか・はなされたかに応
  じ， スキャンコードの流れをキーコードにパースする機能をも果たしていま
  す(キーを一つ押す毎に，６つのスキャンコードを生成します）．

  こうしてつくられたキーコードは，アプリションに引き渡されます（キーコー
  ドモードの時．例えば showkey がこれを用いています）キーコードモード以
  外の場合には，キーコードをキーマップの中で検索し，対応する文字・文字列
  をアプリケーションに引き渡したり，キーマップに記述されている命令を実行
  する作業が行われます．

  （例：あるキーを押した時に，キーボードがスキャンコード 0x1e, 0x9e を生
  成した場合を考えてみましょう．このコードはキーコード 30，158 に変換さ
  れます．ついでこれは 0141, すなわち ASCII あるいはlatin-1 コード 'a'に
  置き換えられます．削除キーを押し，再びこれをはなすと，キーボード はス
  キャンコード 0xe0 0x53 0xe0 0xd3 を生成し, これはキーコード 111，239
  に変換され，ついで ESC [ 3   という４文字からなる文字列に置き換えられ
  ます．この二例はいずれも，US キーボード，初期設定状態のキーマップを前
  提としたものです．特定の命令をキーコンビネーションに割り振った例に
  は，Ctrl-Alt-Del があります）

  setkeycodes というユーティリティーを利用すれば，スキャンコードとキー
  コードとの対応を変更できます．しかし，こうした作業が必要になることは稀
  でしょう．キーコードと文字・文字列・命令との対応，すなわちキーマップを
  変更する場合には， loadkeys というユーティリティー を用います．詳しい
  ことについては， getkeycodes(8), setkeycodes(8), dumpkeys(1),
  loadkeys(1) の各マニュアルページをご覧ください．

  上で「アプリケーションに引き渡す」と表現したことを正確に言えば「端末ド
  ライバーに引き渡す」ということになります．つまりここから先は，シリアル
  ケーブルを通じて送致されたテキストの場合と全く同じように処理されること
  になるのです．この処理を詳細に規定しているのは，stty というプログラム
  です．

  3.  端末のあらまし

  逆向きに考えてみましょう．何かを端末に出力するとき，最初に行われるのは
  標準 tty プロセスです．ついで端末ドライバーが fed されます．端末ドライ
  バは VT100 をシミュレートしており，VT100 エスケープシークエンスが認識
  できるように入力をパースします（カーソル移動，画面消去など）．エスケー
  プシークエンスに含まれない文字は，マッピングテーブルに従って変換されま
  す．ビデオメモリに書き込まれ，ビデオカードの文字 ROM 上の文字シェープ
  表示に用いられるのはこの変換後のバイトなのです．setfont を用いて独自の
  フォントを文字ロムに読み込んだり，mpscrn をもちいて独自のマップテーブ
  ルをロードすることも可能です．詳細については，以下の記述を参照してくだ
  さい．

  4.  端末のリセット

  スクリーン表示がめちゃくちゃになってしまったり，入力したキーストローク
  が全部，線描文字でエコーバックされてしまう．こんな時にはどうすればいい
  のでしょう？

  ^L でスクリーンを再描画するようにしているプログラムは少なくありませ
  ん．モデムからのノイズや，送致メッセージがスクリーン上に表示された場合
  には，この機能が役立つことでしょう．クリア・コマンドは，スクリーンを消
  去するコマンドです．

  リセット・コマンドは端末ドライバー をリセットします．これを使うのは，
  スクリーンが奇妙なグラフィック文字で埋め尽くされたような場合です．表示
  行数が少なくなってしまった場合にもこの方法で対処できます．

  このコマンドがない場合，あるいは若干別の機能を果たす場合には，以下の二
  行からなる実行型ファイルを作って，パスの通った所に置いてください．

       #!/bin/sh
       echo -e \\033c

  ここでは，ESC と c の２文字を端末に送付しています．変ったフォントを
  ロードしていて，初期設定のフォントに戻したい場合には，

       % setfont

  を実行してください（初期設定フォントを初期設定位置に置いておくことが必
  要です）．

  旧型の端末の場合，タブを含む出力が遅れることがあります，このような場合
  には，以下のようにして下さい．（詳しくは，stty(1) のマニュアルページを
  参照のこと）

       % stty tab3

  reseizecons や SVGATextMode を用いれば，ビデオモードを変更することもで
  きます．これは通常，出力側の設定に変更を加えるものです．入力側にはいろ
  いろ問題があることでしょう．X, DOOM 等 raw mode を用いているプログラム
  がクラッシュしてしまう場合．ご使用中のキーボードが raw mode（あるい
  はmediumraw mode)のままになっている場合には，こうしたコマンドを用いる
  のは難しいでしょう．（下記の「raw mode からの脱出法」の項をもお読みく
  ださい）

  4.1.  キーボードのハードウェアリセット

  Linux が関知しないローレベルの事はうまくいかないかもしれません．ローベ
  レルにも少なくとも２種類の区別があり(キーボードとキーボードコントロー
  ラー），それぞれの方法で "keyboard disable" 命令をキーボードハードウェ
  アに伝達することが可能です．キーボードの中には，３種類のスキャンコード
  セットの一つを利用するようにプログラムできるものも少なくありません．残
  念ながら，これを使って問題を解決できるというケースは存じません．

  キーボードの中にはリマッピング機能を内蔵しているものもあります．Stormy
  Henderson(stormy@Ghost.Net) 氏からは「プログラム機能を備えたキーボード
  をたまたまお持ちの場合なら，control-alt-suspend_macro で（Gateway
  Anykey Keyboard の場合）標準状態のキーボードに復帰できます」との報告を
  頂きました．

  5.  Delete と Backspace

  5.1.  直前にタイプした文字を消去するためにどのキーを用いるかを知るには
  どうすればいいのでしょうか？

  以下のコマンドを実行してください．

       % stty erase ^?

  文字は消去されていいるものの，挙動がおかしいというばあいには，tty の設
  定に何か間違いがあります．echoprt をセットしている場合には，消去された
  文字は \fR と / に挟まれています．echoe をセットしていない場合には，消
  去した文字がエコーバックされます（# のような印刷可能文字の場合にはこれ
  が理に適ったやり方です）．大部分のユーザーは stty echoe -echport にし
  たいと考えるでしょう． stty sane とすれば，これ以上のことが実現できま
  す．現在の設定状況を確認するには stty -a を実行してください．

  ちゃんとした getty を使っていれば，初期設定のままでうまくいくはずで
  す．

  独自のキービンディングを行うプログラムが多い（bash, emacs etc.) ことに
  注意してください(  /.inputrc,  /.emacs etc で定義するようになっていま
  す)．こうしたプログラムは，消去文字の設定に影響されません．

  5.1.1.  これまでは getty が DELとBS をちゃんと処理できていたのに，今に
  なってダメ になってしまいました？

  かつては，DEL(177)を押すと BS Space BS (10 40 10) を端末ドライバーが発
  行していました．しかし現在では DEL を無視するようになっています（ドラ
  イバーが vt100 をエミュレートするようになって以来こうなっていま
  す）．DEL を出力しない，優れた getty を入手してください．

  5.1.2.  一度目と二度目で，ログインの挙動が異なるのですが？

  最初のログイン時には，getty を用います．これに対し，二回目のログイン時
  には，全く別のプログラムである login が起動されます．挙動が異なるのは
  そのためです．

  5.2.  キーが押されたときどのコードを生成するかを Linux に告げるにはど
  うすればいいのでしょう？

  端末上では，より正確にいうとすれば，(MEDIUM)RAW mode を用いていない端
  末では，

       % loadkeys mykeys.map

  を X を使っている場合には

       % xmodmap mykeys.xmap

  を実行してください．

  XFree86-2.1 以降の X は，X のキーマップを初期化する時に Linux のキー
  マップを読みこむようになっています．しかしながら Linux/X の両システム
  は完全互換ではありません．xmodmap が余分になってしまう場合が多いのはそ
  のためです．

  例えば，初期設定の Delete Key ではなく，Backspace Key が ^H
  (Backspace) を発行するように設定したい場合には，次のようにしてくださ
  い．

       % loadkeys
       keycode 14 = BackSpace
       %

  5.2.1.  なぜ初期設定では，Backspace が ^H(backspace)を発行するように
  なっていない のですか？

  1. VT100 端末では，Delete key が Enter key の上にあるからです．

  2. Linus 氏がこの設定を選択したからです．

  5.3.  Ｘ で Delete and Backspace を交換するにはどうすればいいのでしょ
  う

       % xmodmap -e "keysym BackSpace = Delete" -e "keysym Delete = BackSpace"

  Backspace が ^H(backspace) を発行するようにしたいだけなら

       % xmodmap -e "keycode 22 = BackSpace"

  Deletekey が Delete を発行するようにしたいだけなら

       % xmodmap -e "keycode 107 = Delete"

  を実行してください．

  (しかしながら普通は，交換済みの状態が初期設定値になっていま．）

  5.4.  emace 上での Delete や Backspace キーの意味を定義するには どうす
  ればいいでしょう？

  .emacs ファイルに以下のような行を付け加えてください．

       (global-set-key "\?" 'delete-backward-char)
       (global-set-key "\C-h" 'help-command)

  もちろん同じようにして，別のキーを別のコマンドに結合することも可能で
  す．

  5.5.  emacs で Delete と Backspaceを交換するためにはどうすれば いいの
  でしょう？

  .emacs ファイルに以下の行を付け加えてください．

       (setq keyboard-translate-table (make-string 128 0))
       (let ((i 0))
       (while (< i 128)
           (aset keyboard-translate-table i i)
           (setq i (1+ i))))
       (aset keyboard-translate-table ?\b ?\^?)
       (aset keyboard-translate-table ?\^? ?\b)

  5.6.  kermit で Delete と Backspace を交換するためにはどうすれば いい
  のでしょう？

  .kermrc ファイルに以下の行を付け加えてください．

       set key \127 \8
       set key \8 \127

  5.7.  xterm を希望する tty modes にセットする方法を教えてください．

  通常，xterm は起動時の tty mode を引き継ぎます．xdm の場合，初期設定で
  は #, @ がそれぞれ消去，kill 文字となっています．これは古き良き時代の
  Unix v.6の名残です．これがお気に召さない場合には，以下のような行を付け
  加えてください．

  /usr/lib/X11/app-defaults/XTerm あるいは $HOME/.Xresources に

       XTerm*ttymodes: erase ^? kill ^U intr ^C quit ^\ eof ^D susp ^Z
                       start ^Q stop ^S eol ^@

  （$HOME/.xinitrc に xrdb $HOME/.Xresources という一行があることを前提
  としています）

  5.8.  Backspace key が DELを生成していることを xmosaic に伝達する方法
  を教えてください．

  以下の行を，$HOME/.Xresources に付け加えればいいでしょう

       *XmText.translations: #override\n\
          <Key>osfDelete: delete-previous-character()
       *XmTextField.translations: #override\n\
          <Key>osfDelete: delete-previous-character()

  しかしながら netscape FAQ は次のように述べています．

  (引用開始)

  テキストフィールド内でバックスペースが機能しないのはどうしてなのでしょ
  う？ Linux,XFree86の初期設定は，バックスペース・削除キーの設定を誤って
  います．モチーフ関連のプログラムはすべて(Netscape, Navigatorをも含むこ
  とは申し上げるまでもありません）同じように誤動作してしまいます．

  モチーフの規格表には「バックスペースキーは直前の文字を消去し，削除キー
  は次の文字を消去します」と書いてあります．Linux, XFree86はとちらも，
  バックスペースキー・削除キーの両方がDeleteを発行するように設定していま
  す．

  この問題に対処するには，xmodmap, xkeycaps, loadkeys のどれかを用い，当
  該キーがDeleteではなくBackspaceを発行するようにすればいいのです．

  .motifbind ファイルを作るという方法もあります．詳しく
  は，VirtualBindings(3) のマニュアルページをご覧ください．

  注：*XmText.translations や *XmTextField.translationsを使って，この問
  題に対処してはいけません．この方法を使うと，Netscape Navigator の他の
  テキストフィールドキー設定が吹っ飛んでしまいます．

  (引用終り)

  5.9.  termcap と terminfo について教えてください

  バックスペース問題に悩んでいる人は多いものですが，こうした人達は
  termcap (terminfo)の端末用エントリーとにらめっこしているのです．確か
  に，ここにはバックスペースキーによって生成されるコードを記述す
  るkb(kbs)機能があります．しかしこの機能を使いこないているプログラムは
  少ないのです．個別のプログラムでだけ問題が発生するというわけではないの
  なら，間違いは至る所にはびこっているのでしょう．termcap(terminfo)のエ
  ントリーを修正するというのはもちろん正しい考え方です．以下の「TERM変
  数」の項をもお読みください．

  6.  端末文字セット

  カーネルは「端末からスクリーンシンボルへの変換テーブル」を４種類サポー
  トしています．a) Latin1 -> PC,  b) VT100 グラフィック ->  PC, c) PC ->
  PC, d) ユーザー定義の４つがそれに相当します．

  G0, G1 という二つの文字セットがあり，このうちのどちらかが「カレント文
  字セット」となります（初期設定ではG0がカレントです）．G1 をカレントに
  するには ^N を，G0 をカレントにするには ^O を押してください．

  G0, G1 という変数は変換テーブルを指定するためのものであり，ユーザーレ
  ベルで変更することができます．指定するテーブルの初期設定は G0 が a)，
  G1 が b) となっています．G0の場合，ESC ( B ，ESC ( 0 ，ESC ( U ，ESC (
  K で a,b,c,dの各テーブルを選択できます．G1の場合には，ESC ) B ，ESC )
  0 ，ESC ) U ，ESC ) K となります．

  ESC c シークエンスは端末をリセットするためのものです．スクリーン表示が
  めちゃくちゃになったような場合にご利用ください．「^V^O を使うように」
  というヒントはよく知られていますが，これはG0 がカレントの場合にしか機
  能しません．また， G0 が a)の変換テーブルを使っているという保証もどこ
  にもありません．reset(1)というプログラムを同梱しているLinux配布もあり
  ます．このプログラムは ^[c を発行するものです．termcapの端末用エント
  リーが正しい場合（:rs= というエントリーがある場合 ） (訳者 ...?)

  ユーザー定義変換テーブルを設定するには mapscrn(8)を用います． symbol
  s= map[c] という定義がある場合，c がビデオメモリに送付されます（c とい
  うシンボルが印刷可能なものである場合)．s に対応するビットマップ（文字
  ロム上にある）を変更するためにはsetfont(8)を用います．

  7.  端末の切替

  初期設定では, 端末切替は Alt-Fn or Ctrl-Alt-Fnを用いて行うようになって
  います． Xおよび最新版のdosemuではCtrl-Alt-Fn しか機能しません．

  XFree86 1.3 はXウインドーに切り替えるときにAltが押し下げられていること
  を認識しません． 従って，即座に別のVTに再度切り替えることはできないの
  です．そのためにはまず一度Altキーを離す必要があります．逆方向にも同じ
  ことが通用します．つまりカーネルは常時，すべてのキーに関してそれが押し
  下げられているか否かを監視しています．(これにも限界はあります．一部の
  キーが押し下げられたときにスキャンコードを発行しないようなキーボードが
  あるからです．FOCUS 9000 キーボートの PFnキーはその一例です．またキー
  を離したときのコードを発行しないキーボードもあります．Pauseキーをその
  ように取り扱っているキーボードは少なくありません．）

  XFree86 1.3 は起動時に文字ロムにロードしたフォントを保存し，これを切替
  えた端末用に用います．VT上におけるsetfontの結果は，Ｘに入ったり出たり
  する際に抹消されます．Xでsetfontを用いると，奇妙な結果が発生してしまう
  でしょう．

  chvtコマンドを用いるプログラムのコントロール下でなら，変更は可能です．

  7.1.  仮想端末番号の変更

  この質問はまだ繰り返し行われているようですが，「回答はもう充分に出ま
  わっています」というのが答えです．v1.1.54以降のカーネルでは，仮想端末
  番号は１６３となっています．端末をオープンすると同時に，新しい端末がつ
  くられます．端末を削除するためには disallocというユーティリティーを使
  います（ただし削除できるのは，当該端末に関連するプロセスが一つも動いて
  いない場合だけです）．

  古いカーネルをお使いの場合には，include/linux/tty.h にある次の一行を変
  更した上で（ただし，63を越える数字にはしないでください），カーネルを再
  構築してください．

       #define NR_CONSOLES     8

  MAKEDEV あるいは mknod ttyN c 4 N （N はtty番号）を用いてデバイスを作
  らなければならないかもしれません．新しいVCに getty を走らせたい場合に
  は， /etc/inittab に行を追加してください．

  端末を動的にロケートできる場合には，１２個の gettyだけを走らせておくの
  が通常最も簡単なやり方でしょう．これ以上の端末をオープンする場合に
  は，open -l -s bash で可能です．使用していない端末（プロセスと結び付け
  られていない端末）は， disalloc で取り除くことができます．

  kbd-0.90.tar.gz から取得した spwan_login をお持ちなら，

       loadkeys << EOF
       alt keycode 103 = Spawn_Console
       EOF
       spawn_login &

  を/etc/rc.localに書き込んで下さい．こうすると Alt-UpArrow でloginの
  走っている新しいVC ができ，そこに切替わるようになります． 更に
  open-1.3.tgz をもご覧ください．

  /etc/secrettyに記載されている端末にログインするにはルート権限が必要で
  す．

  8.  Ctrl-Alt-Del その他の特殊キーコンビネーション

  8.1.  Ctrl-Alt-Del (Boot)

  Ctrl-Alt-Del（あるいはloadkeysが keysymBootにアサインしたキー）を押す
  と，マシンが即座にリブートされるか（sync なしで），あるいは init に
  SIGINT が送付されるかの何れかの事態が発生します．初期設定は前者です．
  この初期設定は reboot()というシステムコールを用いて変更できますが，こ
  れにはルート権限が必要です．initが SIGINTを受け取ったとき何が起こるか
  は，init のバージョン次第です．これは多くの場合 /etc/inittab にある pf
  エントリーによって決まります（すなわち，好きなプログラムを走らせること
  ができるということです)最新カーネルの場合， Ctrl-AltGr-Del はもやは
  Boot の初期設定キーにアサインされていません．

  8.2.  その他の組み合わせ

  名称            初期設定値
  -------------------------------
  Show_Memory     Shift-Scrollock
  Show_Registers  AltGr-ScrollLock
  Show_State      Ctrl-ScrollLock
  Console_n       Alt-Fn and Ctrl-Alt-Fn  (1 <= n <= 12)
  Console_{n+12}  AltGr-Fn                (1 <= n <= 12)
  Incr_Console    Alt-RightArrow
  Decr_Console    Alt-LeftArrow
  Last_Console    Alt[Gr]-PrintScreen
  Scroll_Backward Shift-PageUp
  Scroll_Forward  Shift-PageDown
  Caps_On         トグルキー
  Compose         Ctrl-.

  8.3.  X Combinations

  Ctrl-Alt-Fn     VT nにスイッチ
  Ctrl-Alt-KP+    次のモード
  Ctrl-Alt-KP-    手前のモード
  Ctrl-Alt-Backspace       Xを停止

  マザーボードの中には, Ctrl-Alt-KP- や Ctrl-Alt-KP+ がターボボタン機能
  を果たすようになっている物もあります．上述のキーコンビネーションはそれ
  ぞれスキャンコード 1d 38 4a ca b8 9d ，1d 38 4e ce b8 9d を発行しま
  す．またいずれのキーコンビネーションも Turbo (>= 25MHz) モードと non-
  Turbo (8 or 12 MHz)の切替えを行います．（マザーボード上のジャンパーを
  適切に設定したときのみ，これらのキーコンビネーションが有効となると場合
  も多いようです．)
  Perry F Nguyen (pfnguyen@netcom22.netcom.com) 氏からは「AMI BIOS に
  は，キーボードロック機能，LEDフラッシュ機能があります．BIOS パスワード
  機能がオンになっている状態で，CMOS/BIOSパスワードを入力するまえに
  Ctrl- Alt-Backspace 押すとこの機能が使えます」との報告を頂戴しました．

  8.4.  Dosemu Combinations

  Ctrl-Alt-Fn    VT n へスイッチ(version 0.50以降，以前のバージョンでは Alt-Fn)
  Ctrl-Alt-PgDn  dosemu を停止(RAW keyboard mode時)

  (これ以外にも豊富なキーコンビネーションが用意されています．詳しくは
  dosemu 関連文書をお読みください）

  8.5.  シンボルの 生成

  複数のキーストロークからなるシンボルを作ることができます．

  LeftAlt-press を押した後に 10進数 をインプットし，更に LeftAlt- だけを
  離すと当該 10 進法コードが現すシンボルが生成されます．（Unicode モード
  の場合にも，同じメカニズムが使えますが，Unicode が採用している４ケタの
  １６進数を用いる必要があります）

  アクセントキー（デッドキー）に続けて文字キーを押すと，アクセント付きの
  文字が生成されます．この組み合わせが定義されていない場合には，アクセン
  トと文字が別々に解釈されます．どのキーをデッドキーにするかはユーザーが
  任意に決定できます．初期設定値はありません．デッドキーの上限個数は
  dead_grave, dead_acute, dead_circumflex, dead_tilde, dead_diaeresis の
  ５個，定義には loadkeys(1) を用います．アクセントによる装飾が何を意味
  するかもユーザーが自由に定義できます．デッドキー＋シンボルで生成したも
  のは，comose+ アクセントキー + symbol で作ったものとと同じです．

  o  コンビネーションシンボルは２つのシンボルの組み合わせで形成されま
     す．ユーザーはこの組み合わせを定義することができます．現在のところ
     初期設定では68種類の組み合わせが定義されています．この初期設定値
     は，"dumpkeys | grep compose" で表示されます．

  o  1.3.33 以降のカーネルには sticky modifer keys という機能がありま
     す，例えば，^C を SControl に， CとCtrl-Alt-Backspaceを SContrl,
     SAlt, Backspace として用いることができるのです．

  注：こうした組み合わせは少なくとも３通りの方法で作成できます．

  1. Linux キーボードドライバーのメカニズムを使う（loadkeys 等）

  2. X のメカニズムを使う． X386keybd(1)，更に XFree86kbd(1)を参照のこ
     と． X11R6 の場合は /usr/X11R6/lib/X11/locale/iso8859-1/Compose を
     編集する．

  3. emacs のメカニズムを使う．（"iso-insert.el"をロードする）

  X の場合，二つのシンボルの順番は恣意的になっています． Compose-, -c 及
  び， Compose-c は共に c-cedilla を生成します．Linux および emacs の場
  合には，初期設定では最初の組み合わせ法しか機能しないようになっていま
  す．Xの場合，生成する組み合わせのリストは固定されています． Linux や
  emacs はこの点，柔軟になっています．３つの初期設定リストはどれも類似し
  ていますが，細部には差異があります．

  9.  端末の様々の特性

  各キーが発行するコード及び X 非使用時の led 設定について
  は，loadkeys(1), setleds(1), setmetamode(1) のマニュアルページをご覧く
  ださい．また X 使用時については，xmodcap(1) のマニュアルページを参照し
  てください．

  前面色・背景色，スクリーンセーブ，文字リピートレートの設定については，
  setterm(1),kbdrate(8) を参照してください（非 X 環境）．X については
  xset をご覧ください．X ではキークリック，ベルの音量も設定できます．

  端末にアドレスを持つプログラムの多くは，/etc/termcap にあるエスケープ
  シークエンス定義を利用しています．新しいバージョン
  は，/usr/lib/terminfo にあります．（terminfo(5) を参照してくださ
  い．terminfo ファイルは terminfo コンパイラー /usr/lb/terminfo/tic に
  よってコンパイルされています． tic(1) をもご覧ください）

  大部分のマシンでは， /dev/device は /dev/tty0 へのシンボリックリングと
  なっています．従ってカーネルは /dev/tty0 を カレント VT と同じ意味であ
  るとみなします． XFree86 1.3 は /dev/tty0 のオーナーを変更します．終了
  後にこれをリセットすることもありません．/dev/tty0 のオーナーがかわって
  いるので dumpkey はうまく機能しないでしょう．このような場合には，ます
  最初に X を走らせてください．

  10.  raw mode からの脱出法

  K_RAW keyboard mode を使用するプログラムの中にはキーボードモードを
  K_XLATE に戻さないで終了してしまうものがあります．こうなるとなにをやる
  のも大変で，その上 Ctrl-Alt-Del まで使えなくなってしまいます．しかしな
  がらこうなっても，リセットボタンを押さずに済ませる方法が見つかることも
  あります（これは願ってもないことです．Hack ゲームをやっている途中にリ
  ブートされたのでは誰だって頭に来るし，その上システムが損傷する危険もあ
  るのですから）簡単な解決法は，他の端末あるいは他のマシンからログイン
  し，kbd_mode -a を実行することです．これは X が走っていない場合，すな
  わちディスプレーがテキストモードで bash のプロンプトがあるときのやり方
  です．以下に示す方法は，さらに使用中のキーボードが US キーボードで，割
  り込み文字が Ctrl-C ということも前提にしたものです．

  第一段階：次の手順でXを起動する．２を押し（離してはいけません），F12を
  押し（これも離してはいけません），更にその直後に = を押してください．
  これでXが起動するはずです．（解説：あるキーを押したときに発行される
  キーコードがKであるとすると，そのキーを離したときには K+128 のキーコー
  ドは発行されます．ご使用中のシェルは恐らくこうしたハイキャラクターを取
  り扱えないでしょう．従って，キーを離した時以外にはこうしたキーコードが
  発生しないようにしています．しかし，すばやくしないと，キーリピートが始
  まってしまいます．10 進法の 2 は それまでのがらくたを捨ててしまう機能
  を持つ Ctrl-C を発行します．F12 は X を， = はリターンを生成します）ご
  使用中のスクリーンはきっと灰色になっていることでしょう．これは
  .xinitrc を設定していないからです．それでも Ctrl-Alt-Fn は機能するの
  で，別の VT に切替えることは可能です．(Ctrl-Alt-Backspace も使えます
  が，X から外へ出てしまいます．つまりもとの状態に戻ってしまうのですが，
  これはお望みにならないことでしょう）

  第二段階：キーボードモードを変更する．（例えば："sleep 5; kbd_mode -a"
  で実行できます）

  第三段階：再度 X を離れる．X に戻るには Alt-Fx (Alt-F7である場合が多
  い），X から離れるには Ctrl-Alt-Backspace を用います．５秒以内に，キー
  ボードは再び使用可能な状態になるはずです．

  こうした操作の準備を整えておきたい場合には，215A301 (3シンボル）を
  kbd_mode -a のエイリアスに設定しておくとよいでしょう．こうしておけば
  F7 (3シンボル）を叩くだけで，「きれいな身体」に戻れます．
  11.  TERM 変数

  TERM 変数及び /etc/termcap, /usr/lib/terminfo/* のデータベースを用い
  て，スクリーン消去・カーソル移動時に送付る文字列を決定したり，ユーザー
  がバックスペースキー・ファンクションキー等を押したときに送付する文字列
  を決定しているプログラムは少なくありません．この値を最初に設定するのは
  カーネルの役割です（端末用）．通常，この変数は getty でリセットできま
  す．この際には，/etc/inittab 中の設定，/etc/ttytype が用いられます．
  /etc/profile に TERM 変数を設定する場合もあります．

  古いシステムは TERM=console あるいは TERM=con80x25 という設定を用いて
  います．これに対し，（ncurses 1.8.6 を使っている）新しいシステムはより
  正確に TERM=linux あるいは TERM=linux-80x25 と設定するようになっていま
  す．しかしながら，古い版の setterm は TERM=con* をチェックするように
  なっているので， TERM=linux ではうまく機能しません．

  1.3.2 以降のカーネルでは，TERM=linux がカーネルの初期設定となっていま
  す．

  Linux に対するエントリーがないtermcapを使っている場合には，端末用エン
  トリーに linux という一語を追加してください．

       console|con80x25|linux:\

  更に， make /usr/lib/terminfo/l/linux を /usr/lib/terminfo/c/console
  にコピーするか，これにシンボリックリンクを張ってください．

  11.1.  Terminfo

  ncursex 1.8.6 以降の Linux 端末用 terminfo エントリーに
  は，kich1=needed というエントリーが欠落しています．このエントリーが必
  要なプログラムもあるので，ファイルを編集し，tic でコンパイルしてくださ
  い．

  12.  他のプログラムで非 ASCII 文字を取り扱うにはどうすればいいのでしょ
  う？

  かつてはどうしようもないようなひどい時代があったものです．その頃は，プ
  ログラム一つづつに手を加えて，非アスキー文字を使えるようにしなければな
  らなかったのです．すべてが簡単になったとはいえないにしても，今ではgnu
  のユーティリティーにも LC_TYPE=iso_8859_1 や LC_TYPE=iso-8859-1という
  設定に反応するものが多くなっています．まずためしてみましょう．そしても
  しだめだったときには，以下のヒントを読んでみてください．

  何よりもまず最初に，カーネルの入力プロセスが８ビットを通すようにする必
  要があります．stty cs8 -istrip -parenb セットがあることを確認してくだ
  さい．

  A. emacs の場合：$HOME/.emacs に以下の行を追加してください．

       (standard-display-european t)
       (set-input-mode nil nil 1)
       (require 'iso-syntax)

  次の行も必要でしょう

       (load-file "iso-insert.el")
       (define-key global-map [?\C-.] 8859-1-map)

  (最後の行は xterm では機能しないでしょう．emacs -nw を使用している場合
  には，以下の行をご自分の .Xresources に追加してみてください）

       XTerm*VT100.Translations:       #override\n\
       Ctrl <KeyPress> . : string("\0308")

  B. less の場合：環境設定に LESSCHARSET=latin1 を加えてください．

  C. ls の場合： -N オプションを付けてください (エイリアスを設定するのが
  よいでしょう．

  D. bash (version 1.13.*) の場合：以下を $HOME/.inputrc に付け加えてく
  ださい．

       set meta-flag on
       set convert-meta off

  Danish HOWTOによれば

       set output-meta on

  も必要とのことです．

  E. tcsh の場合：以下の設定を行ってください．

       setenv LANG     US_en
       setenv LC_CTYPE iso_8859_1

  お使いのシステムが nls 備えているようなら，対応するルーティーンが用い
  られています．nls がないシステムの場合には，LANG や LC_CTYPE をどう設
  定しても，tcsh は iso_8559_1 が指定されているものと判断してしまいま
  す．詳しくは，tcsh(1) のマニュアルページ中の NATIVE LANGUAGE SYSTEM の
  項をお読み下さい．（Danish HOWTO には「setenv LC_CTYPE ISO-8559-1;
  stty pass8 とすればよいと記載されています）

  F. flex の場合：それを生成するパーサーが 8 ビットを処理できることがわ
  かっている場合には， -8 というオプションを付け加えてください．

  G. elm の場合：displaycharset を ISO-8859-1 に設定してください．
  (Danish HOWTO は LANG=C，LC_CTYPE=ISO-8859-1 とするように指示していま
  す)

  H. lynx のように curses を使うプログラムに関して David Sibley 氏は「通
  常の curses パッケージは，高次ビットをビデオモード用に予約しています．
  （/usr/include/curses.h にある flag _STANDOUT の定義を調べてください）
  しかし， ncusres なら8ビットをクリーンにしているようなので，iso-
  latin-8859-1 も正常に表示できます」と報告しています．

  I. man のように groff を使うプログラムの場合には， -Tascii に代えて
  -Tlatin1 をを使うようにしてください．古い版の man は col を使っていま
  す． col については 次に説明します．

  J. col の場合には，1) setlocale (LC_CTYPE,"") を行うと共に，2)
  LC_CTYPE=ISO-8859-1 を環境変数に含めるようにしてください．

  K. rlogin の場合には, -8 というオプションを指定すること．

  L. joe の場合：
  sunsite.unc.edu:/pub/Linux/apps/editors/joe-1.0.8-linux.tar.gz は，設
  定ファイ ルを編集すれば使えるそうです．/isr/lib/joerc の最初のコロンに
  -asis オプションをおけばいいという人もいます．

  M. LaTeX の場合: ocumentstyle[isolatin]{article}.  LaTeX2eの場合:
  ocumentclass{article}sepackage{isolatin} としてください．isolatin.sty
  は ftp://ftp.vlsivie.tuwien.ac.at/pub/8bit にあります．

  grasp.insa-lyon.fr:/pub/faq/fr/accents はISO-8859-1 問題，8-bit文字の
  取り扱い法を論じた文書です(ただしフランス語です)．英語で書かれたものと
  しては，
  rtfm.mit.edu:pub/usenet-bygroup/comp.answers/character-sets/iso-8859-1-faq
  があります．また別の（？）文書としては，
  ftp.vlsivie.tuwien.ac.at:/pub/8bit/FAQ-ISO-8859-1があります．

  13.  XFree86-2.1 が keymap を初期化するとき，正確にはどんなことが起
  こって いるのですか？

  バージョン 2.1 以降，XFree86 は可能な限り Linux の keymap を用いて X
  用の keymap を初期化するようになっています．とはいっても，Linux には
  キー一つあたり 16 のエントリーがあり（shift, AltGr, Ctrl, Alt の組み合
  わせ），総計 256 のエントリーがあることになるのに対し，X にはキー一つ
  あたり４つのエントリー（Shift, Mod の組み合わせ）しかありません．従っ
  て，失われてしまう情報があるのは致し方ありません．

  X はまず最初に，Xconfig というファイルを読み込みます．ここでは
  LeftAlt, RightAlt, RightCtl, ScrollLock の各キーがそれぞれ Meta,
  ModeShift, Compose, ModeLock あるいは ScrollLock として定義されている
  かもしれません．詳しくは， X386keybd(1), XFree86kbd(1) のマニュアル
  ページをお読み下さい．

  RightCtl が ModShift あるいは ModeLock と定義されていない限り，LeftAlt
  はMod となっています．RightCtl が ModShift/Modelock になっている場合に
  は，RightCtl が Mod になります．RightAlt がMod と定義されている場合
  は，RightAltがMod になります．Linux のキーが持ちうる 16 種類の意味から
  XFree86 がどの 4 種類を選択するかは，これによって決まります．注：現在
  Linux は 左右二つの Ctrl/Shift の区別をしないような初期設定を採用して
  いますが，X はそれぞれこの二つを区別しています．

  ついでカーネルの keymap を読み込み，対応する X 用設定が作成されます
  が，大抵はいいかげんなものです．"action keys"（ Show_Memory,
  Show_State, Show_Registers, Last_Console, Console_n, Scroll_Backward,
  Scroll_Forward, Caps_On，Boot）に対するビンディングは無視されます．
  デッドキー，各種ロックキー (ShiftLock を除く),  "ASCII-x" keys も同様
  に取り扱われます．

  続いて，Xconfig ファイルの定義が用いられます．（つまり，Xconfig の合成
  定義で Linux keymap の値を上書きすることになるのです）

  ファンクションキーと関連づけられた文字列はどうなるのでしょう？どうにも
  ならないというのが答えです．Xにはこうした概念がないからです．（xterm
  で機能キーに文字列を定義することは可能です．ただし，キーを最初に取得す
  るのはウインドーマネージャーだということを忘れないようにしてください）

  著者は，どういう方法でxtermが X keymapを使用するようになるのか存じませ
  ん．

  Alt キーが押されたときにはXのkeymapを使用しなければならないということ
  をxterm がどのようにして知るのかを，著者は承知していません．どうやら
  eightBitInput をチェックし,この値が真か偽かに応じて，文字の高次ビット
  をセットするか，(setmetamode(1) が端末にたいして行うように）Escape 文
  字を付け加えるかのいずれかを行っているようです．

  14.  普通とは異なるキー・キーボード

  PrintScrn/SysRq と Pause/Break の二つのキーは，それぞれキーコードが二
  つあるという点で他のキーと異なっています．前者は Alt を同時に押したと
  きにはキーコード84，それ以外の時にはキーコード99を発行します．また後者
  はCtrlと同時に押したときにはキーコード101，それ以外のときにはキーコー
  ド119となります．（従って， Alt-キーコード99やCtrl-キーコード119に機能
  を割り振っても無意味です）

  Linux のもとではキーコードを一切生成しないような特殊キーがある場合（あ
  るいは "unrecognized scancode" といったメッセージを返す場合）でも，ご
  使用中のカーネルが1.1.63以降なら，setkeycodes(1)を使ってカーネルにこう
  した特殊キーについての情報を引き渡すことができます．しかしながらXでは
  この手は通用しません． setkeycodesをもちいてキーコードを取得した後な
  ら，loadkeys を使って機能を割り振ることができます．

  15.  loadkeys や xmodmap の使用例

  キーボード上のCaps Lock と Control を交換する場合には以下のようにして
  ください．（キーマップ0-15の使用を前提としています．dumpkeys | head -1
  でチェックできます）

       % loadkeys
       keymaps 0-15
       keycode 58 = Control
       keycode 29 = Caps_Lock
       %

  X の場合だけを変更するなら：

       % xmodmap .xmodmaprc

  でOKです．  .xmodmaprc には以下の行が含まれているものとします．

       remove Lock = Caps_Lock
       remove Control =  Control_L
       keysym  Control_L  =  Caps_Lock
       keysym  Caps_Lock  = Control_L
       add Lock = Caps_Lock
       add Control = Control_L

  キーナンバーリングは一体どうなっているのでしょう？バックスペース
  はLinux においては14なのにXでは22？ナンバーはでたらめについていると考
  えておいたほうがいいでしょう．Linuxのキー番号は showkey(1)で， Xのキー
  番号は xdv(1)を使えば調べられます．Linuxのキー番号に8を加えたのが Xの
  キー番号になっていることが多いようです．

  15.1.  一本の指でしかタイプできないのですが？（同時に複数のキーを押せ
  ない のですが？）

  Shift, Ctrl, Alt の各キーをトグルキーにできるかということですね．以下
  のようにすれば可能です．

       % loadkeys
       keycode 29 = Control_Lock
       keycode 42 = Shift_Lock
       keycode 56 = Alt_Lock
       %

  これで 左 Ctrl, Shift, Altがトグルキーになります．キー番号はshowkey を
  使えば取得できます．（通常は，左右コントロール＝29,97，左右シフト
  ＝42,54，左右アルト＝54,56となっています）機能名はそれぞ
  れControl_Lock, Shift_Lock, Alt_Lock, ALtGr_Lock.です．

  "sticky" modifer keys というのは何でしょう？ これは 1.3.33 以降のカー
  ネルに取り入れた機能ですが，新しい kbd パッケージはまだ発表されていま
  せん．従って，stick modifier keys を利用するには，以下の例のように16進
  法コードを代入してやるしかありません．

       % loadkeys
       keymaps 0-15
       keycode 54 = 0x0c00
       keycode 97 = 0x0c02
       keycode 100 = 0x0c03
       %

  これで右shift・Ctrl・Altキーが各対応左キーの sticky version になりま
  す．

  16.  ビデオモードの変更

  著者が知る限り６種類の方法があります．

  1.  コンパイル 時:  /usr/src/linux/Makefile.中の以下の行を変更する．

       SVGA_MODE=      -DSVGA_MODE=NORMAL_VGA

  1A. コンパイル後: rdev -v - a を実行する．ひどいハッカー的手法ですが，
  使えます．

  2. ブート時: liloの設定ファイルに vga=ask を付け加えてください．これで
  lilo がvideo mode を問い合わせてくるようになります．適切なモードがわか
  れば， vga=mypreference をしてください．

  ３．ランタイム：A.：resizecons コマンドを使う方法．（これは極めて原始
  的な VT_RESIZE ioctl 回りのラッパーです）B.：SVGATextMode コマンドを使
  う方法（これはVT_RESIZE ioctal 回りのやや高級なラッパ鴫です）

  ４．「端末」上にいないとき：dosemuや svgalib を利用している場合には，
  端末ドライバーを操作することなくハードウェアビデオモードを変更すること
  ができます．この方法は，resizecon や SVGATextMode の設定を取得するのに
  有効な場合があります．dosemu と DOS プログラムを使って希望するビデオ
  モードに変更し，あらゆるビデオハードウェアレジスタの内容を（他のVTか
  ら）ダンプし， resizecons や SVGATextMode が必要としている初期化情報と
  して利用してください．dosemu起動時には，BIOS上のビデオモードが参照され
  るので，使えないようなビデオモードになる場合もあります．この場合に
  は，kill -9 を使ってdosemu を終了するのが最も簡単な解決法です．

  16.1.  resizecons の使い方

  svgalib を入手し，restoretextmode というプログラムをコンパイルしてくだ
  さい．使用中のマシンを可能なすべてのビデオモードでブートアップし（lilo
  の設定ファイルのvga= という行を vga=ask に設定してください），ビデオの
  ハードウェアレギスターの内容をCxR ファイル（C=桁数, R=行数．例え
  ば80x25, 132x44 )に書き込んでください．ついで，これらのファイルを
  /usr/lib/kbd/videomodes にコピーしてください．これで resizecons 132x44
  を実行すればビでオモードを変更できるようになります（SIGWINCH を必要な
  全プロセスに送付してください．別のフォントが必要な場合にはこれをロード
  してください）

  今のところ，resizecons が機能するのは新旧両コンソール用のメモリを同時
  に確保すできる場合に限られています．

  17.  キーボード リピートレートの変更法

  ブートアップ時にLinux カーネルは，リピートレートを最大に設定します．こ
  の値は，ほとんどのキーボードにとって適切な値です．しかし，これでは同じ
  文字を何回も繰り返してしまうという人もいるかもしれません．こうした場合
  には kbdrate(8)というプログラムを用いて，リピートレートを変更してくだ
  さい．この方法がうまくいかない場合に
  は，/usr/src/linux/[arch/i386/]boot/setup.S.中の以下の部分を編集・削除
  すればいいでしょう．

       ! set the keyboard repeat rate to the max

           mov     ax,#0x0305
           xor     bx,bx           ! clear bx
           int     0x16

  18.  スクリーンセーブ

  setterm -blank nn を実行すれば，nn 分不活性状態が続いた後にスクリーン
  を消すように端末ドライバーを設定できます（nn を0にすると，スクリーン
  セーブ機能はオフになります．古いカーネルの中には，次のキーボード割り込
  みが起こった後に初めて，スクリーンセーブ機能が働くようになっているもの
  もあります）

  X のスクリーンセーブを設定するためには xset(1)の s オプションを用いま
  す．

  ビデオハードウェアのパワーセービング機能をオン・オフするためには，
  setvesablankというプログラムを利用します．
  /usr/src/linux/drivers/char/vesa_blank.c冒頭のコメント部分をお読みくだ
  さい．

  19.  VT100の諸属性 - application key mode

  : 時折カーソルキーが奇妙なコードを発行するのですが？

  端末が application key mode になっている場合，カーソルキーは ESC 0 x
  を発行します．（非 application key mode 時には，ESC [ x です．いずれの
  場合にも x には A,B,C,D の一文字が代入されます）．端末を 強制的
  にapplication key mode にするプログラムもあります．こうしたプログラム
  を kill -9 で停止した場合，あるいはこれらのプログラムがクラッシュした
  場合にも，key mode もリセットされません．

       % echo -e '\033c'

  を実行すれは，カレントVCの全属性をリセットできます．アプリケーション
  モードを変更するだけでいいのなら，

                 % echo -e '\033[?1h'  (同モードをセット)

                 % echo -e '\033[?1l'  (同モードをクリアr)

  としてください．

  20.  ハードウェアの非互換性

  数人の方から「フロッピーディスクが動いているときに，タイプした文字が失
  われてしまう」という報告を頂いています．これは，Uni-486MB マザーボート
  の問題のようです．（同じ問題に遭遇しているというお便り，このマザーボー
  ドでも支障はないという報告，別のマシンでも同じ問題があるという指摘をお
  待ちしております）

  キーボードがロックするという報告が数件寄せられています．ハードディスク
  に関係している場合，他のI/Oとの相性の問題がある場合等があります．

  ulf@rio70.bln.sni.de (Ulf Tietz) 氏からは「マザーボードのチューンナッ
  プをやりすぎると，同じ様な問題が発生する．CLK, wait statements などの
  タイミング設定をすべてより穏当なものに戻すと，問題はなくなった」との報
  告がありました．

  bhogan@crl.com (Bill Hogan)氏からは「AMI BIOS を使っている場合に
  は，chipset 設定にあるGate A20エミュレーションがオンになっているかもし
  れません（このオプションが提供されている場合）．私のマシンの場合，この
  オプションをどれに設定しても（fast, both, disabled)，キーボードがロッ
  クするという問題がしばしば発生しました」との報告がありました．

  追加情報・訂正を歓迎いたします． Andries Brouwer - aeb@cwi.nl

