像Emacs和Nano这样的程序在终端窗口中运行时如何从用户那里获得实时输入?如果您运行:
emacs -nw
(-nw用法表示没有窗口,即它在终端中打开,而不是像Web浏览器那样在新窗口中打开)。在终端中,然后emacs在该终端窗口中打开。通过使用箭头键移动光标,您可以将鼠标悬停在程序中的蓝色“链接”上,按Enter,然后Emacs将带您到其他页面。 (就像帮助手册的不同部分一样)Emacs如何知道用户的光标何时悬停在链接之一上,并且用户按下Enter键?
此外,如果在终端窗口中运行nano(通过在终端中键入Nano,然后输入),nano可以实时获取用户输入。 (例如,您使用Control + O来写出一个文件,但是您不必像随后使用std :: cin一样按Enter键。)
这是我的问题:这些程序如何以这种方式获取输入,我自己该怎么做?我假设他们正在使用某种bash命令,但是呢?有没有办法可以将这种类型的输入与C ++程序接口?
我的目标平台是Mac OSX Version 10.13.5(我正在运行的版本),但也欢迎回答如何在Windows或linux等其他平台上执行此操作的问题。 (我确定使用这些操作系统的人也在想如何做到这一点。)
答案 0 :(得分:3)
这些程序将终端设置为 raw 模式,而不是 cooked 模式。每次读取 Cooked 模式并由终端驱动程序处理,而 raw 模式则一次读取一个字符并由运行的程序处理。
This Answer有更多信息。
This Repo是一个简单的项目,实现了您可以学习的这种模式。 man termios
还将为您提供有关操作终端模式的信息。