VT100 转义码移动光标从 C 程序中表现得很奇怪

VT100 Escape Codes to move cursor acting weird from C Program

我正在用 C 编写一个需要允许终端交互的程序。我已经尝试了好几天,试图让退格键正常工作。

在我的程序中,我轮询来自终端的输入。当我检测到输入时,我通过以下方式检查按下的键是否退格:

 if((letter == 8 || letter == 127) && cursorPosition >= 1)

cursorPosition 保存光标在终端上的当前位置。我执行此检查以确保不允许用户删除我的提示,即 >.

然后,检查通过后,我使用以下代码将光标移回并删除字符:

serial_print("3[1D");
serial_print("3[K");

serial_print 是我定义的函数,因为这段代码是我正在编写的 OS 和 运行 qemu 的一部分。我无权访问 c printf,所以我使用串行端口 input/output 连接到终端。该函数已知可以正常工作。

基本上,我的思考过程是第一行应将光标向左移动一列,第二行应清除光标右侧的所有内容。

在我在终端的行中输入 3 个或更多字符之前工作正常。

当我有一个角色时: 1 然后按退格键,我得到: </code></p> <p>我在输入两个字符时也能正常工作。但是,如果我有三个字符: <code>123 然后按三次退格键,这就是该行的样子: 123

如果我有六个字符:123456 按退格键 6 次后:123456454

我很困惑,因为终端解释转义序列的方式似乎会根据当前行中的字符数而改变。我在我的 Mac 上的 VirtualBox 中 运行ning Ubuntu 16.04 并使用 qemu 运行 OS 我正在 Ubuntu 终端中写入,如果该信息有任何不同。

有人知道是什么原因造成的吗?另外,我仍然在这里掌握窍门,所以如果您需要更多信息或者我做错了什么,请告诉我。

您可能对 'cursorPosition' 有疑问。试试这个:

if (letter == 8 || letter == 127) {
    if (cursorPosition >= 1) {
        serial_print("3[1D");
        serial_print("3[K");
        --cursorPosition;
    }
} else if (letter >= 32 && letter <= 126) {
    serial_print_char (letter);
    ++cursorPosition;
}