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 使用時 など).またキーボードドライバーは,キーが押されたか・はなされたかに応 じ, スキャンコードの流れをキーコードにパースする機能をも果たしていま す(キーを一つ押す毎に,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 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)を発行するように なっていない のですか? 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\ osfDelete: delete-previous-character() *XmTextField.translations: #override\n\ 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以降のカーネルでは,仮想端末 番号は163となっています.端末をオープンすると同時に,新しい端末がつ くられます.端末を削除するためには disallocというユーティリティーを使 います(ただし削除できるのは,当該端末に関連するプロセスが一つも動いて いない場合だけです). 古いカーネルをお使いの場合には,include/linux/tty.h にある次の一行を変 更した上で(ただし,63を越える数字にはしないでください),カーネルを再 構築してください. #define NR_CONSOLES 8 MAKEDEV あるいは mknod ttyN c 4 N (N はtty番号)を用いてデバイスを作 らなければならないかもしれません.新しいVCに getty を走らせたい場合に は, /etc/inittab に行を追加してください. 端末を動的にロケートできる場合には,12個の 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 で作ったものとと同じです. o コンビネーションシンボルは2つのシンボルの組み合わせで形成されま す.ユーザーはこの組み合わせを定義することができます.現在のところ 初期設定では68種類の組み合わせが定義されています.この初期設定値 は,"dumpkeys | grep compose" で表示されます. o 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 および 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 . : 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