我正在尝试创建一个基本的REPL。如果我的程序在可以支持它的终端中运行,我使用termios getchar
逐个字符地读取输入并响应特殊键,例如箭头键。但是,如果在没有意义的终端中运行,我想切换到老式的cin.getline
。
问题在于检测终端是否具有我正在寻找的能力。最初,我在想isatty
可以做到这一点。
#include <cstdio>
#include <iostream>
#include <unistd.h>
int main() {
bool tty = isatty(fileno(stdin));
std::cout << "You are using a TTY: " << std::boolalpha << tty << std::endl;
return 0;
}
这将正确识别stdin是管道或类似的情况。但是,如果我在Emacs(特别是M-x shell
)中运行子shell,它仍然标识为TTY,即使Emacs捕获了箭头键和其他特殊字符,并使用它们做了自己的事情。我可以使用哪些C ++或POSIX功能,可以正确区分在Emacs中运行的子shell和在&#34;普通&#34;内部完全控制的shell。终端
我主要在这里寻找POSIX解决方案,但仅限Windows的答案也适用于后代。
脚注:是的,我知道像ncurses这样的东西可以为我处理所有这些。我想在不使用这些库的情况下这样做,以提高我对终端环境的理解。
答案 0 :(得分:1)
这是TERM
environment variable的目的。您使用terminfo之类的(低级)库来理解TERM
的值(其含义),尽管识别Emacs的“哑”值非常容易。