画面を消去せずにリセットコマンドで入力設定をリセットする方法はありますか?

画面を消去せずにリセットコマンドで入力設定をリセットする方法はありますか?

私のアプリケーションに問題があります。 Dosemu2が-dumb -td -ktモードになっていて、MATE端末ウィンドウをめちゃくちゃにしています。 (MATE端末ウィンドウから直接またはその間にGNU画面を使用します。)killall -v dosemu.binsignal()を使用してアプリケーションを終了またはクラッシュした後、このウィンドウで実行され続けるbashシェルはMATE端末に多くのテキストデータを受け取ります。ウィンドウはマウスカーソル移動データを受け取ります。

コマンドを実行し、reset時にはtset。常にマウス入力をリセットしますが、避けたい画面も常に消去されます。画面が消去されず、マウス入力の問題が解決されませんでした。tsetresetreset -I

reset表示される画面領域を消去せずにマウス入力を無効にする方法はありますか?

私は以前Dosemu2ディスカッションでこの問題について次のように書きました。https://github.com/dosemu2/dosemu2/discussions/2061

下の画像は、テキストとして入力された最後のマウスデータを示しています。

osemu2を終了すると、ターミナルウィンドウはテキスト形式でマウス移動データを受け取ります。

答え1

このresetコマンドはのショートカットですtput reset。このコマンドのドキュメントには次のように記載されています。

reset[...]存在する場合、端末のリセット文字列が出力されます(rs1、、、、)。リセット文字列はありませんが、初期化文字列がある場合は、初期化文字列が出力されます。それ以外の場合、リセットはinitと同じ効果を持ちます。rs2rs3rf

したがって、さまざまなモードで端末を切り替えるために実際に端末に送信されるコマンドの順序を調べるには、およびの設定を確認する必要がありますresetrs1rs2rs3rf

この時点で、、、、およびその代わりに画面が消去されずに問題を解決していることを確認resetできます。tput rs1tput rs2tput rs3tput rf

しかし、ダイビングを続けてください。man terminfoドキュメントには簡単に次のように記載されています。

reset_1string        rs1        r1         reset string
reset_2string        rs2        r2         reset string
reset_3string        rs3        r3         reset string
reset_file           rf         rf         name of reset file

これは、terminfoデータベースに直接復元する必要があることを意味します。

infocmp | grep -Po '\w+=[^,]*' | grep -E '^(rs[123]|rf)='

私にとって、これは2つの項目を返します。

rs1=\Ec
rs2=\E[!p\E[?3;4l\E[4l\E>

\Eこれは表現で直接読み取ることができ、シーケンスEscapeで書き直すことができます。printf

printf '\ec'
printf '\e[!p'; printf '\e[?3;4l'; printf '\e[4l'; printf '\e>'

エスケープシーケンスが実際に何を意味するのかを理解するのは、おそらくこの回答の範囲外ですが、以下はいくつかあります。

ESC c          # Reset and clear screen
ESC [!p
ESC [?e;4l
ESC [4l
ESC >

最後に、以下があることに注目する価値があります。最近送信されましたdosemu必要なリセットを直接行ってください。

# disable xterm mouse tracking
printf '\033[?1006l\033[?1003l\033[?1002l\033[?1000l\033[?9l'
# disable xterm cursor keys
printf '\033[?1l'

つまり

ESC [?1006l ESC [?1003l ESC [?1002l ESC [?1001l ESC ?9l
ESC [?1l

関連情報