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

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変数」の項をもお読みください.


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