VT100转义序列:光标移动环绕到行尾

时间:2014-07-30 13:41:11

标签: telnet vt100

我正在创建一个由VT100转义序列控制的Telnet CLI应用程序。所以对于向左导航光标< ESC> [D转义序列从Telnet服务器发送到客户端,可能是Putty或Gnome-terminal。不幸的是,对于长于Putty行长度的行,上面的转义序列将不允许将光标导航到当前行上方的行。

一个例子。光标是'|'。评论标有“//”

----------------
>potato| // Now I press left arrow which sends esc sequence to application
----------------
>potat|o // Works as expected. The cursor moved left
----------------

另一个例子

----------------
>potatopotatopot // This is a long command which goes over two lines
|ato             // Now I press left arrow which sends esc sequence to application
----------------
>potatopotatopot // The cursor didn't move, since the escape sequence 
|ato             // does nothing if the cursor is at the edge
----------------

我一直在寻找任何其他的转义序列,它会在边缘处环绕,但却找不到。我没有找到任何将终端模式更改为允许换行的转义序列。

那么这样的终端导航如何处理呢?

2 个答案:

答案 0 :(得分:1)

如上所述,bw能力可以解决部分问题,但这种情况很少见。特别是,它不是vt100兼容程序(例如xterm)的功能。 OP提到了PuTTY和gnome-terminal。后者不使用bw,因此首选不同的解决方案。

另一方面,PuTTY确实实现了vt100 游标位置报告,当resize无法使用系统调用获取屏幕大小时,它被用作回退。引自xterm的control sequences文档:

CSI Ps n  Device Status Report (DSR).
            Ps = 5  -> Status Report.
          Result (``OK'') is CSI 0 n
            Ps = 6  -> Report Cursor Position (CPR) [row;column].
          Result is CSI r ; c R

resize程序使用此功能

  • 将光标发送到"巨大"的右下角。 (999 by 999)窗口
  • 发送CPR序列
  • 阅读实际光标位置的报告

了解屏幕大小,服务器可以将光标发送到更有用的位置。

答案 1 :(得分:0)

termcap终端描述中的bw功能表示在屏幕边缘向左移动是否包裹到上一行。它出现在我检查过的PuTTy描述中(infocmp putty在ncurses下),但在许多其他人中没有(例如不在infocmp gnome中)。

您可以尝试跟踪光标所在的列,并在想要回绕到上一行时使用移动控制序列。您必须知道用户屏幕的宽度,可以通过设置LINESCOLS环境变量来完成。