QEMUは私の端末を変な状態にしておきました。tput smam
ついに問題の正確な関数であるvsまでデバッグするのに時間がかかりましたtput rmam
。
現在の端末状態を確認し、すべての機能の現在値を一度に表示する方法はありますか?
これにより、動作中の端末と「壊れた」端末を簡単に区別して、何が修正されたかを把握できます。
smam
しかし対。対。などの特定の機能の現在の状態を把握するのも良いスタートrmam
です。
Ubuntu 19.10、Gnome端末でテストされました。
答え1
これは機能します(VTEはこの制御の一部を実装します)。
DECプライベートモード(DECRQM)を要求します。 VT300以上の場合、DECRPMに対する応答は次のとおりです。
犯罪現場調査?PS;午後$y
ここで、PsはDECSET / DECSETのモード番号、PmはANSI DECRQMのモード値です。
具体的には、PS7である:
Ps = 7 ⇒ Auto-wrap Mode (DECAWM), VT100.
これは、以下で使用される設定に対応します。端末の説明:
rmam=\E[?7l,
smam=\E[?7h,
だから...あなたはします
printf '\033[?7$p'
そして戻ってくるのを楽しみにしています。
\033[?7;1$y
または
\033[?7;2$y
モードが設定されているかリセットされているかによって異なります。
これはまた、スクリプト/プログラムが読んでいると仮定します。端末(不要標準入力)。いくつかあります。テスト/デモスクリプトxtermのリソースに役立つ資料を見つけることができます(ほとんどのリソースはVTEには適用されません)。通常、私はこの機能をテストします。テスト、使用するすべてのシステムに合わせてパッケージ化されています。
答え2
到着再充填する Thomas Dickieの便利な答え、POSIX規格に準拠するために必要なすべての重要な情報を提供します。便利機能 tmode
、便利なコマンドで修正されましたモスビー次のコメント:
端末モード番号が与えられたら、モードの状態を反映するために'SET'
orを印刷します。'RESET'
# Get status of the DECAWM (autowrap) mode
$ tmode 7
RESET
指示:
誰でもこれについてより多くの情報を得ることができる場合は、コメントを残してください。
機能以下にのみ適用されます。確認する端末エミュレータ、特にいいえGNOME端末から:
- macOS:、
iTerm2.app
しかし組み込まれていないTerminal.app
- Ubuntu:
XTerm
とUXTerm
、標準GnomeではないTerminal
- Windows(WSL):いいえ以前のコンソールウィンドウまたはWindows端末ではサポートされていません。
- macOS:、
再支援モード番号:
これconsole_codes(4) Linux
man
ページ一部「DEC特殊モード(DECSET/DECRST)シーケンス」1、3、5..9、25、1000のみが記載されています。存在する実践、上記の端末エミュレーションは、次の意味のある値を返します。
iTerm2.app
macOS:1..3、5..8、25、40..41、45、47、69、1000[U]XTerm
Ubuntu:1..7、9、12、18..19、25、30、35、38、40..42、44..45、47、66..67、69、80、95、1000
まだ残っていて、数字ではないモデルリンクされたページで言及されてい
man
ます(例:()と=
()) - クエリする方法がわかりません。DECPAM
>
DECPNM
しかし、トーマスディッキーリンクDECプライベートモードエスケープシーケンスの説明では、戻り値が
0
不明なモードおよび3
/4
または「永久設定/リセット」を示すことに言及しています。実際、これは4
未知のモード、既知のモードのみを報告します1
(「設定」、つまりオン)、または2
(「リセット」、つまり終了)。
シェル機能tmode
:
#! /bin/sh -
tmode() (
[ "$#" -eq 1 ] || { echo "Usage: tmode <mode-number>" >&2; return 2; }
modeNum="$1"
# Redirect stdin and stdout temporarily to the controlling terminal.
# This is necessary so that invocation such as `result=$(tmode 1)` work.
{
stty_settings="$(stty -g)"
stty -icanon -echo min 0 time 5
# Query the terminal.
printf '\33[?%s$p' "$modeNum"
result=$(dd count=1)
stty "$stty_settings"
} <> /dev/tty >&0 2> /dev/null
# Activate this to visiualize the raw result.
# printf %s "$result" | od -t x1 -t c > /dev/tty
# Print a friendly result.
case $result in
*';1$'*)
echo SET;;
*';2$'*)
echo RESET;;
# NOTE: It seems that 4 is only ever used to signal a nonexistent mode.
# *';3$'*)
# echo PERMANENTLY SET;;
# *';4$'*)
# echo PERMANENTLY RESET;;
*)
echo "Unknown mode: $modeNum" >&2;;
esac
)
答え3
設定モード
ESC [Ⓝh
ESC [?
モードリセット // 設定解除
ESC [ Ⓝ l
ESC [ ?
リクエストモード//クエリステータス
ESC [ Ⓝ $p
ESC [ ?
Ⓝは10進数(モード)です。
シェルでテスト
#set
echo -ne '\e[?1049h'
#query = set
echo -ne '\e[?1049$p'; cat
^[[?1049;1$y
#reset
echo -ne '\e[?1049l'
#query = not set
echo -ne '\e[?1049$p'; cat
^[[?1049;2$y
参考資料
xterm ドキュメント: DECRQM DECRQM
https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#:~:text=DECRQM
注:Chromeアクセスを使用すると、スクロールしてウェブページのキーワードを強調表示できます。
制御シーケンス
https://terminalguide.namepad.de/seq/
パターンリスト
https://terminalguide.namepad.de/mode/
設定モード
https://terminalguide.namepad.de/seq/csi_sh/
https://terminalguide.namepad.de/seq/csi_sh__p/
リクエスト方法
https://terminalguide.namepad.de/seq/csi_sp_t_dollar/
https://terminalguide.namepad.de/seq/csi_sp__p_t_dollar/
vt100 ドキュメント
https://vt100.net/docs/vt510-rm/DECRQM.html
https://vt100.net/docs/vt510-rm/DECRPM.html
https://vt100.net/docs/vt220-rm/chapter4.html#S4.6