【问题标题】:Detecting whether I can capture arrow keys via stdin检测我是否可以通过标准输入捕获箭头键
【发布时间】:2018-05-07 18:43:46
【问题描述】:

我正在尝试创建一个基本的 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;
}

这将正确识别标准输入是管道或类似的情况。但是,如果我在 Emacs 中运行一个子 shell(特别是 M-x shell),它仍然会识别为 TTY,即使 Emacs 捕获箭头键和其他特殊字符并用它们做自己的事情。我可以使用哪些 C++ 或 POSIX 功能来正确区分在 Emacs 中运行的子 shell 和在“普通”终端中完全控制运行的 shell?

我主要在这里寻找 POSIX 解决方案,但仅限 Windows 的答案对后代也很有用。


脚注:是的,我知道像 ncurses 这样的东西可以为我处理所有这些。我想在不使用此类库的情况下执行此操作,以提高我对终端环境的理解。

【问题讨论】:

    标签: c++ emacs posix tty


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多