题
我正在创建一个用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
----------------
我一直在寻找任何其他转义序列,当在边缘时会环绕,但没有发现。我还没有找到任何将终端模式更改为允许包装的转义序列。
那么像这样的终端导航一般是怎么处理的呢?
解决方案
该 bw
termcap终端描述中的功能表示在屏幕边缘向左移动是否会包裹到前一行。它出现在我检查过的腻子描述中(infocmp putty
在ncurses下),但在许多其他人中没有(例如不在 infocmp gnome
).
您可以尝试跟踪光标所在的列,并在要换行到前一行时使用移动控制序列。你必须知道用户屏幕的宽度,这可以通过他们设置 LINES
和 COLS
环境变量。
其他提示
如前所述, bw
能力可以解决部分问题,但很少见。特别是,它不是vt100兼容程序(如xterm)的功能。OP提到了PuTTY和gnome-terminal。后者不使用 bw
, ,因此优选不同的解决方案。
另一方面,PuTTY确实实现了vt100 光标位置报告 这是由 调整大小 当它无法使用系统调用获取屏幕保护程序时,作为回退。引用xterm的 控制序列 文件:
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
程序通过以下方式使用此
- 将光标发送到"巨大"(999x999)窗口的右下角
- 发送CPR序列
- 读取实际光标位置的报告
知道屏幕,服务器可以将光标发送到更有用的位置。
不隶属于 StackOverflow