4

tput rmcup「代替画面」(「カップモード」と呼ばれる)から戻って保存された画面を復元することは知っていますman 5 terminfoが、カーソルの位置を変更するという副作用があります。

tput smcupが呼び出された場合tput rmcup、画面を復元してカーソルの位置を変更しますが、さらにいくつかのコマンドを入力するか、Enter キーを数回押してからtput rmcup再度使用すると、カーソルは元の保存された位置に戻ります。

使用例の 1 つはbash、端末の記録を [を使用して] 再生するスクリプトscriptreplayです。スクリプトが [と同等の] 呼び出しを行わずに途中で終了した場合、スクリプトでそれを検出して自動的に呼び出すtput rmcupことができるようにしたいと考えています。bashtput rmcup

つまり、現在の画面の状態を判断できるようにしたいと考えています。つまり、「代替画面」ですか、それとも「通常画面」ですか。

4

1 に答える 1

3

xterm を使用している場合は、使用しているモードを尋ねることができます。代替画面機能は「DEC」ではなく xterm の機能ですが、設定はXTerm Control SequencesDECSETで説明されているモードとグループ化されています。

CSI ? Pm h
          DEC Private Mode Set (DECSET).
...
            Ps = 1 0 4 7  -> Use Alternate Screen Buffer, xterm.  This
          may be disabled by the titeInhibit resource.
            Ps = 1 0 4 8  -> Save cursor as in DECSC, xterm.  This may
          be disabled by the titeInhibit resource.
            Ps = 1 0 4 9  -> Save cursor as in DECSC, xterm.  After sav-
          ing the cursor, switch to the Alternate Screen Buffer, clear-
          ing it first.  This may be disabled by the titeInhibit

DECRQMコントロールを使用して、端末にクエリを実行できます。

CSI ? Ps$ p
          Request DEC private mode (DECRQM).  For VT300 and up, reply
          DECRPM is
            CSI ? Ps; Pm$ y
          where Ps is the mode number as in DECSET/DECSET, Pm is the
          mode value as in the ANSI DECRQM.

つまり、スクリプトは

printf '\033[?1049$p'

次のようなものを期待して、結果を読み返します\033[?1049;1$y

簡単なデモを次に示します。

#!/bin/sh                                                                      

unexpected() {
        result=$(echo "$check"|sed -e 's/^@/\\033/')
        printf '? unexpected reply: %s\n' "$result"
        exit 1
}

exec </dev/tty
old=`stty -g`
stty raw -echo min 0  time 5
printf '\033[?1049$p'
read status
stty $old

if [ -n "$status" ]
then
        check=$(echo "$status" |tr '\033' '@')
        if [ "$check" != "$status" ]
        then
                case "$check" in
                '@[?1049;1$y')
                        echo "alternate screen"
                        ;;
                '@[?1049;2$y')
                        echo "normal screen"
                        ;;
                *)
                        unexpected
                        ;;
                esac
        else
                unexpected
        fi
else
        echo "? no reply from terminal"
fi

もちろん、xterm を使用していない場合、マイレージは異なる場合があります...

于 2018-04-18T23:03:26.330 に答える