检测我是否可以通过标准输入捕获箭头键

时间:2018-05-07 18:43:47

标签: c++ emacs posix tty

我正在尝试创建一个基本的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这样的东西可以为我处理所有这些。我想在不使用这些库的情况下这样做,以提高我对终端环境的理解。

1 个答案:

答案 0 :(得分:1)

这是TERM environment variable的目的。您使用terminfo之类的(低级)库来理解TERM的值(其含义),尽管识别Emacs的“哑”值非常容易。