虽然我知道tput rmcup
从"替代屏幕返回&#34}; (称为"杯模式"在man 5 terminfo
中)并恢复保存的屏幕,它确实具有重新定位光标的副作用。
因此,如果tput smcup
被调用,tput rmcup
将恢复屏幕并重新定位光标,但是如果您再键入一些命令或按几次输入,然后再次使用tput rmcup
,光标返回原始保存位置。
一个用例在bash
脚本中重放终端录音[使用scriptreplay
]:如果脚本过早结束而没有[相当于]调用tput rmcup
那么我就是#39} ; d希望能够在我的bash
脚本中检测到该内容并自动致电tput rmcup
。
简而言之,我希望能够确定当前屏幕状态是什么;即,它是"备用屏幕"或者是#34;正常屏幕"?
答案 0 :(得分:1)
如果您正在使用xterm,那么您可以询问它使用的是什么模式。虽然备用屏幕功能是xterm功能而不是“DEC”,但该设置与 XTerm控制序列中描述的 DECSET
模式分组:
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,您的里程可能会有所不同......