我知道我可以使用 保存位置tput sc
,但是如何将它的位置读取到变量中?我需要行数。我不想使用curses/ncurses。
问问题
25642 次
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
n
和m
值为 47 和 1。有关更多信息,请查看有关 ANSI 转义码的维基百科文章。
在没有上网之前,在BBS的黄金时期,像我这样的老屁用这些代码玩得很开心。
于 2011-12-02T07:54:57.173 回答