像Emacs和Nano这样的程序如何在终端中运行而无需用户按Enter的情况下获得用户输入?

时间:2018-08-15 18:14:36

标签: emacs terminal termios

像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等其他平台上执行此操作的问题。 (我确定使用这些操作系统的人也在想如何做到这一点。)

1 个答案:

答案 0 :(得分:3)

这些程序将终端设置为 raw 模式,而不是 cooked 模式。每次读取 Cooked 模式并由终端驱动程序处理,而 raw 模式则一次读取一个字符并由运行的程序处理。

This Answer有更多信息。

This Repo是一个简单的项目,实现了您可以学习的这种模式。 man termios还将为您提供有关操作终端模式的信息。