在 bash 终端中保存更多 corsor 位置(使用 tput?)

在 bash 终端中保存更多 corsor 位置(使用 tput?)

我知道这tput sc会保存当前光标位置并将tput rc其恢复到tput sc调用时的准确位置。问题是每次tput sc调用时,它都会覆盖先前保存的位置。

有没有办法保存更多位置,例如tput sc pos1和,可以分别用和tput sc pos2恢复?(解决方案不需要使用,我提到它是因为它是我所知道的唯一处理光标位置的命令)tput rc pos1tput rc pos2tput

如果没有,有没有办法至少保存光标位置本地在一个函数中,这样,如果一个函数使用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

相关内容