【发布时间】:2022-01-28 15:25:40
【问题描述】:
我有以下代码:
int setmode(int vtime, int vmin, int echo, int sigint)
{
termios attr;
tcgetattr(STDIN_FILENO, &attr);
attr.c_lflag &= ~ICANON;
if (echo)
attr.c_lflag |= ECHO;
else
attr.c_lflag &= ~ECHO;
if (sigint)
attr.c_lflag |= ISIG;
else
attr.c_lflag &= ~ISIG;
attr.c_cc[VMIN] = vmin;
attr.c_cc[VTIME] = vtime;
tcsetattr(STDIN_FILENO, TCSAFLUSH, &attr);
return 0;
}
int main()
{
setmode(0, 1, false, true);
while (true)
{
char c;
read(0, &c, 1);
cout << c;
fflush(stdout);
}
return 0;
}
这会正确地回显键(在删除 cout << c; 时会停止回显,因此我认为读取工作正确且 c 包含正确的字符)。现在我想测试是否按下了某些特定的键,例如箭头、回车或退格键。对于键,我尝试过类似
if (c == '\[A') cout << "smth";
而不是cout << c;,但这什么也没打印。同样从 infocmp 我发现箭头键具有以下 esc 序列:
kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA 并对其进行了测试,但均无效。那么在这段代码中,我如何测试箭头、回车、退格、一些 F 键?
另外,是否可以将 setmode 的 if-else 语句简化为单个位表达式赋值?
【问题讨论】:
标签: c++ linux terminal escaping