FC2ブログ

PCで: screenでdeleteが^Hになる件

 私は、90年代初頭からUNIXでscreenというツールを愛用しています。
 これは何かというと?
 UNIXなんで、端末の中で動かすプログラムが多いわけですよね。で、そういうプログラムは、キーボードからの入力が端末からプログラムへ、プログラムの出力が端末へ、という感じで、端末と結びついているわけです。
 screenは、これを仲介してくれるプログラムなんです。

 何が便利かというと、普通なら端末に結びついているプログラムを、端末から切り離してつなぎなおすことが出来るんですね。
 例えば、ある部屋に置いてある端末でやっていた作業を、ネットでつながった別の部屋で継続するとか。screenの中でエディタとか動かしていて、その続きを別のマシンでやりたいときとか、切り離して(detach)別のマシンにつなぎなおす(attach)という感じでできるわけです。
 もしくは、仕事終わって帰るときにdetachして翌日attachして続きを、とか、時間のかかるプログラムをscreenの中で動かす、とか。
 あとは、ネットの先のマシンを使ってる場合、普通なら、ネットが切れたらプログラムは強制終了しちゃったりするわけです。でもscreenを使ってれば、attachしなおすことで解決。
 こんな風に、とても便利なんですよね。実際には、ここに書いたことの他にも便利な機能が沢山あります。

 そのscreenですが、最近、使ってるマシンの環境を変えたら困ったことが起き始めました。
 deleteキーを押すと、どういうわけか^?(DEL, \177)でなく^H(BS, \010)が入るようになってしまったのです。
 Emacs使いの人ならわかるでしょうが、DELコードを入力できないと非常に不便なのです。

 ところで、ちょっと話がそれますが。
 以前Debian GNU/Linuxが、まことにBRAIN DAMAGEDなことに、BSキーを押すとDELを生成するようにデフォルト設定を変えたことがありました。Emacsとか、どうすればいいんですか!
 私は、カーソルの左の文字を消すとき、BSキーまで手をやるのが面倒なので、Control-Hを押します。しかし、それさえもがDELになってしまうんですね。もう、アホかと。
 screenも例外ではなく、仕方がないので、~/.screenrcにこんな記述を加えました。
bindkey -k kb stuff "\010"

 閑話休題。
 今回のはこれとはちょっと違いました。screenの設定を色々いじったのですが、どうもうまく行かない。
 そこで、ちょっと動きを整理してみました。キーボードで何かを打ったとき、screenの中で動いているプログラムにどのように文字が送られるか。
 こんな風になっています。
キーボード
 ↓文字列
screen(外)が、文字列からどのキーが押されたか識別
screen(中)が、押されたキーから文字列を生成
 ↓文字列
プログラム
 なんでこんなややこしいことをしているかというと、detachしてattachしたとき、同じ種類の端末につながれる保証がないからですね。
 私は、Emacsを使うときに便利なように、deleteキーで^?(DEL, \177)を送るようにしているのですが、それがどういうわけか、^Hになってしまうわけです。上の流れに当てはめるとこんな感じ。
キーボード
 ↓^?
screen(外)が、^?からBSキーが押されたと判断(*)
screen(中)が、押されたBSから^Hを生成
 ↓^H
プログラム
 要するに、(*)が問題なわけです。
 で、ソースとか見たけどどうもそこの問題ではない。うーん。
 と、はたと思いつきました。
$ infocmp xterm
# Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm
...
kPRV=\E[5;2~, kRIT=\E[1;2C, kb2=\EOE, kbs=\177, kcbt=\E[Z,
...
kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~,
...
 ……kbs(BSキー)に、\177を対応させている!
 つまり、最近の環境の変更で、TERM=xtermになったわけですが、terminfoのxtermがこういう風に設定されているために、上の(*)のところでscreenは、「\177が来たな。これはBSキーが押されたらしい」と判断してしまったわけです。
 で、上記のように私が~/.screenrcにkb(BSキー)で^Hを生成するよう設定してあったため、deleteで^Hが送られる、ということになったわけでした。

 というわけで、こういう風に対処しました。
$ infocmp xterm > /tmp/x
(/tmp/xを編集。kbs=^H, ついでにkdch1=\177)
$ mkdir ~/.terminfo
$ tic -o ~/.terminfo /tmp/x
 これで、見事解決しました!
 ちなみに、~/.screenrcにこう書いてもできます。というか、この方がエレガントかな。
termcapinfo xterm bs=^H:kD=\177

tag : GNU screen

コメント

非公開コメント

プロフィール

水響俊二

Author:水響俊二
水響 俊二 [MIZUKI Shunji]

暫定的に、18禁作品の感想などは裏サイトで書いています。
   

最新記事
最新コメント
カテゴリ
検索フォーム
リンク
RSSリンクの表示
月別アーカイブ
アクセス解析中