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;
}
我正在用 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;
}