如何更改termios配置,以便当用户按键时getc()立即返回?

我想为CLI应用程序实现自动完成function。 只有在输入以下字符列表时,才会返回getc()的默认行为:NEW_LINE或EOF。 我想将TAB添加到此列表中,以便我可以触发自动完成算法。

有没有办法做到这一点,例如,使用termios? editline库(http://www.thrysoee.dk/editline/)可以做到,但我无法想象它是怎么做的?

在第二版“UNIX环境下的高级编程”中,终端IO的处理大约需要40页…快速地,您可以将eol和eol2(termios.c_cc [EOL]和termios.c_cc [EOL2])字符设置为有其他字符表现得像\ n。

你甚至可以用stty来试试这个

$ cat - abc\tdef abc\tdef ^d $stty eol ^i abc\tabc\tdef def ^d 

如何在程序中执行此操作的示例(在实践中,不要忘记error handling并在结束时恢复原始状态,暂停时,发出信号时等等…这就是为什么使用打包库来执行此操作更好,有很多细节可以用于强大的应用程序)。

 struct termios term; tcgetattr(STDIN_FILENO, &term); term.c_cc[EOL] = '\t'; tcsetattr(STDION_FILENO, TCSAFLUSH, &term); 

最简单的方法,根本不需要tcsetattr()tcgetattr() ,是使用cbreak()将终端置于“cbreak”模式,该模式不缓冲或处理控制字符,然后使用nocbreak()当你完成重置它。

cbreak的手册页记录了各种相关function,包括raw()noecho() ,您可以使用它们来控制终端而无需完全理解termios。

如果你想要更好的控制,你需要直接使用termios。 我不久前写了一篇博文 ,应该让你开始。

你应该使用gnu readline而不是用getc()来杀死你自己;;)