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. 役にたつプログラム

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

3. 端末のあらまし

4. 端末のリセット

5. Delete と Backspace

6. 端末文字セット

7. 端末の切替

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

9. 端末の様々の特性

10. raw mode からの脱出法

11. TERM 変数

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

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

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

15. loadkeys や xmodmap の使用例

16. ビデオモードの変更

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

18. スクリーンセーブ

19. VT100の諸属性 - application key mode

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


1. 役にたつプログラム

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

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

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

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

(例:あるキーを押した時に,キーボードがスキャンコード 0x1e, 0x9e を生成した場合を考えてみましょう.このコードはキーコード 30,158 に変換 されます.ついでこれは 0141, すなわち ASCII あるいはlatin-1 コード 'a'に置き 換えられます.削除キーを押し,再びこれをはなすと,キーボード はスキャンコー ド 0xe0 0x53 0xe0 0xd3 を生成し, これはキーコード 111,239 に変換され,ついで ESC [ 3   という4文字からなる文字列に置き換えられます.この二例は いずれも,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 の2文字を端末に送付しています.変ったフォントをロードして いて,初期設定のフォントに戻したい場合には,

% setfont

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

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

% stty tab3

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

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

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

キーボードの中にはリマッピング機能を内蔵しているものもあります.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 で定義するようになっています).こうした プログラムは,消去文字の設定に影響されません.

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

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

一度目と二度目で,ログインの挙動が異なるのですが?

最初のログイン時には,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
%

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

  1. VT100 端末では,Delete key が Enter key の上にあるからです.
  2. Linus 氏がこの設定を選択したからです.

5.3 X で 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. 端末文字セット

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

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に入ったり出たりする際に抹消 されます.Xでsetfontを用いると,奇妙な結果が発生してしまうでしょう.

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

7.1 仮想端末番号の変更

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

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

#define NR_CONSOLES     8

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

端末を動的にロケートできる場合には,1−2個の 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 が採用している4ケタの16進数を用いる 必要があります)

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

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

  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 はこの点, 柔軟になっています.3つの初期設定リストはどれも類似していますが, 細部には差異があります.

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を起動する.2を押し(離してはいけません),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 を用います.5秒以内に,キーボードは再び 使用可能な状態になるはずです.

こうした操作の準備を整えておきたい場合には,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という設定に反応するものが多く なっています.まずためしてみましょう.そしてもしだめだったときには,以下のヒ ントを読んでみてください.

何よりもまず最初に,カーネルの入力プロセスが8ビットを通すようにする必要があ ります.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 にはキー一つあたり4つの エントリー(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. ビデオモードの変更

著者が知る限り6種類の方法があります.

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

SVGA_MODE=      -DSVGA_MODE=NORMAL_VGA

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

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

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

4.「端末」上にいないとき: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