2009年01月24日

TeraTermのバグ?

先日、久々にTeraTermのバージョンを上げて、せっかくなんでと壁紙何枚か作成して見た目も入れ替えて自己満足に浸っていたところ、一台のサーバで時々描画が反映されないという状態に陥りました。

まぁ、ウィンドウをドラッグするなど強制的に再描画してやると改善するので最新版のバグかなぁと思って居たのですが、4.61になっても一向に改善する気配がないため、これはおかしいと調査開始。

で、色々試していると、どうやらscreenを利用した場合に発生するようで、さらに追求しているとTab補完に失敗した場合などBellがなるはずのタイミング以降再描画されないと言うことに気が付く。

ただ、そこまではすぐわかったのですが、その後がさっぱりわからず。

何せ、teraterm側でeterm風味を外せば全く再現しませんし、色々試した結果、背景画像さえ無ければeterm風味でも問題ない模様。

さらに背景画像を読ませているプラグインの問題かとおもいSusieプラグインをいろいろと差し替えても結局再現。

で、画像側の問題かと思い、画像をいくら差し替えてもダメ。

teraterm側のBeepや画面表示周りの設定も色々触ってみたのですが、若干の変化はあっても根本的な解決にはならず。

そこで、利用しているshellのせいかと思いtcshからbashに変えてみたり「tcsh -f」で起動してみたりしてもダメ。

それで困り果てていたところ、

でデバッグが出来そうだったので、早速実行。

その結果「^[[?5h^[[?5l」というエスケープシーケンスが悪さをしていることが判明。

$00 - $1F ^@ - ^_を表示
$20 - $7E そのまま文字として表示
$7F     <DEL>を表示
$80 - $FF 最上位 bit を0にして、$00-$7Fと同じ規則で
      文字に変換し、反転文字として表示。
この表やこの辺を参照して調べたところ「<Esc> [?5h <Esc> [?5l」に相当するらしいですが、
上記サイトによるとやっていることは「カーソルを画面に表示させない→カーソルを画面に表示させる」と言うだけのことらしいです。

ただ、これでダメになる原因はわからず、また、問題の無いサーバでは「^G」が戻ってきていたので、その差がどこから来ているのか調べたところ


  • 5. ビープ音を視覚化する

    termcap ファイルに vb 機能のエントリーがまだ定義されていない場合は、自分でエントリを追加することができます。これは Dennis Henriksen(duke@diku.dk) からの提案なのですが、以下の行を termcap ファイルのlinux エントリ内に書き込むことで、vb 機能が利用可能になります (古いディストリビューションでは、この linux エントリが console という名前になっているので、注意してください)。

    :vb=\E7\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E8:\

    行末のバックスラッシュは、データベース内での改行をエスケープするためのものです。上記 Dennis のコードは、(彼の言によると)次の機能を持つそうです。

    ・ (安全策として)カーソル位置を保存する

    ・ 背景色と対になる色を使って、背景を数回点滅させる

    ・ カーソル位置を元に戻す

これか!!

どうやら「/etc/termcap」やら「/usr/lib/terminfo」でVisible bell設定がされている場合、確実に再現するようです。
(screenをやっても問題の無いサーバではscreenのデフォルト設定がvbell offになっていました)

ただ、壁紙自体は以前から使っていたので、臭いのが

この変更。

まぁ、壁紙使わなければ良いだけの話ですし、使っていてもVirualBell設定が有効にならないようにすればいいだけの話ですが、バグちっくなので直して欲しいなぁと思いつつ、自分の環境の問題の可能性もあるので、他の環境で検証取れるまでバグ報告はちょっと待とうと思います。

Posted by Takuchan at 2009年01月24日 23:49 | トラックバック(0)