Ticket #47524

Tera Term5: GNU screen で選択範囲の反転表示が消えずに残る

Open Date: 2023-03-04 19:21 Last Update: 2023-04-26 20:52

Reporter:
Owner:
Status:
Closed
Component:
MileStone:
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
Fixed
File:
None
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Details

Tera Term5 ですが、GNU screen で .screenrc に下記設定を入れて Ctrl-L で画面をクリアした際、 選択範囲の反転表示状態が消えずに残るようです。 (クリックによる選択解除では反転表示が消えます)

$HOME/.screenrc

hardstatus alwayslastline "status"

同一条件(同じ teraterm.ini)で Tera Term4 では Ctrl-L の画面クリアで反転状態がクリアされました。

TeraTerm の設定で見直すべき場所はありますでしょうか?

確認した環境は下記になります。

  • Tera Term
    • Version 4.106 (SVN# 9298)
    • Version 5.0 (SVN# 9864) (teraterm-5.0-alpha1.zip)
  • GNU Screen
    • screen 4.09.00 (GNU) 30-Jan-22 (Arch Linux)
    • screen 4.08.00 (GNU) 05-Feb-20 (Debian)
  • OS
    • Arch Linux (2023-03-04 時点の最新版)
    • Debian GNU/Linux 11 (bullseye)
Tera Termscreen無しscreen(hardstatusなし)screen(hardstatus alwayslastline)
ver4C-lで選択範囲クリアC-lで選択範囲クリアC-lで選択範囲クリア
ver5C-lで選択範囲クリアC-lで選択範囲クリアC-lで選択範囲が消えない

Ticket History (3/18 Histories)

2023-03-04 19:21 Updated by: k9i404
  • New Ticket "Tera Term5: GNU screen で選択範囲の反転表示が消えずに残る" created
2023-03-04 20:08 Updated by: k9i404
Comment

再現方法についての補足です。 Ctrl-Lでクリアすると、表示文字と一緒に選択範囲の反転状態は一時的に消えますが、反転していた場所に文字を表示させるとその場所の文字表示が反転した状態になっているように見えます。

2023-03-04 20:22 Updated by: nmaya
  • Milestone Update from (None) to Tera Term 5.0
  • Component Update from (None) to Tera Term
2023-03-12 00:43 Updated by: zmatsuo
Comment

ありがとうございます。

現象を確認しました。 調査します。

2023-03-12 00:44 Updated by: zmatsuo
  • Owner Update from (None) to zmatsuo
2023-03-12 10:32 Updated by: doda
Comment

この問題は

  • マウス選択領域へ文字が出力された時の動作
  • 制御シーケンスでのマウス選択領域の扱い
  • ED 2(画面全体消去)の動作

に分けられます。

マウス選択領域へ文字が出力された時の動作

画面を消去してからカーソル位置より下の部分をマウスで選択した後、ls等のコマンドを実行してマウスで選択した領域に文字が出力されるようにします。

その時の動作が

  • Tera Term 4: 出力された部分が反転しない状態となる
  • Tera Term 5: 出力された部分が反転したままとなる (正確には元の反転状態に関係なく反転した文字が出力される)

となっています。4と5で動作が変わったのはこの部分のみです。

Tera Term 4では出力された部分は反転されなくなりますが、内部的にはマウスで選択されたままである為

  • Alt+Cを押すと上書きされて反転していない部分も含めてクリップボードにコピーされる
  • VTウィンドウを最小化した後に復元するなどで画面の再描画を行わせると、反転されていなかった部分が反転された状態に戻る

というような事が起きます。

この部分に関しては、個人的には Tera Term 5 の動作の方が一貫性が有っていいと思います。

制御シーケンスでのマウス選択領域の扱い

ED(画面消去)やEL(行消去)等の制御シーケンスの効果がマウス選択領域にかかった場合、Tera Term 4, 5共にマウス選択されているという状態が無視される(EDの場合選択が解除されたように見える)という動作になります。

しかし内部的には選択されたままである為、一つ目の問題でのTera Term 4の動作と同じような事が発生します。

hardstatusを表示している時の動作は、この問題で一時的に反転表示が解除された後に一つ目の問題で反転表示が復活している為に起きています。

一つ目の問題で現在のTera Term 5の動作を採用した場合、一貫性の観点からはこちらの動作を変更した方がよいように思います。

ED 2(画面全体消去)の動作

最後に、screen無しやhardstatus無しの場合に起きない(マウス選択が消えたように見える)理由についてです。

bashやzsh等は、Control-Lが押された時に ED 2(画面全体消去)制御シーケンスを使って表示を消しています。

Tera TermではED 2が送られて来た時、実際には画面を消去せず、画面の行数分のスクロールを発生させて表示内容をすべてスクロールアウトさせる事によって消去を行っています。

これは消去された内容をスクロールバックで容易に確認できるようにする為です。

ED 2でスクロールが発生した時、選択領域もスクロールアウトされる為、選択が解除されたように見えています。 (実際にはスクロールアウトされた部分が選択されている事がスクロールバックで確認できる)

screen無しやhardstatus無しの場合はシェルが送ったED 2がそのままTera Termまで届きます。

一方、hardstatusを表示している場合、ED 2ではhardstatusも一緒に消されてしまう為そのまま使う事が出来ません。

そこでscreenではhardstatusを表示している時にED 2を受け取った場合、各行に対するEL(行消去)に変換してTera Termへ送ります。

その為、Tera Term側ではスクロールアウトを使わずに消去を行うので前述の現象が発生します。

このED 2での動作に関しては特に変更する必要は無いと思います。

2023-03-13 00:56 Updated by: zmatsuo
  • Status Update from Open to Closed
Comment

ありがとうございます。

EL(行消去)時の描画を修正しました。

従来、マウス選択領域を無視して背景を描画していましたが、 修正後は、マウス選択領域を考慮した描画になります。

修正したものを置きました。

https://osdn.net/projects/ttssh2/storage/snapshot/teraterm-5.0-dev-r10637-20230313-zmatsuo.zip

試してみてください。

つぎの2つはまだ修正していなくて、 マウス選択領域を無視して背景を描画します。

  • ED 0(カーソル位置から画面末尾までを消去する)
  • ED 1(画面先頭からカーソル位置までを消去する)
2023-03-13 00:57 Updated by: zmatsuo
  • Status Update from Closed to Open
2023-03-13 02:04 Updated by: k9i404
Comment

横から失礼します。

teraterm-5.0-dev-r10637-20230313_003314-masaaki-snapshot.zip (Version 5.0 dev (SVN# 10637)) で試してみたところ、下記のようになりました。

C-l の反転表示自体行われなくなったが消去されなくなったように見えます。。

Tera Termscreen無しscreen(hardstatusなし)screen(hardstatus alwayslastline)
ver4.106 (SVN# 9298)C-lで選択範囲クリアC-lで選択範囲クリアC-lで選択範囲クリア
ver5 beta1 (SVN# 10612)C-lで選択範囲クリアC-lで選択範囲クリアC-lで選択範囲が一時的に消え、文字再出力で反転表示が復活
ver5 dev (SVN# 10637)C-lで選択範囲クリアC-lで選択範囲クリアC-lで選択範囲が消えず、文字再出力後も反転表示のまま
(Edited, 2023-03-13 11:15 Updated by: k9i404)
2023-03-14 00:08 Updated by: zmatsuo
Comment

5 dev (SVN# 10637)の反転表示は意図したとおりです。 動作(表示)がなんだかしっくりこない感はあるかも知れないですね。

従来(Tera Term 4)からの動作そのままで、表示を正しくした、 dodaさんのおっしゃるように一貫性はある、と私は感じています。

選択領域の設定と、キャンセル(選択領域をなくす)方法をわかっている分をまとめてみました。

Tera Term 4, 5 の場合

https://ttssh2.osdn.jp/manual/5/ja/usage/mouse.html

  • 選択
    • マウス左ボタン+ドラッグ(or ダブルクリック or トリプルクリック)
    • Tera Term 4:画面消去で選択表示がなくなる(表示上は消えているが、選択範囲は残っている,)
    • Tera Term 5(rev10637):選択領域はそのまま(反転表示されたまま)
      • ED 2(画面全体消去)時、スクロールアウトするため選択領域がなくなっているように見える(*注)
  • キャンセル
    • マウス左ボタンクリック

コマンドプロンプト(Windows10,11),Windows ターミナルの場合

  • 選択中
    • マウスで左ボタン+ドラッグ(or ダブルクリック)
  • 選択確定&終了
    • Enter押下

Putty

  • 選択
    • マウス左ボタン+ドラッグ(or ダブルクリック or トリプルクリック)
  • キャンセル
    • マウスクリック
    • 選択領域に文字が出力されたとき
      • ED 2でクリアされたときもキャンセルされる(表示はスクロールアウト)

*注

screen + ステータスライン表示時は、bashなどのC-Lの出力シーケンスが異なる

  • ステータス行を表示していないとき
    • ED 2(画面全体消去)
  • DECSSDT 2(ステータス行を表示している)とき
    • 各行でEL(行消去)を行う

Puttyの動作がわかりやすい感じもしますね。

(Edited, 2023-03-14 00:59 Updated by: zmatsuo)
2023-03-15 23:47 Updated by: k9i404
  • Status Update from Open to Closed
Comment

ご説明ありがとうございます。下記のように理解しました。

  • Tera Term 本来の(一貫性のある)挙動
    • ED(画面消去)
      • 表示領域をスクロールアウトさせる
        • スクロールバックで内容確認を容易にするため
      • 選択範囲はキャンセルしない
        • スクロールバックエリアに選択範囲が保存されている
    • EL(行消去)
      • 各行で文字を消去する
      • 選択範囲はキャンセルしない

Tera Term の 4, 5 alpha1, 5 beta1 は本来の挙動ではなく、5 dev (SVN# 10637) が本来の挙動。

クローズさせていただきます。

(Edited, 2023-03-16 22:37 Updated by: k9i404)
2023-03-17 08:22 Updated by: nmaya
Comment

確認です。

TODO

ED 0(カーソル位置から画面末尾までを消去する)

ED 1(画面先頭からカーソル位置までを消去する)

この修正を入れる予定はありますか?

4-stable へのバックポート

r10637 の修正(と上の修正)を 4-stable へバックポートしますか?

2023-03-18 00:03 Updated by: zmatsuo
  • Status Update from Closed to Open
Comment

わかったものはすべて修正してtrunkに入れました。r10639です。

バイナリを置きました。

https://osdn.net/projects/ttssh2/storage/snapshot/teraterm-5.0-dev-r10640-20230317-appveyor.zip

再度オープンに戻しますね。問題があったら教えてください。

マウスで選択領域を作っておいて echo でシーケンスを出力してテストしました。

  • EL カーソル行の文字を消去 ((40,1)へ移動して0=後ろ,1=前,2=行すべて を消去)
    • echo -e "\x1b#8\x1b[1;40H\x1b[0K"
    • echo -e "\x1b#8\x1b[1;40H\x1b[1K"
    • echo -e "\x1b#8\x1b[1;40H\x1b[2K"
  • ECH カーソル位置から Ps 文字を消す
    • echo -e "\x1b#8\x1b[12;40H[ HERE ]\x1b[10X"
  • ED 1 (画面先頭からカーソル位置までを消去する)
    • echo -e "\x1b#8\x1b[12;40H[ HERE ]\x1b[1J"
  • ED 2 (全画面消去) 従来通り
    • echo -e "\x1b#8\x1b[2J\x1b[1;1H"
    • スクロールアウトする

4-stableへのバックポートですが、 4と5でソース的にはそんなに変わっていないところのはずなので 簡単に持っていけるのではないかという考えと、 ずっと気づかれなかったことなのでそっとしておいてもいいのではという考えがあります。

多少おいておいて、不具合の指摘がなければ始めましょうか。

2023-04-09 07:17 Updated by: nmaya
Comment

TODO

  • trunk
  • 4-stable
    • バックポートしないなら、「対応しないことにした」記録がここに残されていれば構いません
      • 5の変更履歴にあり、4の変更履歴にないことの根拠として
2023-04-16 02:43 Updated by: zmatsuo
Comment

4-stable に修正を入れました。r10677です。

trunkと同等の修正に加えて、全角(2cell)文字を考慮しました。

trunkでは気にかけていなかったので動作をチェック/修正を行います。

2023-04-17 01:21 Updated by: zmatsuo
Comment

trunkに修正を入れました。r10678です。

全角文字が消えるとき、描画が正しく行われていなかったのを修正しました。

https://osdn.net/projects/ttssh2/storage/snapshot/teraterm-5.0-dev-r10680-20230416-appveyor.zip

(修正をバタバタしてしまってスナップショットはr10680から作っています)

次の点が気になりました。 こうするべきというのがわかったときチケットを切ればいいかなと思います。

  • 全角(2cell)より大きな文字のときどうするか
  • 消去はスペース(0x20)で埋めるが、背景色はどうなるのが妥当か?

2,3日様子を見て不具合など出なければ、このチケットはクローズしようと思います。

2023-04-21 22:07 Updated by: zmatsuo
  • Status Update from Open to Closed
  • Resolution Update from None to Fixed
2023-04-26 20:52 Updated by: nmaya
Comment

現在リポジトリブラウザが見られないが、コミット漏れはなさそう。

  • trunk
    • r10637
      • EL(行消去)時の描画を修正
    • r10639
      • ED0, ED1 の修正
    • r10678
      • 全角(2cell)文字を考慮
    • r10681
      • 変更履歴
  • 4-stable
    • r10677
      • EL(行消去)時の描画を修正
      • ED0, ED1 の修正
      • 変更履歴
      • 全角(2cell)文字を考慮

Attachment File List

No attachments

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login