如何获取terminal中的光标位置?

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

Solutions Collecting From Web of "如何获取terminal中的光标位置?"

在兼容ANSI的终端上,打印ESC[6n的顺序将把光标位置报告给应用程序(就像在键盘上输入一样) ESC[n;mR ,其中n是行, m是列。

例:

 ~$ echo -e "\033[6n" 

编辑:

你应该确保你正在阅读键盘输入。 终端将只键入ESC[n;mR序列(无ENTER键)。 在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 (分隔符)参数将使read停止在char R而不是默认的记录分隔符( ENTER )。 这会将ESC[n;m存储在$foo 。 剪切使用[作为分隔符,并选择第二个字段,让n;m (行;列)。

我不知道其他的炮弹。 你最好的办法是在Perl,Python或其他东西的一些oneliner。 在Perl中,您可以从以下(未经测试)代码片段开始:

 ~$ perl -e '$/ = "R";' -e 'print "\033[6n";my $x=<STDIN>;my($n, $m)=$x=~m/(\d+)\;(\d+)/;print "Current position: $m, $n\n";' 

例如,如果您输入:

 ~$ echo -e "z033[6n"; cat > foo.txt 

按[ENTER]几次,然后按[CRTL] + [D]。 然后尝试:

 ~$ cat -v foo.txt ^[[47;1R 

nm值分别为47和1.查看维基百科有关ANSI转义码的文章以获取更多信息。

在互联网之前,在BBS的黄金时代,像我这样的老屁对这些代码有很多乐趣。