次のページ 前のページ 目次へ

  The Linux Keyboard HOWTO
  Andries Brouwer, aeb@cwi.nl
  v2.1, 8 November 1995

日本語訳:佐藤亮一(GFG02131@niftyserve.or.jp)

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

  1.  役にたつプログラム

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

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

  util-linux-2.5 内容: setterm, kbdrate

  shellutils-1.8 (stty.tar.gz) 内容: stty

  open-1.1.tgz 内容: open. (dynamic-vc-1.1.tar.gz)

  SVGATextMode-0.9.tar.gz 内容: SVGATextMode

  The X distribution 内容: xmodmap, xset, kbd_mode.  (X386keybd(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.  Console generalities

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

  4.  端末のリセット

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

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

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

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

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

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

       % setfont

を実行してください(初期設定フォントを初期設定位置に置いておくことが必要で
す).
旧型の端末の場合,タブを含む出力が遅れることがあります,このような場合には,
以下のようにして下さい.(詳しくは,stty(1)のマニュアルページを参照のこと)

       % stty tab3

reseizecons や SVGATextModeを用いれば,ビデオモードを変更することもできます.
これは通常,出力側の設定に変更を加えるものです.入力側にはいろいろ問題がある
ことでしょう.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 で定義するようになっています).こうした
プログラムは,消去文字の設定に影響されません.


  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)を発行するようになって
いないのですか?

  (i) VT100 端末では,Delete key が Enter key の上にあるからです.

  (ii) 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.

.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 で作った
ものとと同じです.

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

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

注:こうした組み合わせは少なくとも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およびemamcの場合には,初期設
定では最初の組み合わせ法しか機能しないようになっています.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

次のページ 前のページ 目次へ