我知道这tput sc
会保存当前光标位置并将tput rc
其恢复到tput sc
调用时的准确位置。问题是每次tput sc
调用时,它都会覆盖先前保存的位置。
有没有办法保存更多位置,例如tput sc pos1
和,可以分别用和tput sc pos2
恢复?(解决方案不需要使用,我提到它是因为它是我所知道的唯一处理光标位置的命令)tput rc pos1
tput rc pos2
tput
如果没有,有没有办法至少保存光标位置本地在一个函数中,这样,如果一个函数使用tput sc
然后调用另一个再次运行的函数tput sc
,那么每个函数在调用时都会恢复自己保存的光标位置tput rc
?
提前致谢。
答案1
您可以使用以下函数在简单数组中提取当前光标位置:
extract_current_cursor_position () {
export $1
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
echo -en "\033[6n" > /dev/tty
IFS=';' read -r -d R -a pos
stty $oldstty
eval "$1[0]=$((${pos[0]:2} - 2))"
eval "$1[1]=$((${pos[1]} - 1))"
}
(本函数使用的代码源代码取自并改编自这个答案)
现在,例如,要保存当前光标位置pos1
,请使用:
extract_current_cursor_position pos1
要保存当前光标位置pos2
,请使用:
extract_current_cursor_position pos2
要查看pos1
和中保存的光标位置pos2
,您可以使用:
echo ${pos1[0]} ${pos1[1]}
echo ${pos2[0]} ${pos2[1]}
要移动/恢复光标位置至pos1
,您必须使用:
tput cup ${pos1[0]} ${pos1[1]}
要移动/恢复光标位置至pos2
,您必须使用:
tput cup ${pos2[0]} ${pos2[1]}
答案2
tput
命令通过终端控制序列工作,列表如下:http://sydney.edu.au/engineering/it/~tapted/ansi.html有一个用于提取当前位置的序列 (查询光标位置 - \e[6n
),但似乎它不存在于 中tput
。要提取它,请使用:
stty -echo; echo -n $'\e[6n'; read -d R x; stty echo; echo ${x#??}
30;1
现在,您可以将保存的行位置提取$x
到其他变量中,然后使用以下命令移动光标tput cup
:
$ echo $my_saved_pos
12
$ tput cup $my_saved_pos 0
答案3
tput
提到了?
,因此考虑 ANSI 代码移动代码:
$'\e[s'
- 保存当前位置$'\e[u'
- 恢复先前的位置
例子:
$ printf "\e[s\e[6CWORLD\e[uHELLO\n"
HELLO WORLD