有没有一种ANSI控制序列可以将光标移动到行尾?

4

我知道\33[nC可以将光标向前移动n列。问题是,我不知道该行有多少个字符。

5个回答

5

虽然没有明确说明,但是屏幕比较“小”,你可以使用任何光标移动命令来移动到任意远的目的地,终端将通过屏幕大小限制移动。

例如,光标向前移动(在terminfo中,cuf)控件使用重复计数,水平位置绝对控件(在terminfo中,hpa)控件使用列值。这两个都应该适用于您:

tput cuf 999
tput hpa 999

假设你的屏幕列数不超过一千,那么有些其他命令也可以在你的终端(模拟器..)中实现,但这些命令是相当常用的。
顺便提一下,对于硬编码,`cuf` 和问题中的示例是一样的,它移动的是列而不是行。如果要移动光标的行,应该使用 `cud` 命令 (`escape> [`nB`) 。

2
没有,没有这样的ANSI控制序列。

1
如果有一个行尾,你可以用\033[s保存它。然后,在完成操作后,使用\033[u恢复位置。

没错,但是大多数终端不支持这两个转义序列。 - rido
@rido 给一个例子 - Multifix
rxvt,kvt,xiterm,Eterm和我的(xterm-256color)也不支持。可以使用'echo $TERM'或'echo $COLORTERM'来检查您的终端。请查看链接 - rido
@rido 您的终端应该接受代码,就像您链接中提到的那样,我的终端是完全与您的相同的xterm-256color,并且能够完美地工作。据我所知,xterm 是 '大多数终端' 中的一个。 - Multifix

0
如果有人遇到类似的问题,我已经成功地解决了在 \33[nC 中需要明确知道 n 的必要性,通过在程序中获取其值并使用字符串插值将变量n的值放入包含上述转义序列的字符串中来解决该问题。
然而,这不是一个通用的解决方案,因为可能有一些情况下无法轻易确定n的值。

明确地通过在我的程序中获取\33[nC的值来了解n。你能解释得更详细一些吗?我有类似的问题。是通过键盘事件还是终端缓冲区获取数字?或者有其他不同的方式吗? - rido
我不记得具体的问题了,已经过去了好几年。但在我的情况下,我能够通过程序的内部功能确定每行的长度。我将这个值存储在一个变量中,并在我的代码中使用类似于 "\33[${myVariable}C" 的方式。希望这有所帮助。 - bart2287

0
你可以使用ANSI命令\33[1000C来将光标向右移动1,000列。如果没有1,000列,它会停留在行尾而不会换行。这是一种有点粗暴但非常有效且易于操作的方法,适用于我目前的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接