【发布时间】:2017-09-02 22:13:27
【问题描述】:
我想在命令行应用程序上自动完成,但就像在 bash 中一样,您可以使用 tab 键来完成命令。但是 getchar() 似乎要等到收到换行符后才开始读取任何字符。
scanf 似乎以同样的方式工作。
有什么方法可以一次扫描一个字符,无论它们是空白字符还是控制字符?
我希望能够在输入构建命令时逐个字符地读取字符,然后在收到选项卡字符后,我将尝试在我的应用程序中查找如何完成和打印完整命令。
【问题讨论】:
-
看过其他 C 程序是如何做到这一点的?从工作代码中复制通常是个好主意;这就是 FOSS 的意义所在(而 bash,例如 FOSS,但我认为 bash 在其自动补全方面有点难以理解)
-
如果你真的不能使用别人的作品,你就必须调整终端属性来使用'non-canonical'模式。在规范模式下,在用户点击返回(或使用 control-D (EOF) 键)之前,不会向程序发送任何输入。请参阅Canonical vs non-canonical terminal input 了解更多信息。而且您必须确保在程序退出之前恢复终端属性 - 并且可能在您的命令行应用程序也运行任何其他程序时。这都是艰苦的工作;用别人的努力代替。
-
这个问题不是 *nix 特有的,MSVC 有自己的
getch或_getch,在每次按键时都会返回(尽管您应该检查按下非键入键时会发生什么,例如 PageUp)。您可以在提交阻塞函数之前使用kbhit或_kbhit进行轮询。 -
你可以看看Tab completion feature in Unix shell development,但那里的答案不如这里的好(他们只列出了 GNU Readline)。
标签: c command-line