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

cie*_*bor 11 linux terminal position cursor

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

Pau*_*ine 17

在ANSI兼容终端上,打印序列ESC[6n会将光标位置报告给应用程序(就像键入键盘一样)ESC[n;mR,n行在哪里是m列.

例:

~$ echo -e "\033[6n"
Run Code Online (Sandbox Code Playgroud)

编辑:

你应该确保你正在阅读键盘输入.终端只会"键入" 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
Run Code Online (Sandbox Code Playgroud)

说明:-d R(delimiter)参数将read在char处停止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";'
Run Code Online (Sandbox Code Playgroud)

例如,如果输入:

~$ echo -e "z033[6n"; cat > foo.txt
Run Code Online (Sandbox Code Playgroud)

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

~$ cat -v foo.txt
^[[47;1R
Run Code Online (Sandbox Code Playgroud)

nm值是47和1.检查对ANSI转义码Wikipedia文章以获取更多信息.

在互联网之前,在BBS的黄金时期,像我这样的老屁对这些代码玩得很开心.

  • 嗯...它总是返回我`; 1R`。 (2认同)