7

我试图确定系统如何将字符打印到标准输入——也就是说,它如何打印用户可以删除的字符,以及如果用户点击“Enter”,哪些字符被视为输入。

我碰巧在使用 C,但如果解决方案依赖于语言,我会感到非常惊讶。

感谢您的任何见解!: D

4

4 回答 4

5

正如 iny 所说,bash 使用 readline 作为输入。源代码可在此处获得,并且有一个名为 complete.c 的文件。

要回答您的问题,我认为它们实际上并未打印到标准输入中。Readline 包含用户正在编辑的行内容的某种缓冲区,完成打印到此。当用户按下回车键时,缓冲区的内容被发送到任何程序想要读取一行,并且在 bash 的情况下,传递到标准输入。(Readline 不这样做 - 使用 readline 的其他程序可能只是将值存储到字符串中以供以后使用。)

于 2009-10-07T17:59:21.317 回答
4

有几个人指出 bash 使用 readline,这是真的,但我认为您真正要问的是它如何能够在您按 Enter 之前查看您输入的内容。

答案是 ttys(即:终端)可以切换到“原始模式”,终端的输入处理被禁用,然后你会看到每个输入的字符。这也会禁用输入字符的自动回显。

有关更多信息,请参阅有关从文件或终端读取单个字符的指南。

于 2009-10-07T18:05:15.563 回答
1

这是一个通过 readline 实现制表符完成的 C 代码片段:

http://github.com/rupa/el

于 2009-10-08T08:51:42.220 回答
1

它使用 readline 库来处理输入,readline 提供历史记录和完成。

要实际实现完成,需要访问键盘输入处理。完成必须能够修改它使用的缓冲区。之后,它只是查看当前输入并检查找到了哪些完成。实际的完成逻辑可以以多种方式工作。

于 2009-10-07T17:51:29.620 回答