16

我知道我可以使用 保存位置tput sc,但是如何将它的位置读取到变量中?我需要行数。我不想使用curses/ncurses。

4

1 回答 1

23

在 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(delimiter) 参数将read停止在字符R而不是默认记录分隔符 ( ENTER) 处。这将存储ESC[n;m$foo. 剪切[用作分隔符并选择第二个字段,让n;m(行;列)。

我不知道其他贝壳。你最好的选择是一些 Perl、Python 或其他东西的单行器。在 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的黄金时期,像我这样的老屁用这些代码玩得很开心。

于 2011-12-02T07:54:57.173 回答