以下のコマンドを実行してください.
% stty erase ^?
文字は消去されていいるものの,挙動がおかしいというばあいには,tty の設定に何 か間違いがあります.echoprt をセットしている場合には,消去された文字は \fR と / に挟まれています.echoe をセットしていない場合には,消去した文字がエコーバ ックされます(# のような印刷可能文字の場合にはこれが理に適ったやり方です). 大部分のユーザーは stty echoe -echport にしたいと考えるでしょう. stty sane とすれば,これ以上のことが実現できます.現在の設定状況を確認するには stty -a を実行してください.
ちゃんとした getty を使っていれば,初期設定のままでうまくいくはずです.
独自のキービンディングを行うプログラムが多い(bash, emacs etc.) ことに注意し てください( /.inputrc, /.emacs etc で定義するようになっています).こうした プログラムは,消去文字の設定に影響されません.
かつては,DEL(177)を押すと BS Space BS (10 40 10) を端末ドライバーが発行して いました.しかし現在では DEL を無視するようになっています(ドライバーが vt100 をエミュレートするようになって以来こうなっています).DEL を出力しない, 優れた getty を入手してください.
最初のログイン時には,getty を用います.これに対し,二回目のログイン時には, 全く別のプログラムである login が起動されます.挙動が異なるのはそのためです.
端末上では,より正確にいうとすれば,(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
%
% xmodmap -e "keysym BackSpace = Delete" -e "keysym Delete = BackSpace"
Backspace が ^H(backspace) を発行するようにしたいだけなら
% xmodmap -e "keycode 22 = BackSpace"
Deletekey が Delete を発行するようにしたいだけなら
% xmodmap -e "keycode 107 = Delete"
を実行してください.
(しかしながら普通は,交換済みの状態が初期設定値になっていま.)
.emacs ファイルに以下のような行を付け加えてください.
(global-set-key "\?" 'delete-backward-char)
(global-set-key "\C-h" 'help-command)
もちろん同じようにして,別のキーを別のコマンドに結合することも可能です.
.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)
.kermrc ファイルに以下の行を付け加えてください.
set key \127 \8
set key \8 \127
通常,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 という一行があることを前提として います)
以下の行を,$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 の他のテキスト フィールドキー設定が吹っ飛んでしまいます.
(引用終り)
バックスペース問題に悩んでいる人は多いものですが,こうした人達は termcap (terminfo)の端末用エントリーとにらめっこしているのです.確かに,ここにはバッ クスペースキーによって生成されるコードを記述するkb(kbs)機能があります.しか しこの機能を使いこないているプログラムは少ないのです.個別のプログラムでだけ 問題が発生するというわけではないのなら,間違いは至る所にはびこっているのでし ょう.termcap(terminfo)のエントリーを修正するというのはもちろん正しい考え方 です.以下の「TERM変数」の項をもお読みください.