如何在终端中获取光标位置?

时间:2011-12-01 14:50:59

标签: linux terminal cursor position

我知道我可以使用tput sc保存位置,但我怎样才能读取变量的位置?我需要行数。我不想使用curses / ncurses。

1 个答案:

答案 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的黄金时期,像我这样的老屁对这些代码玩得很开心。