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

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

解决方法

在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(分隔符)参数将在char R而不是默认记录分隔符(ENTER)处进行读取停止.这将存储ESC [n; m in $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.检查wikipedia article on ANSI escape codes获取更多信息.

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

相关文章

文件查找(find) 1 find 简单的说,就是实时查找指定的内容或条件。特点:最新、最快、最准确。 用法:...
非交互式添加分区 方法一 添加/deb/sdb 下的分区,其实位置为1到1000M,第二个分区位置为1001至3000M,...
编译安装httpd 1 去官网下载源码包 为避免非法软件,一定要去官网下载http://www.apache.org httpd-2.4...
gdisk用法 gdisk - InteractiveGUIDpartitiontable (GPT) manipulator GPTfdisk (akagdisk) isatext-mo...
1 一定用快捷键 这里简单的说下几个常用的快捷按键。 1.1 移动光标快捷键 Crtl + a 光标回到命令行...
bash shell中测试命令 test命令提供了if-than语句中测试不同条件的途径。如果test命令中列出的条件成立...