我知道我可以使用tput sc
保存位置,但我怎样才能读取变量的位置?我需要行数。我不想使用curses / ncurses。
答案 0 :(得分:16)
在ANSI兼容终端上,打印序列ESC[6n
会将光标位置报告给应用程序(就像在键盘上键入的那样)ESC[n;mR
,其中n
是行和{ {1}}是列。
示例:
m
编辑:
您应确保正在阅读键盘输入。终端将仅“键入”~$ echo -e "\033[6n"
序列(无ENTER键)。在ESC[n;mR
中,您可以使用以下内容:
bash
说明:echo -ne "\033[6n" # ask the terminal for the position
read -s -d\[ garbage # discard the first part of the response
read -s -d R foo # store the position in bash variable 'foo'
echo -n "Current position: "
echo "$foo" # print the position
(分隔符)参数将使-d R
停在char read
而不是默认记录分隔符(R
)。这会将ENTER
存储在ESC[n;m
中。剪切使用$foo
作为分隔符并选择第二个字段,让[
(行;列)。
我不知道其他的贝壳。你最好的镜头是Perl,Python或其他东西。在Perl中,您可以从以下(未经测试的)代码段开始:
n;m
例如,如果您输入:
~$ perl -e '$/ = "R";' -e 'print "\033[6n";my $x=<STDIN>;my($n, $m)=$x=~m/(\d+)\;(\d+)/;print "Current position: $m, $n\n";'
按[ENTER]几次,然后按[CRTL] + [D]。然后尝试:
~$ echo -e "z033[6n"; cat > foo.txt
~$ cat -v foo.txt
^[[47;1R
和n
值为47和1.有关详细信息,请查看wikipedia article on ANSI escape codes。
在互联网之前,在BBS的黄金时期,像我这样的老屁对这些代码玩得很开心。